对于Socket编程,网上资料、博文一抓一大把,不过大多数都是简单讲解单客户端和服务端通信的实例,这里主要给大家展现一下在.net平台上用窗体程序实现的过程,不过比较有特点的是会告诉大家如何实现不同客户端之间的通信,它们如何通过一个服务端准确的找到对方进行通信,包括上线提醒、私信交流、昵称重名处理等功能。
一.服务端架构
1.开启监听
简单来说,服务端首先要创建一个监听线程,检测客户端的连接情况,这个部分的程序封装在一个按钮里。主要实现代码如下:
Thread threadwatch = null;//负责监听客户端的线程
//创建一个监听线程
threadwatch = new Thread(watchconnecting);
//将窗体线程设置为与后台同步,随着主线程结束而结束
threadwatch.IsBackground = true;
//启动线程
threadwatch.Start();
如果有仔细看我上面给出的代码细心的观众会发现有个watchconnecting()方法被委托进了监听线程,其实这就是一个监听客户端信息消息的函数,很老套的过程:
Socket connection = null;
while (true) //持续不断监听客户端发来的请求
{
try
{
connection = socketwatch.Accept();
}
其中
Socket socketwatch = null;//负责监听客户端的套接字
也只是大家异常熟悉的Socket套接字,这部分绑定IP和端口到Point,然后
//监听绑定的网络节点
socketwatch.Bind(point);
//将套接字的监听队列长度限制为20
socketwatch.Listen(20);
的过程应该在前面服务端开启监听线程的按钮里实现,这里就不细说了。
然后创建一个通信线程,对服务端和客户端之间的交流进行一个完善:
//创建一个通信线程
ParameterizedThreadStart pts = new ParameterizedThreadStart(recv);
Thread thread = new Thread(pts);
thread.IsBackground = true;//设置为后台线程,随着主线程退出而退出
//启动线程
thread.Start(connection);
2.服务端通信过程
由之前代码里创建的通信线程里委托的recv()方法,看字面意思也知道是接收客户端发送消息的接收函数。也是很常规的部分:
Socket socketServer = socketclientpara as Socket;
while (true)
{
//创建一个内存缓冲区 其大小为1024*1024字节 即1M
byte[] arrServerRecMsg = new byte[1024 * 1024];
//将接收到的信息存入到内存缓冲区,并返回其字节数组的长度
try
{
int length = socketServer.Receive(arrServerRecMsg);