ckdk's blog

c#异步连接TCP服务器

2016/04/12

建立连接

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
/// <summary>
/// 连接
/// </summary>
public void Connect()
{
tcp = new TcpClient();
tcp.BeginConnect(Host, Port, new AsyncCallback(ConnectCallback), tcp);
}
/// <summary>
/// 连接回调
/// </summary>
/// <param name="ar"></param>
public void ConnectCallback(IAsyncResult ar)
{
TcpClient t = (TcpClient)ar.AsyncState;
try
{
if (t.Connected)
{
t.EndConnect(ar);//函数运行到这里就说明连接成功
tcp = t;
PrintMsg("成功连接至服务器!");
}
else
{
PrintMsg("连接服务器失败,请重试!");
}
}
catch (Exception e)
{
PrintMsg("Error:" + e.ToString());
}
}

向服务器发送数据

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
/// <summary>
/// 向服务器发送消息
/// </summary>
/// <param name="str"></param>
/// <param name="stream"></param>
public void Send(string str, NetworkStream stream)
{
try
{
byte[] data = Encoding.GetEncoding("GB2312").GetBytes(str);
stream.BeginWrite(data, 0, data.Length, new AsyncCallback(SendCallback), stream);//异步发送数据
PrintMsg("向服务器发送数据:" + str);
}
catch (Exception e)
{
PrintMsg("Error:" + e.ToString());
}
}

异步接收消息

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
/// <summary>
/// 异步接收消息
/// </summary>
/// <param name="t"></param>
public void Recv(TcpClient t)
{
byte[] result = new byte[t.Available]; // tcp.Available为接受的字符串大小
try
{
t.GetStream().BeginRead(result, 0, result.Length, new AsyncCallback(RecvCallback), t);//异步接受服务器回报的字符串
}
catch (Exception e)
{
PrintMsg("Error:" + e.ToString());
}
}

/// <summary>
/// 接收消息回调
/// </summary>
/// <param name="ar"></param>
public void RecvCallback(IAsyncResult ar)
{
TcpClient t = (TcpClient)ar.AsyncState;
if (t.Connected)
{
NetworkStream ns = t.GetStream();
byte[] data = new byte[t.Available];
ns.Read(data, 0, t.Available);
string content = Encoding.UTF8.GetString(data);
PrintMsg("客户端接收到数据:" + content);
}
}
CATALOG
  1. 1. 建立连接
  2. 2. 向服务器发送数据
  3. 3. 异步接收消息