System.Net.Socket 异步实现

来源:互联网 发布:美联储加息概率数据 编辑:程序博客网 时间:2024/05/29 03:15

TCPServer

1、使用的通讯通道:socket
2、用到的基本功能:
Bind, Listen,BeginAccept,EndAccept,BeginReceive,EndReceive
3、函数参数说明
Socket listener = new Socket(AddressFamily.InterNetwork,SocketType.Stream, ProtocolType.Tcp);
新建socket所使用的参数均为系统预定义的量,直接选取使用。

listener.Bind(localEndPoint);
localEndPoint 表示一个定义完整的终端,包括IP和端口信息。
new IPEndPoint(IPAddress,port)
IPAdress.Parse("192.168.1.3")
listener.Listen(100);

监听
listener.BeginAccept(new AsyncCallback(AcceptCallback),listener);
AsyncCallback(AcceptCallback),一旦连接上后的回调函数为AcceptCallback。当系统调用这个函数时,自动赋予的输入参数为IAsyncResoult类型变量ar。
listener,连接行为的容器。
Socket handler = listener.EndAccept(ar);
完成连接,返回此时的socket通道。
handler.BeginReceive(state.buffer, 0, StateObject.BufferSize, 0,new AsyncCallback(ReadCallback), state);
接收的字节,0,字节长度,0,接收时调用的回调函数,接收行为的容器。

 

 using System; using System.Collections.Generic; using System.Text; using System.Net; using System.Net.Sockets; using System.Threading; using System.IO;  namespace CSocketServer {     public class SocketObject     {         public Socket CSocket = null;         public const int BufferSize = 8;         public byte[] Buffer = new byte[BufferSize];         public StringBuilder DataBuilder = new StringBuilder();     }      class Program     {         static void Main(string[] args)         {             Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);              IPEndPoint point = new IPEndPoint(IPAddress.Any, 55000);              socket.Bind(point);             socket.Listen(100);              Console.WriteLine("Waiting For Client Connect...");              socket.BeginAccept(new AsyncCallback(AcceptCallBack), socket);             Console.Read();         }          static void AcceptCallBack(IAsyncResult ar)         {             Socket socket = (Socket)ar.AsyncState;             Socket handler = socket.EndAccept(ar);             socket.BeginAccept(new AsyncCallback(AcceptCallBack), socket);             SocketObject obj = new SocketObject();             obj.CSocket = handler;             handler.BeginReceive(obj.Buffer, 0, SocketObject.BufferSize, SocketFlags.None,                 new AsyncCallback(ReceiveCallBack), obj);         }          static void ReceiveCallBack(IAsyncResult ar)         {             SocketObject obj = (SocketObject)ar.AsyncState;             Socket socket = obj.CSocket;              int bytesRead = socket.EndReceive(ar);             string data = string.Empty;             if (bytesRead > 0)             {                 obj.DataBuilder.Append(Encoding.Default.GetString(obj.Buffer, 0, bytesRead));                  socket.BeginReceive(obj.Buffer, 0, SocketObject.BufferSize, SocketFlags.None,                     new AsyncCallback(ReceiveCallBack), obj);             }             else             {                 File.WriteAllText(string.Format(@"D:\{0}.txt", DateTime.Now.ToString("MMddHHmmssfff")), obj.DataBuilder.ToString());                // Console.WriteLine(obj.DataBuilder.ToString());                 Console.WriteLine("Received {0} Bytes Data...", Encoding.Default.GetBytes(obj.DataBuilder.ToString()).Length);             }          }     } }

原创粉丝点击