.Net Tcp/ip 数据接收
.Net Tcp/ip data reception
为了通过 tcp/ip 协议监听远程客户端,我写了一大段代码。
我能够从客户那里收到数据。但我不知道如何知道客户端是否停止发送数据以完成连接。
这是我的代码:
static void Main(string[] args)
{
TcpListener listener = new TcpListener(IPAddress.Any, 34400);
TcpClient client;
listener.Start();
while (true) // Add your exit flag here
{
client = listener.AcceptTcpClient();
ThreadPool.QueueUserWorkItem(ThreadProc, client);
}
}
private static void ThreadProc(object state)
{
string imei = string.Empty;
var client = ((TcpClient) state);
NetworkStream nwStream = ((TcpClient) state).GetStream();
byte[] buffer = new byte[client.ReceiveBufferSize];
try
{
while (true)
{
int bytesRead = nwStream.Read(buffer, 0, client.ReceiveBufferSize);
string dataReceived = Encoding.ASCII.GetString(buffer, 0, bytesRead);
if (imei == string.Empty)
{
imei = dataReceived;
Console.WriteLine("IMEI received : " + dataReceived);
Byte[] b = { 0x01 };
nwStream.Write(b, 0, 1);
}
else
{
int dataNumber = Convert.ToInt32(buffer.Skip(9).Take(1).ToList()[0]); ;
var result = 0;
while (dataNumber > 0)
{
var parser = new TeltonikaDevicesParser(false);
result = parser.Decode(new List<byte>(buffer), imei);
dataNumber--;
}
nwStream.Write(
result > 0 ? new byte[] { 0x00, 0x00, 0x00, 0x01 } : new byte[] { 0x00, 0x00, 0x00, 0x00 }, 0,
4);
}
}
你不知道。 TCP/IP 不太关心关闭一端的连接。只有当你尝试通过发送数据时才会出现断开连接的状态。
您必须通过 TCP/IP 实现一个简单的协议来完成您的代码:
- 提前了解您期望的数据量。 IMEI 号码有固定的长度。
- 等到传输超时。你收到的都是你的。
- 先发送您打算传输的数据量,当您收到所有数据后,您的工作就完成了。
为了通过 tcp/ip 协议监听远程客户端,我写了一大段代码。 我能够从客户那里收到数据。但我不知道如何知道客户端是否停止发送数据以完成连接。 这是我的代码:
static void Main(string[] args)
{
TcpListener listener = new TcpListener(IPAddress.Any, 34400);
TcpClient client;
listener.Start();
while (true) // Add your exit flag here
{
client = listener.AcceptTcpClient();
ThreadPool.QueueUserWorkItem(ThreadProc, client);
}
}
private static void ThreadProc(object state)
{
string imei = string.Empty;
var client = ((TcpClient) state);
NetworkStream nwStream = ((TcpClient) state).GetStream();
byte[] buffer = new byte[client.ReceiveBufferSize];
try
{
while (true)
{
int bytesRead = nwStream.Read(buffer, 0, client.ReceiveBufferSize);
string dataReceived = Encoding.ASCII.GetString(buffer, 0, bytesRead);
if (imei == string.Empty)
{
imei = dataReceived;
Console.WriteLine("IMEI received : " + dataReceived);
Byte[] b = { 0x01 };
nwStream.Write(b, 0, 1);
}
else
{
int dataNumber = Convert.ToInt32(buffer.Skip(9).Take(1).ToList()[0]); ;
var result = 0;
while (dataNumber > 0)
{
var parser = new TeltonikaDevicesParser(false);
result = parser.Decode(new List<byte>(buffer), imei);
dataNumber--;
}
nwStream.Write(
result > 0 ? new byte[] { 0x00, 0x00, 0x00, 0x01 } : new byte[] { 0x00, 0x00, 0x00, 0x00 }, 0,
4);
}
}
你不知道。 TCP/IP 不太关心关闭一端的连接。只有当你尝试通过发送数据时才会出现断开连接的状态。
您必须通过 TCP/IP 实现一个简单的协议来完成您的代码:
- 提前了解您期望的数据量。 IMEI 号码有固定的长度。
- 等到传输超时。你收到的都是你的。
- 先发送您打算传输的数据量,当您收到所有数据后,您的工作就完成了。