现在的位置: 首页 > 综合 > 正文

System.Net.Socket 异步实现

2013年09月02日 ⁄ 综合 ⁄ 共 2393字 ⁄ 字号 评论关闭

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);
             }
 
         }
     }
 }

抱歉!评论已关闭.