TcpClient第二次尝试时无法读取

时间:2014-08-27 23:53:42

标签: c# multithreading tcpclient networkstream

我在收到一次后第二次尝试阅读时遇到了问题。我相信写入是排队的,只有在我停止应用程序时才会通过。不知何故,在第一次阅读后,即使在阅读完整条消息后我也会阻止。我的目标是读取传入的消息,处理它然后向连接的客户端发送消息,然后期望从客户端回来的消息确认它获得了消息。 这是我到目前为止的代码

我在一个单独的线程上启动一个侦听器来等待客户端

        this.tcpListener = new TcpListener(IPAddress.Loopback, 14000);
        this.listenThread = new Thread(new ThreadStart(ListenForClients));
        this.listenThread.Start();

然后在客户端连接后,我在另一个线程上抛出通信处理

        this.tcpListener.Start();
        tcpClient = this.tcpListener.AcceptTcpClient();
        Thread clientThread = new Thread(new ParameterizedThreadStart(ProcessMessage));
        clientThread.Start(tcpClient);

ProcessMessage方法如下所示

public void ProcessMessage(object client)
    {
        if (client != null)
        {
            tcpClient = client as TcpClient;
        }

        this.messageReceived = false;

        NetworkStream clientReadStream = tcpClient.GetStream();


        byte[] message = new byte[tcpClient.ReceiveBufferSize];
        int byteRead = 0;

        while (!this.messageReceived)
        {
            byteRead = 0;
            if (tcpClient.Connected)
            {
                try
                {
                    byteRead = clientReadStream.Read(message, 0, tcpClient.ReceiveBufferSize);
                }
                catch (Exception)
                {
                    throw;
                }

                if (byteRead == 0)
                {

                    break;
                }
                else
                {
                    System.Text.UTF8Encoding encoder = new System.Text.UTF8Encoding();
                    this.request = encoder.GetString(message, 0, byteRead);
                    if (!string.IsNullOrEmpty(this.request))
                    {
                        this.messageReceived = true;
                    }

                }
            }
        }
    }

处理完消息之后,我需要将消息发送回客户端,我通过一个名为SendData的方法从另一个线程执行此操作

 public void SendData(string data)
        {
            if (tcpClient != null)
            {

                if (tcpClient.Connected)
                {
                    try
                    {
                        System.Text.UTF8Encoding encoder = new System.Text.UTF8Encoding();
                        NetworkStream clientWriteStream = tcpClient.GetStream();

                        byte[] buffer = encoder.GetBytes(data);
                        clientWriteStream.Write(buffer, 0, buffer.Length);
                        clientWriteStream.Flush();

                        this.messageReceived = false;

                    }
                    catch
                    {
                        throw;
                    }
                }
            }

        }

不确定要查看的方向..感谢您提前提出任何建议或指示

1 个答案:

答案 0 :(得分:1)

你要设置this.messageReceived = true;当你有recive信息时,虽然condation是while(!this.messageReceived),这是因为当第一条消息被收回时,你会在终止时重新开始...

试试这段代码:

public void ProcessMessage(object client)
{
    if (client != null)
    {
        tcpClient = client as TcpClient;
    }

    this.messageReceived = false;

    NetworkStream clientReadStream = tcpClient.GetStream();


    byte[] message = new byte[tcpClient.ReceiveBufferSize];
    int byteRead = 0;

    while (true)
    {
        byteRead = 0;
        if (tcpClient.Connected)
        {
            try
            {
                byteRead = clientReadStream.Read(message, 0, tcpClient.ReceiveBufferSize);
            }
            catch (Exception)
            {
                throw;
            }

            if (byteRead == 0)
            {

                break;
            }
            else
            {
                System.Text.UTF8Encoding encoder = new System.Text.UTF8Encoding();
                this.request = encoder.GetString(message, 0, byteRead);
                if (!string.IsNullOrEmpty(this.request))
                {
                    this.messageReceived = true;
                }

            }
        }
    }
}

并注意这部分代码:

   if (byteRead == 0)
   {

        break;
   }
   else ...

因为如果读取方法没有读取任何东西,则会再次终止...