我在收到一次后第二次尝试阅读时遇到了问题。我相信写入是排队的,只有在我停止应用程序时才会通过。不知何故,在第一次阅读后,即使在阅读完整条消息后我也会阻止。我的目标是读取传入的消息,处理它然后向连接的客户端发送消息,然后期望从客户端回来的消息确认它获得了消息。 这是我到目前为止的代码
我在一个单独的线程上启动一个侦听器来等待客户端
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;
}
}
}
}
不确定要查看的方向..感谢您提前提出任何建议或指示
答案 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 ...
因为如果读取方法没有读取任何东西,则会再次终止...