.Net Tcp/ip数据接收

.Net Tcp/ip数据接收,.net,tcp-ip,.net,Tcp Ip,为了通过tcp/ip协议监听远程客户端,我编写了一组代码。 我能够从客户那里接收数据。但是如果客户端停止发送数据以完成连接,我不知道如何处理。 这是我的代码: static void Main(string[] args) { TcpListener listener = new TcpListener(IPAddress.Any, 34400); TcpClient client; listener.Sta

为了通过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);
                    }
                }  
static void Main(字符串[]args)
{
TcpListener侦听器=新的TcpListener(IPAddress.Any,34400);
TCP客户机;
listener.Start();
while(true)//在此处添加退出标志
{
client=listener.AcceptTcpClient();
QueueUserWorkItem(ThreadProc,客户端);
}
}
私有静态void ThreadProc(对象状态)
{
string imei=string.Empty;
var客户端=((TcpClient)状态);
NetworkStream nwStream=((TcpClient)状态)。GetStream();
byte[]buffer=新字节[client.ReceiveBufferSize];
尝试
{
while(true)
{
int bytesRead=nwStream.Read(buffer,0,client.ReceiveBufferSize);
string dataReceived=Encoding.ASCII.GetString(缓冲区,0,字节读取);
if(imei==string.Empty)
{
imei=接收到的数据;
Console.WriteLine(“IMEI接收:+dataReceived”);
字节[]b={0x01};
nwStream.Write(b,0,1);
}
其他的
{
int dataNumber=Convert.ToInt32(buffer.Skip(9).Take(1).ToList()[0]);
var结果=0;
而(数据编号>0)
{
var parser=new TeltonikaDevicesParser(false);
结果=parser.Decode(新列表(缓冲区),imei);
数据编号--;
}
nwStream.Write(
结果>0?新字节[]{0x00,0x00,0x00,0x01}:新字节[]{0x00,0x00,0x00,0x00},0,
4);
}
}  

您不需要。TCP/IP不太关心关闭一端的连接。只有当您尝试通过发送数据时,才会出现断开状态

您必须通过TCP/IP实现一个简单的协议来完成代码:

  • 提前知道您需要多少数据。IMEI编号有一个固定的长度
  • 等待转机超时。你收到的都是你的
  • 首先发送你打算传输多少数据,当你得到所有数据时,你的工作就完成了

这是一个好问题,我现在只能想到两种方法:1)交换的消息退出,2)空闲超时退出