服务器与客户端通讯测试
- 1 服务器与客户端通讯建立
-
- 1.1 Main函数
- 1.2 开启服务器
- 1.3 客户端连接服务器
- 1.4 扩展类
- 2 测试过程
-
- 2.1 测试1
- 2.2 测试2
- 2.3 测试3
- 2.4 测试4
- 3 测试总结
- 测试服务器与客户端通讯时,发现数据丢包问题非常严重,肯定是自己的问题不会是通讯的问题,经过一系列的测试发现果然是自己的问题。
- 实际上并未发生丢包,是自己测试的方式有问题,请看一下代码:
1 服务器与客户端通讯建立
- 在main函数中调用了开启服务器,并处理客户端连接服务器;
- 服务器监听客户端连接,并开启线程处理客户端发送的消息;
- 客户端连接服务器后,开启线程一直向服务器发送消息。
1.1 Main函数
static void Main(string[] args)
{
string ip = "127.0.0.1";
int port = 1234;
Server(ip, port);
Client(ip, port);
Console.ReadKey();
}
1.2 开启服务器
/// <summary>
/// 开启服务器、监听客户端连接、并为(每个)客户端创建线程处理通信
/// </summary>
private static void Server(string ip, int port)
{
TcpListener server = new TcpListener(IPAddress.Parse(ip), port);
server.Start();
new Task(() =>
{
while (true)
{
//等待客户端连接
TcpClient client = server.AcceptTcpClient();
//为(每个)客户端创建线程处理通信
new Task(() =>
{
NetworkStream stream = client.GetStream();
byte[] buffer = new byte[1024];
while (true)
{
// 异步读取客户端发送的消息
int bytesRead = stream.Read(buffer, 0, buffer.Length);
if (bytesRead == 0)
break;
Thread.Sleep(0);
}
}).Start();
}
}).Start();
}
1.3 客户端连接服务器
/// <summary>
/// 客户端连接服务器,一直向服务器发送消息
/// </summary>
private static void Client(string ip, int port)
{
var client = new TcpClient();
client.Connect(IPAddress.Parse(ip), port);
new Task(() =>
{
NetworkStream stream = client.GetStream();
byte[] buffer = { 0xAA, 0xBB, 0x03, 0x04, 0x5, 0x55 };
while (true)
{
stream.Write(buffer, 0, buffer.Length);
Thread.Sleep(0);
}
}).Start();
}
1.4 扩展类
public static class Extension
{
public static string IntToString(this int num)
{
return num.ToString().PadLeft(2, '0');
}
public static string ByteToString(this byte b)
{
return Convert.ToString(b, 16).PadLeft(2, '0').ToUpper() + " ";
}
}
2 测试过程
2.1 测试1
客户端连接服务器后一直向服务器发送消息
var client = new TcpClient();
client.Connect(IPAddress.Parse(ip), port);
new Task(() =>
{
NetworkStream stream = client.GetStream();
byte[] buffer = { 0xAA, 0xBB, 0x03, 0x04, 0x5, 0x55 };
while (true)
{
stream.Write(buffer, 0, buffer.Length);
Thread.Sleep(0);
}
}).Start();
那么我们期望服务器每次接受到的消息应该是(如下图),因为我们每次发了一个数据包,也希望服务器接受到的数据包是完整的包,然而之际通讯中并非如此。 实际上,服务器接收到的数据包是这样的(如下图),当我让服务器没隔两秒接受一次数据时,发现服务器接受到的数据已经装满了整个缓冲区,但是包是按照客户端发送过来的数据完整排列的。
2.2 测试2
根据测试1,我想看看是不是服务器延迟接受后,数据包真的是按照客户端发送消息的顺序获取的吗,因此我又做了以下测试,客户端发送数据如下,包的大小为1,每次发送自增1: 我们来看看服务器接受到的数据包,看下图其实我们期望看到的结果。
2.3 测试3
客户端不间断发送固定大小(包的大小为6)的数据包 服务器每间隔500毫秒接受一次数据,并且设置缓冲区大小与客户端包的大小相同(包的大小为6),发现服务器接受到了所有的数据,并且是按照整个包接受数据的。
2.4 测试4
客户端每间断500毫秒,发送固定大小(包的大小为6)的数据包 服务器不间断的获取客户端消息,设置服务器接受缓冲区(1024)大于客户端发送数据包的大小,
3 测试总结
TCP协议(Transimission Control Protocol)是以一种面向连接的、可靠的、基于字节流的传输层通信协议。”;
评论前必须登录!
注册