/// 作者:陈希章 ///
///
//创建一个新的Socket,这里我们使用最常用的基于TCP的Stream Socket(流式套接字)
var socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
//将该socket绑定到主机上面的某个端口 //方法参考:
http://msdn.microsoft.com/zh-cn/library/system.net.sockets.socket.bind.aspx
socket.Bind(new IPEndPoint(IPAddress.Any, 4530));
//启动监听,并且设置一个最大的队列长度 //方法参考:
http://msdn.microsoft.com/zh-cn/library/system.net.sockets.socket.listen(v=VS.100).aspx socket.Listen(4);
//开始接受客户端连接请求 //方法参考:
http://msdn.microsoft.com/zh-cn/library/system.net.sockets.socket.beginaccept.aspx
socket.BeginAccept(new AsyncCallback((ar) => {
//这就是客户端的Socket实例,我们后续可以将其保存起来 var client = socket.EndAccept(ar);
//给客户端发送一个欢迎消息
client.Send(Encoding.Unicode.GetBytes(\I accept you request at \+DateTime.Now.ToString()));
//实现每隔两秒钟给服务器发一个消息 //这里我们使用了一个定时器
var timer = new System.Timers.Timer(); timer.Interval = 2000D; timer.Enabled = true;
timer.Elapsed += (o, a) => {
//检测客户端Socket的状态
if(client.Connected) {
try {
client.Send(Encoding.Unicode.GetBytes(\ + DateTime.Now.ToString())); }
catch(SocketException ex) {
Console.WriteLine(ex.Message); } } else {
timer.Stop();
timer.Enabled = false; Console.WriteLine(\is disconnected, the timer is stop.\); } };
timer.Start();
//接收客户端的消息(这个和在客户端实现的方式是一样的)
client.BeginReceive(buffer,0,buffer.Length,SocketFlags.None,new AsyncCallback(ReceiveMessage),client);
}), null);
Console.WriteLine(\); Console.Read(); }
static byte[] buffer = new byte[1024];
public static void ReceiveMessage(IAsyncResult ar) {
try {
var socket = ar.AsyncState as Socket;
//方法参考:
http://msdn.microsoft.com/zh-cn/library/system.net.sockets.socket.endreceive.aspx
var length = socket.EndReceive(ar); //读取出来消息内容 var message = Encoding.Unicode.GetString(buffer, 0, length);
//显示消息
Console.WriteLine(message);
//接收下一个消息(因为这是一个递归的调用,所以这样就可以一直接收消息了)
socket.BeginReceive(buffer, 0, buffer.Length, SocketFlags.None, new AsyncCallback(ReceiveMessage), socket); }
catch(Exception ex){
Console.WriteLine(ex.Message); } } } }
可以看出来,为了让服务器可以接受消息,其实并不需要什么特别的设计,与客户端接受消息其实可以是一样的
再来看看客户端的修改
using System;
using System.Collections.Generic; using System.Linq; using System.Text;
//导入的命名空间
using System.Net.Sockets;
namespace SocketClient {
class Program {
///
/// Socket Server 演示 /// 作者:陈希章 ///
///
//创建一个Socket
var socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
//连接到指定服务器的指定端口 //方法参考:
http://msdn.microsoft.com/zh-cn/library/system.net.sockets.socket.connect.aspx
socket.Connect(\, 4530);
Console.WriteLine(\);
//实现接受消息的方法
//方法参考:
http://msdn.microsoft.com/zh-cn/library/system.net.sockets.socket.beginreceive.aspx
socket.BeginReceive(buffer, 0, buffer.Length,
SocketFlags.None, new AsyncCallback(ReceiveMessage), socket);
//接受用户输入,将消息发送给服务器端 while(true) {
var message = \ + Console.ReadLine();
var outputBuffer = Encoding.Unicode.GetBytes(message);
socket.BeginSend(outputBuffer, 0, outputBuffer.Length, SocketFlags.None, null, null); }
}
static byte[] buffer = new byte[1024];
public static void ReceiveMessage(IAsyncResult ar) {
try {
var socket = ar.AsyncState as Socket;
//方法参考:
http://msdn.microsoft.com/zh-cn/library/system.net.sockets.socket.endreceive.aspx
var length = socket.EndReceive(ar); //读取出来消息内容 var message = Encoding.Unicode.GetString(buffer, 0, length);
//显示消息
Console.WriteLine(message);
//接收下一个消息(因为这是一个递归的调用,所以这样就可以一直接收消息了)
socket.BeginReceive(buffer, 0, buffer.Length, SocketFlags.None, new AsyncCallback(ReceiveMessage), socket); }
catch(Exception ex) {
Console.WriteLine(ex.Message); } } } }
我在这里做了一个死循环,用户可以不断地输入,这些消息会被发送给服务器。如下图所示