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