上一篇中阻塞版本的客户/服务器模型实现了一个客户端能连续向服务器端发送数据,但是因为服务器端在循环体内会被阻塞,这样其它客户端再连接服务器端时服务器是无法处理的,这就导致了服务器只能处理一个客户端,其它客户端都会等待,直到当前处理的客户端退出,然后就会再有一个客户端和服务器端连接。
这一篇文章介绍一种可以让多个客户端同时能和服务器端通信的方式,就是服务器端的多线程模型,服务器每次调用accept建立一个连接后,启动一个新的线程为这个连接服务,然后服务器继续执行,这样就不会陷入阻塞状态了。
此时客户端的代码和前面阻塞模式是一样的,不需要进行改变,就是一个持续从控制台读取一行数据,然后发送到服务器,接着从服务器端读取数据的代码。
服务器端第6步的代码此时就不是调用recv()函数和send()函数从socket连接中获取和发送数据了,而是启动一个新的线程,将这个socket连接作为参数传递给这个新的线程,新启动的这个线程负责和当前这个连接的通讯,由于创建新线程后主循环会继续执行下去而不会出现阻塞,所以服务器可以处理多个客户端的请求了。
这个有点类似于之间阻塞版本中的recv()和send()函数相关的代码放置到了一个线程中执行。
服务端代码:
- #include <stdio.h>
- #include <stdlib.h>
- #include <WinSock2.h>
- #include <iostream>
- #pragma comment(lib, "ws2_32.lib")
- using namespace std;
- #define PORT 6000
- //#define IP_ADDRESS "10.11.163.113" //表示服务器端的地址
- #define IP_ADDRESS "127.0.0.1" //直接使用本机地址
- //响应客户请求的线程
- DWORD WINAPI clientService(LPVOID lpParameter)
- {
- SOCKET clientSocket=(SOCKET)lpParameter;
- int err=0;
- char receBuff[MAX_PATH];
- char sendBuf[MAX_PATH];
- while(