问题 :
在服务端的client = tcpListener.EndAcceptTcpClient(iar) 处设断点,第一次客户端点连接时 服务器端代码可以命中断点,并且返回一个TcpClient对象。第二次客户端再点连接时,服务器端有时候可以命中断点,返回TcpClient对象。第三次铁定就无法命中断定了,客户端无法得到服务器的响应。求解!!!
服务端相关代码:
public void Start()
{
tcpListener = new TcpListener(ipAddr, port);
tcpListener.Start(); //打开监听
Thread listenerThead = new Thread(ListenConnect);
listenerThead.IsBackground = true;
listenerThead.Start(); //打开监听线程
}
public void ListenConnect()
{
TcpClient client = null;
while (true)
{//循环监听
IAsyncResult iar = tcpListener.BeginAcceptTcpClient(null, null);
while (!iar.IsCompleted)
{//轮询是否有用户接入,这里不需要有时间超时,因为监听要做的是一直循环等待用户接入的工作
Thread.Sleep(sleepMilliseconds);
}
try
{
client = tcpListener.EndAcceptTcpClient(iar);
}
catch (Exception)
{
throw;
}
//client = tcpListener.AcceptTcpClient();
if (client != null)
{
//clientList.Add(client);
Thread clientThread = new Thread(ForwardPacket);
clientThread.IsBackground = true;
clientThread.Start(client); //为每个连接的用户打开数据通讯工作线程
}
}
}
客户端相关代码:
private void btnTest_Click(object sender, EventArgs e)
{
NetworkStream ns;
TcpClient client =new TcpClient(AddressFamily.InterNetwork);
IAsyncResult iar = client.BeginConnect(IPAddress.Parse("172.30.218.132"), int.Parse("18000"), null, null);
while (!iar.IsCompleted)
{
Thread.Sleep(10);
}
client.EndConnect(iar);
}
------解决思路----------------------
http://msdn.microsoft.com/zh-tw/library/system.net.sockets.tcplistener.endaccepttcpclient(VS.80).aspx
------解决思路----------------------
先说重点的吧。你的所谓 client 变量的定义,使得多个线程执行时可能共享/冲突。
再说次要的。实际上异步BeginXXX操作就不需要什么while语句、以及while里边还要嵌套一个死循环,这种东西!