socket通信之四:多线程版本的客户/服务器模型

上一篇中阻塞版本的客户/服务器模型实现了一个客户端能连续向服务器端发送数据,但是因为服务器端在循环体内会被阻塞,这样其它客户端再连接服务器端时服务器是无法处理的,这就导致了服务器只能处理一个客户端,其它客户端都会等待,直到当前处理的客户端退出,然后就会再有一个客户端和服务器端连接。


这一篇文章介绍一种可以让多个客户端同时能和服务器端通信的方式,就是服务器端的多线程模型,服务器每次调用accept建立一个连接后,启动一个新的线程为这个连接服务,然后服务器继续执行,这样就不会陷入阻塞状态了。


此时客户端的代码和前面阻塞模式是一样的,不需要进行改变,就是一个持续从控制台读取一行数据,然后发送到服务器,接着从服务器端读取数据的代码。


服务器端第6步的代码此时就不是调用recv()函数和send()函数从socket连接中获取和发送数据了,而是启动一个新的线程,将这个socket连接作为参数传递给这个新的线程,新启动的这个线程负责和当前这个连接的通讯,由于创建新线程后主循环会继续执行下去而不会出现阻塞,所以服务器可以处理多个客户端的请求了。


这个有点类似于之间阻塞版本中的recv()和send()函数相关的代码放置到了一个线程中执行。


服务端代码:


  1. #include <stdio.h>  
  2. #include <stdlib.h>  
  3. #include <WinSock2.h>  
  4. #include <iostream>  
  5.   
  6. #pragma comment(lib, "ws2_32.lib")  
  7.   
  8.   
  9. using namespace std;  
  10.   
  11. #define  PORT 6000  
  12. //#define  IP_ADDRESS "10.11.163.113"  //表示服务器端的地址  
  13. #define  IP_ADDRESS "127.0.0.1"  //直接使用本机地址  
  14.   
  15. //响应客户请求的线程  
  16. DWORD WINAPI clientService(LPVOID lpParameter)  
  17. {  
  18.     SOCKET clientSocket=(SOCKET)lpParameter;  
  19.     int err=0;  
  20.     char receBuff[MAX_PATH];  
  21.     char sendBuf[MAX_PATH];  
  22.     while(
  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值