Tcpclient.getStream()。读取()在第二次提出的请求时读取错误的字节。

veeran.

新成员
加入
2019年3月11日
消息
1
编程经验
1-3
在我的Windows应用程序中,其中客户端和服务器之间的通信使用NetworkStream通过TCP / IP进行。当客户端发送消息(命令的字节数组)时,响应已正确接收。但是,在请求时第二次,响应中的字节顺序已更改。从服务器收到了错误的数据。它是代码。

在页面加载中处理数据接收的线程:
C#:
ThreadDatareceive = new Thread(new ParameterizedThreadStart(udfHandleClientCommunication)); ThreadDatareceive.Start(Class.myclient);
ThreadDatareceive.Start(Class.myclient);

写入流:
C#:
bal.byteCommand = new byte[] { 0x90, 0x20, 0x02, 0x01, 0x00, 0x00, 0x01, 0xB0 };
if (Class.myclient.Connected)
{
    stream = Class.myclient.GetStream();
    stream.Write(bal.byteCommand, 0, bal.byteCommand.Length);
    bal.EventNum = 1;
    bal.timer.Start();
    bal.byteResponse.Clear();
}
//Scan();
else
    MessageBox.Show("Please Configure the Module");


从小读取:

C#:
private void udfHandleClientCommunication(object client)
{
    if (this.InvokeRequired)
    {
        MyDelegate1 mydelegate2 = new MyDelegate1(udfHandleClientCommunication);
        this.Invoke(mydelegate2, new object[]{client});
    }
    else
    {
        try
        {
            //List byteData = new List();
            while (true)
            {
                tcpClient = (TcpClient)client;
                stream2 = tcpClient.GetStream();
                byte[] byteBuffer = new byte[1];
                //Array.Clear(byteBuffer, 0, byteBuffer.Length);
                stream2.Read(byteBuffer, 0, byteBuffer.Length);
                bal.byteResponse.AddRange(byteBuffer);

                try
                {
                    switch (bal.EventNum)
                    {
                        case 1:
                            // The scan response is of 97 bytes. So,
                            // wait for the full response
                            // before processing the response data.
                            if (bal.byteResponse.Count >= 97)
                            {
                                if(bal.byteResponse[2] == 0x42)
                                {
                                    udfReadStatusResponse();
                                    break;                                        
                                }  
                            }

                        case 2:
                            // The scan setup is of 11 bytes. So,
                            // wait for the full response
                            // before processing the response data.
                            if (bal.byteResponse.Count >= 11)
                            {
                                if(bal.byteResponse[2] == 0x43)
                                {
                                    udfReadSetupResponse();
                                    break;                                        
                                }  
                            }

                    }
                }
                catch
                {
                    bal.DataReceivedFlag = false;
                    bal.TimeouFlag = true;
                }
            }
        }
        catch (Exception ex)
        {
            MessageBox.Show(ex.Message);
        }

当我运行应用程序(状态Win表单)时正确接收数据。写入时再次单击状态时,从Stream.read()读取的数据不正确。

我在form close()中关闭客户端连接。可能每次都是从流读取一个字节是问题或结束连接正确。
 
最后编辑了主持人:
最佳 底部