异步的TCP服务器程序
我做了个TCP服务器程序,用来监听各个客户端的连接,并与之通信。照着书上用异步的方式写了程序,以下是代码。
基本按这个代码来的,小有改动。运行结果达到预期,但是发现两个问题,一个是CPU占用率会一直上升到100%,二是内存一直在涨。
第一个问题,我加了Thread.Sleep(1)解决问题。第二个问题我认为是出在AcceptConnection里,因为客户端会每隔1分钟都给我发个连接,我的服务器程序没有判断功能,对重复的连接也进行操作了,致使在没有新客户的情况下也新开线程。事实也是如此,通过任务管理器也可以看出我这个程序的线程数一直在增加。我在AcceptTcpClientCallback里做了个判断,对于重复的IP和端口直接返回,但是我不知道AcceptConnection里的callback如何释放掉。
不知我的理解对否,求解答。
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);
}
}
基本按这个代码来的,小有改动。运行结果达到预期,但是发现两个问题,一个是CPU占用率会一直上升到100%,二是内存一直在涨。
第一个问题,我加了Thread.Sleep(1)解决问题。第二个问题我认为是出在AcceptConnection里,因为客户端会每隔1分钟都给我发个连接,我的服务器程序没有判断功能,对重复的连接也进行操作了,致使在没有新客户的情况下也新开线程。事实也是如此,通过任务管理器也可以看出我这个程序的线程数一直在增加。我在AcceptTcpClientCallback里做了个判断,对于重复的IP和端口直接返回,但是我不知道AcceptConnection里的callback如何释放掉。
不知我的理解对否,求解答。
...全文
相关推荐
C# 异步TCP Socket 多人聊天室(1服务器,N客户端)
本文介绍了一个基于TCP协议的异步客户端和服务器程序的实现。客户端窗体支持用户登录、消息发送接收和在线用户列表显示,而服务器端窗体则管理TCP连接、用户状态和聊天功能。代码利用多线程和委托处理异步UI
TcpS.rar_tcp
**套接字编程**:在Windows中,TCP服务器程序通常使用`Winsock`库进行开发。
TCP-server-program.rar_tcp服务器程序
**并发处理**:如果服务器需要同时处理多个客户端的连接,它可能采用了多线程、多进程或者异步I/O模型来实现并发。5.
VC++ TCP服务器程序
在Windows环境下,开发TCP服务器程序通常会使用C++语言,结合Microsoft Visual C++(简称VC++)进行编程。本教程将深入探讨如何使用VC++构建一个简单的TCP服务器程序。
TCP server程序
本知识点我们将深入探讨如何编写一个TCP服务器程序,以及这个过程中涉及的关键技术和原理。首先,TCP服务器的核心是监听客户端的连接请求。在TCP/IP模型中,服务器需要开启一个特定的端口号来监听。


