影子博客

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

C# Socket的TCP通讯 异步 (2015-11-07 10:07:19)转载▼

  1. 异步
    相对于同步,异步中的连接,接收和发送数据的方法都不一样,都有一个回调函数,就是即使不能连接或者接收不到数据,程序还是会一直执行下去,如果连接上了或者接到数据,程序会回到这个回调函数的地方重新往下执行。详细见下面:

服务器:

1、 开启侦听接口

private TcpListener listener; //监听类

listener = new TcpListener(new IPEndPoint(IPAddress.Parse(ip), port));

listener.Start();//开启侦听,对连接的客户端的数目没有限制

或者

listener.Start(int i);// 开启侦听,最多只能连接i个客户端数目
2、 接收客户端

listener.BeginAcceptSocket(clientConnect, listener);//异步接受客户端的连接请求 clientConnect为连接的回调函数

///

/// 接收回调函数

///

///

private void clientConnect(IAsyncResult ar)

{

try

{

TcpListener listener = (TcpListener)ar.AsyncState;

//接受客户的连接,得到连接的Socket

Socket client = listener.EndAcceptSocket(ar);

}

catch { }

}
3、 接收客户端发送的数据

///

/// 异步接收数据

///

private void receiveData(Socket client)

{

// 调用异步方法 BeginReceive 来告知 socket 如何接收数据

IAsyncResult iar = client.BeginReceive(buffer, 0, BagSize, SocketFlags.None, out errorCode, receiveCallback, buffer);
}
}

///

/// 接收数据回调函数

///

///

private void receiveCallback(IAsyncResult ar)

{

//接收到的数据长度.

int receLen = 0;

try

{

receLen = client.EndReceive(ar, out errorCode);

if (receLen > 0)

{

OnReceiveData(client);//接收到数据之后的处理函数

}

}

catch { }
}

else { }

}

4、接收成功之后,回发数据给客户端

///

/// 异步发送报文

///

///

private void OnReceiveData (Socket socket)

{

string strLogin = “succeed recived”;

byte[] data = Encoding.ASCII.GetBytes(strLogin);

socket.BeginSend(data, 0, data.Length, SocketFlags.None, out errorCode, sendCallBack, socket);//异步发送数据

}

else

{ }

}

///

/// 异步发送回调事件

///

///

private void sendCallBack(IAsyncResult ar)

{

socket.EndSend(ar, out errorCode);

}
客户端

1、连接服务器

private TcpClient tcpcz = null

tcpcz = new TcpClient()

tcpcz.BeginConnect(ipaddress, Convert.ToInt32(port), new AsyncCallback(ConnectCallback), tcpcz);//根据服务器的IP地址和端口号 异步连接服务器

///

/// 异步连接的回调函数

///

///

private void ConnectCallback(IAsyncResult ar)

{

TcpClient t = (TcpClient)ar.AsyncState;

try

{

if (t.Connected)

{

t.EndConnect(ar);//函数运行到这里就说明连接成功

}

else

{

}

}

catch () { }
}
2、发送和接收字符串

NetworkStream stream = tcp.GetStream();//创建于服务器连接的数据流

//发送字符串

string strLogin = “this is socket example”;

byte[] data = Encoding.ASCII.GetBytes(strLogin);

stream.BeginWrite(data, 0, data.Length, new AsyncCallback(SendCallback),stream);//异步发送数据

//接收字符串

byte[] result = new byte[tcp.Available]; // tcp.Available为接受的字符串大小
try
{

stream.BeginRead(result, 0, result.Length, new AsyncCallback(ReadCallback), stream);//异步接受服务器回报的字符串

}
catch { }
string strResponse = Encoding.ASCII.GetString(result).Trim();//从服务器接受到的字符串

}

}
catch ()
{
}
}

posted on 2016-02-18 12:03  影子博客  阅读(331)  评论(0)    收藏  举报