tcpllistener不确认连接
本文关键字:连接 确认 tcpllistener | 更新日期: 2023-09-27 18:12:00
所以我正在编写一个简单的客户机-服务器应用程序。它应该发送一个数据包,然后等待接收一个数据包,然后发送一个等等……问题是,它收到了第一个数据包,但是当我在第二次迭代中启动TcpListener
时,它给了我这个错误:
无法连接,因为目标机器处于活动状态127.0.0.1:13
private void listenForConnections()
{
bool prejelPaket = false;
listener = new TcpListener(IPAddress, port);
listener.Start();
while (!packetReceived)
{
try
{
client = listener.AcceptTcpClient();
listener.Stop();
networkStream = client.GetStream();
byte[] message = new byte[1024];
networkStream.Read(message, 0, message.Length);
networkStream.Close();
string strMessage = Encoding.UTF8.GetString(message);
packetReceived= true;
MessageBox.Show("received message: " + strMessage);
client.Close();
}
catch (Exception ee)
{
thListen.Join();
}
}
}
private void sendPacket(object pClient)
{
string message = "test message;
try
{
client = (TcpClient)pClient;
client.Connect(IPAddress, port);
networkStream = client.GetStream();
byte[] strMessage = Encoding.UTF8.GetBytes(message);
networkStream.Write(strMessage, 0, strMessage.Length);
networkStream.Close();
client.Close();
}
catch (Exception ex)
{
MessageBox.Show(ex.ToString());
}
}
只创建一次客户端/网络流。将它们存储在属性中,直到完成发送和接收。然后关闭并处理。不要停止/关闭每次迭代之间的连接
移动
listener.Stop();
在while循环之外。
编辑:解释原因
它第一次工作但第二次迭代失败的原因是因为在第一个客户端从client = listener.AcceptTcpClient()
接受后,下一行代码调用listener.Stop()
,停止侦听连接。随后对listener.AcceptTcpClient()
的任何调用都将抛出InvalidOperationException
。将listener.Stop()
移出while循环只会在它退出循环后停止侦听连接。
再次查看packetReceived
在第一次迭代中也设置为true,因此无论如何,它将在第一个客户端后退出while循环,这是预期的行为吗?