C# Socket异步通信

本文介绍了C#中使用Socket进行异步通信的方法,涵盖了服务器端的关键步骤,包括使用Bind、Listen、BeginAccept、EndAccept、BeginReceive、EndReceive等函数。通过IPEndPoint指定本地端点,并设置监听回调函数AcceptCallback。接收数据时,利用AsyncState属性从输入参数获取Socket,以实现数据的读取、存储和发送。文章还提到了程序的整体结构和回调函数的运用。
摘要由CSDN通过智能技术生成

服务器端

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,接收时调用的回调函数,接收行为的容器。

========

容器的结构类型为:


public class StateObject
{
    
// Client  socket.
    public Socket workSocket = null;
    
// Size of receive buffer.
    public const int BufferSize = 1024;
    
// Receive buffer.
    public byte[] buffer = new byte[BufferSize];
    
// Received data string.
    public StringBuilder sb = new StringBuilder();
}

容器至少为一个socket类型。

===============

   //  Read data from the client socket. 
         int  bytesRead  =  handler.EndReceive(ar);

完成一次连接。数据存储在state.buffer里,bytesRead为读取的长度。

handler.BeginSend(byteData,  0 , byteData.Length,  0 ,
            
new  AsyncCallback(SendCallback), handler);

发送数据byteData,回调函数SendCallback。容器handler

int  bytesSent  =  handler.EndSend(ar);

发送完毕,bytesSent发送字节数。

4 程序结构

主程序:



        
byte[] bytes = new Byte[1024];

        IPAddress ipAddress 
= IPAddress.Parse("192.168.1.104");
        IPEndPoint localEndPoint 
= new IPEndPoint(ipAddress, 11000);

        
// 生成一个TCP的socket
        Socket listener = new Socket(AddressFamily.InterNetwork,
            SocketType.Stream, ProtocolType.Tcp);

        listener.Bind(localEndPoint);
        listener.Listen(
100);

            
while (true)
            {
                
// Set the event to nonsignaled state.
                allDone.Reset();

                
//开启异步监听socket
                Console.WriteLine("Waiting for a connection");
                listener.BeginAccept(
                    
new AsyncCallback(AcceptCallback),
                    listener);

                
// 让程序等待,直到连接任务完成。在AcceptCallback里的适当位置放置allDone.Set()语句.
                allDone.WaitOne();
           }
    Console.WriteLine(
"\nPress ENTER to continue");
    Console.Read();

连接行为回调函数AcceptCallback:


    public static void AcceptCallback(IAsyncResult ar)
    {
        
//添加此命令,让主线程继续.
        allDone.Set();

        
// 获取客户请求的socket
        Socket listener = (Socket)ar.AsyncState;
        Socket handler 
= listener.EndAccept(ar);

        
// 造一个容器,并用于接收命令.
        StateObject state = new StateObject();
        state.workSocket 
= handler;
        handler.BeginReceive(state.buffer, 
0, StateObject.BufferSize, 0,
            
new AsyncCallback(ReadCallback), state);
    }

读取行为的回调函数ReadCallback:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值