【问题标题】:TcpListener Client stays connected sending multiple messages but server only receives or processes the first messageTcpListener 客户端保持连接发送多条消息,但服务器只接收或处理第一条消息
【发布时间】:2019-01-16 09:21:34
【问题描述】:

我正在设置一个服务器来使用 TcpListener 读取一些网络客户端。客户端发送一些数据,我验证该数据并发送对该数据的响应,客户端保持连接并发送第二个响应,然后我验证该数据并发送回响应,就像登录服务器两次一样。第一次登录被发送回客户端就好了,但客户端第二次响应服务器并没有显示它从客户端接收到更多数据。

我通过设置一个虚拟客户端对其进行了测试(真正的客户端是基于手机的 ODB2)。设置了虚拟客户端后,我确实验证了第一次握手发生了,但是当客户端发送第二组文本时,它没有显示在服务器上。

class Program
{
    static private TcpListener listener = null;
    static private TcpClient client = null;
    static private NetworkStream stream = null;
    static private int iCount = 0;
    static Int32 port = 8090;
    static IPAddress localAddr = IPAddress.Parse("192.168.1.17");
    static void Main(string[] args)
    {
        listener = new TcpListener(localAddr, port);
        listener.Start();
        while (true)
        {
            try
            {
                client = listener.AcceptTcpClient();
                ThreadPool.QueueUserWorkItem(ThreadProc, client);
            }
            catch (IOException ioex)
            {
                RestartStream();
            }
        }
    }
        private static void ThreadProc(object obj)
        {

        var client = (TcpClient)obj;
        Byte[] bytes = new Byte[client.ReceiveBufferSize];
        stream = client.GetStream();
        try
        {
            int bytesRead = stream.Read(bytes, 0, (int)client.ReceiveBufferSize);
            string returndata = Encoding.ASCII.GetString(bytes, 0, bytesRead).Replace("-", "");
            byte[] sendBytes;
            if (returndata.ToLower().StartsWith("7e") && returndata.ToLower().EndsWith("7e"))
            {
             //… do stuff with the data and send it back to the client 
             sendBytes = Encoding.Default.GetBytes(login1);
             stream.Write(sendBytes, 0, sendBytes.Length);
             stream.Flush();
                              }
                              else
                {
                    SaveStream(returndata);
                }
            }
        catch (Exception ex)
        {
                      Console.WriteLine(ex.ToString());
        }
    } 

测试客户端代码:

 //---data to send to the server---
        string textToSend = "7E010000360141850000080000000000000000000000000000000000000000000000000000000000000035303030303038003131313131313131313131313131313131F67E";

        //---create a TCPClient object at the IP and port no.---
        TcpClient client = new TcpClient(SERVER_IP, PORT_NO);
        NetworkStream nwStream = client.GetStream();
        byte[] bytesToSend = ASCIIEncoding.ASCII.GetBytes(textToSend);

        //---send the text---
        Console.WriteLine("Sending : " + textToSend);
        nwStream.Write(bytesToSend, 0, bytesToSend.Length);

        //---read back the text---
        byte[] bytesToRead = new byte[client.ReceiveBufferSize];
        int bytesRead = nwStream.Read(bytesToRead, 0, client.ReceiveBufferSize);
        Console.WriteLine("Received : " + Encoding.ASCII.GetString(bytesToRead, 0, bytesRead));

        string Text2 = "7E0100003601418535303030303038003131313131313131313131313131313131F67E";
        Console.WriteLine("Sending : " + Text2);
        byte[] bytesToSend2 = ASCIIEncoding.ASCII.GetBytes(Text2);
        nwStream.Write(bytesToSend2, 0, bytesToSend2.Length);
        client.Close();
        Console.ReadLine();

我需要发生的是我的理解是客户端始终保持连接并一遍又一遍地发送数据,我的系统似乎接受它一次然后停止接收它,我需要它继续接收客户端数据并且处理它。

【问题讨论】:

  • 使用调试器单步调试服务器代码,观察 ThreadProc 处理第一条消息后发生的情况。
  • 什么都没发生我已经尝试过了……它永远不会处理
  • 这是一个调试问题
  • 一般请解释一下,即使调试不起作用,console.writeline 也应该显示数据。对吗?
  • 那么,ThreadProc 函数在处理完第一条消息后会发生什么?

标签: c# multithreading tcplistener


【解决方案1】:

好吧,我想通了,线程中应该有第二个 while 循环。

static void Main(string[] args)
    {
        listener = new TcpListener(localAddr, port);
        var clientSocket = default(TcpClient);
        listener.Start();
        var counter = 0;
        while (true)
        {
            clientSocket = listener.AcceptTcpClient();
            var client = new ConnectedDevice();
            client.startClient(clientSocket, counter.ToString(), sqlConnString);
        }
    }

ConnectedDevice 类:

class ConnectedDevice
{
    private TcpClient _clientSocket;
    private string _clientNumber;
    private string _sqlConnString;

    public void startClient(TcpClient clientSocket, string clientNumber, string sqlConnString)
    {
        _clientSocket = clientSocket;
        _clientNumber = clientNumber;
        _sqlConnString = sqlConnString;

        var ctThread = new Thread(ProcessClient);
        ctThread.Start();
    }
    private void ProcessClient()
    {
        while (_clientSocket.Connected)
        {
            try
            {
                Byte[] bytes = new Byte[_clientSocket.ReceiveBufferSize];
                var networkStream = _clientSocket.GetStream();
                networkStream.ReadTimeout = 10000;
                int i;
                while ((i = networkStream.Read(bytes, 0, bytes.Length)) != 0)
                {
                    var data = System.Text.Encoding.ASCII.GetString(bytes, 0, i).Replace("-", "");
                    byte[] sendBytes;
                    Console.WriteLine(data);
                    string sLogin1 = "7E81000013014185000008000000000054523230313731303138303930303137497E";
                    sendBytes = Encoding.ASCII.GetBytes(sLogin1);
                    networkStream.Write(sendBytes, 0, sendBytes.Length);
                    networkStream.Flush();
                }
            }
            catch (Exception ex)
            {

            }
        }
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-06
    • 2018-04-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-16
    相关资源
    最近更新 更多