111,092
社区成员




private void AcceptConnect()
{
IPAddress[] ip = Dns.GetHostAddresses(Dns.GetHostName());
listener = new TcpListener(ip[0], 51888);
listener.Start();
listBoxStatus.Invoke(setListBoxCallback, "开始等待客户连接");
while (isExit == false)
{
try
{
allDone.Reset();
AsyncCallback callback = new AsyncCallback(AcceptTcpClientCallback);
listener.BeginAcceptTcpClient(callback,listener);
allDone.WaitOne();
}
catch (Exception ex)
{
listBoxStatus.Invoke(setListBoxCallback,ex.Message);
break;
}
}
}
private void AcceptTcpClientCallback(IAsyncResult ar)
{
try
{
allDone.Set();
TcpListener myListener = (TcpListener)ar.AsyncState;
TcpClient client = myListener.EndAcceptTcpClient(ar);
listBoxStatus.Invoke(setListBoxCallback, "已接受客户连接:" + client.Client.RemoteEndPoint);
comboBox1.Invoke(setComboBoxCallback,client.Client.RemoteEndPoint.ToString());
ReadWriteObject readWriteObject = new ReadWriteObject(client);
clientList.Add(readWriteObject);
SendString(readWriteObject,"服务器已经接受连接");
readWriteObject.netStream.BeginRead(readWriteObject.readBytes,0,readWriteObject.readBytes.Length,ReadCallback,readWriteObject);
}
catch(Exception ex)
{
listBoxStatus.Invoke(setListBoxCallback, ex.Message);
}
}
private void ReadCallback(IAsyncResult ar)
{
try
{
ReadWriteObject readWriteObject = (ReadWriteObject)ar.AsyncState;
int count = readWriteObject.netStream.EndRead(ar);
richTextBoxReceive.Invoke(setRichTextBoxCallback,string.Format("[来自{0}]{1}",readWriteObject.client.Client.RemoteEndPoint,str));
if(isExit==false)
{
readWriteObject.InitReadArray();
readWriteObject.netStream.BeginRead(readWriteObject.readBytes, 0, readWriteObject.readBytes.Length, ReadCallback, readWriteObject);
}
}
catch(Exception ex)
{
//listBoxStatus.Invoke(setListBoxCallback,ex.Message);
}
}
private void AcceptConnect()
{
IPAddress[] ip = Dns.GetHostAddresses(Dns.GetHostName());
listener = new TcpListener(ip[0], 51888);
listener.Start();
listBoxStatus.Invoke(setListBoxCallback, "开始等待客户连接");
AcceptTcpClientCallback();
listener.BeginAcceptTcpClient(AcceptTcpClientCallback,listener);
}
private void AcceptTcpClientCallback(IAsyncResult ar)
{
try
{
TcpListener myListener = (TcpListener)ar.AsyncState;
TcpClient client = myListener.EndAcceptTcpClient(ar);
listBoxStatus.Invoke(setListBoxCallback, "已接受客户连接:" + client.Client.RemoteEndPoint);
comboBox1.Invoke(setComboBoxCallback,client.Client.RemoteEndPoint.ToString());
ReadWriteObject readWriteObject = new ReadWriteObject(client);
clientList.Add(readWriteObject);
SendString(readWriteObject,"服务器已经接受连接");
readWriteObject.netStream.BeginRead(readWriteObject.readBytes,0,readWriteObject.readBytes.Length,ReadCallback,readWriteObject);
}
catch(Exception ex)
{
listBoxStatus.Invoke(setListBoxCallback, ex.Message);
}
listener.BeginAcceptTcpClient(AcceptTcpClientCallback,listener);
}
本来是赶紧整洁的代码,就好像漂亮的姑娘,带上一个while式的垃圾帽子就显得臃肿和俗气了。
你的ReadCallback也是类似,如果需要连续读取数据,那么在这个方法内部应该调用BeginRead,而不是在 AcceptTcpClientCallback 内部搞什么 while 语句和阻塞。