2024年3月9日发(作者:)
下面直接讲多线程服务器端开发。(直接给代码和解释吧)
首先定义一个新类,用于传递(连接socket )和接受发送数据。
class ClientThread
{
Encoding encoding = oding("GB2312"); //解码器(可以用于汉字)
private Socket client;
private string data = null;
private byte[] receiveBytes = new byte[1024];//服务器端设置缓冲区
private int recCount;
//传递连接socket
public ClientThread(Socket ClientSocket)
{
= ClientSocket;
}
//数据处理接口
public void ClientServer()
{
try
{
while (true)
{
recCount = e(receiveBytes, , 0);//从客户端接收信息
if (recCount != 0)//当服务器端的缓冲区接收到的信息不为空时
{
data = ing(receiveBytes, 0, recCount); //接收数据
//接收数据成功后给客户端返回OK
(es("OK"), 2, 0);
}
else
{
break;
}
}
}
catch (Exception ex)
{
("出现异常:");
ine(ng());
ne();
}
();
}
}
开始服务器端的多线程开发。
string HostName = tName(); //得到主机名
IPHostEntry IpEntry = tEntry(HostName); //得到主机IP
string strIPAddr = sList[0].ToString();
IPAddress ip = (strIPAddr); //把ip地址字符串转换为IPAddress
IPEndPoint ipep = new IPEndPoint(ip, 9001); //用指定的端口和ip
newsock = new Socket(etwork, , );
(ipep);//绑定
(10);//监听
while (true)
{
try
{
//当有可用的客户端连接尝试时执行,并返回一个新的
Socket client = ();
//创建消息服务线程对象,并把连接socket赋于ClientThread
ClientThread newclient = new ClientThread(client);
//把ClientThread 类的ClientService方法委托给线程
Thread newthread = new Thread(new ThreadStart(Server));
// 启动消息服务线程
();
}
catch
{
//连接中断或者连接失败
}
}
}
这样就完成了多线程socket的开发。一个服务器能对多个客户端:当有客户端要求连接的时候创建新
的线程去处理对应的客户端。但是这有一个缺点是,当有N个连接客户端的时候,就有N个线程,会对程序性
能以及计算机性能影响很大。下面用线程池的方法对线程进行线程管理(限制最大的线程数,把空闲的线程重
新使用,以提高性能)。
Thread newthread = new Thread(new ThreadStart(Server));
();
将以上程序代码换成threadpool的静态方法 QueueUserWorkItem(这个方法默认最多能有25个线程,
你可以根据你自己的需要进行设置,这里不详说了):
serWorkItem(new WaitCallback(Server));
这个方法要求被调用的函数至少有一个参数object。比如:public void ClientServer(object 0)
socket


发布评论