Socket“服务器-客户端”模型的多线程并发实现效果的大体思路是:首先,在Server端建立“链接循环”,每一个链接都开启一个“线程”,使得每一个Client端都能通过已经建立好的线程来同时与Server通信,代码如下:

# -*- coding: utf-8  -*-
# -*- Author: WangHW -*-
import socket
from threading import Thread def Communication(conn):
# 通信循环
while 1:
try:
data = conn.recv(1024)
if not data:
break
print('Client Data:', data.decode('utf-8'))
conn.send(data.upper())
except ConnectionResetError:
break def Server(ip,post):
whw_server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
whw_server.bind((ip,post))
whw_server.listen(5)
# 链接循环
while 1:
conn, addr = whw_server.accept()
#创建线程
t = Thread(target=Communication,args=(conn,))
t.start() if __name__ == '__main__':
#主线程干Server的工作
Server('127.0.0.1',9000)

Server

# -*- coding: utf-8  -*-
# -*- Author: WangHW -*-
import socket whw_client = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
whw_client.connect(('127.0.0.1',9000)) while 1:
msg = input('>>>:').strip()
if not msg:
continue
whw_client.send(msg.encode('utf-8'))
data = whw_client.recv(1024)
print('Server Data:',data.decode('utf-8'))

Client

  运行效果如下:

  但是,这样的设计存在一个十分严重的问题:由于Server端存在性能问题,因此它不能无限的去开启线程,也就是说服务的开启的进程数或线程数都会随着并发的客户端数目地增多而增多,这会对服务端主机带来巨大的压力,甚至于不堪重负而瘫痪,于是我们必须对服务端开启的线程数加以控制,让机器在一个自己可以承受的范围内运行。 

  而解决的办法就是利用“线程池”:线程池就是用来存放线程的池子,本质还是基于多线程,只不过是对开启线程的数目加上了限制:

  基于线程池的多线程的Server端的代码如下:

# -*- coding: utf-8  -*-
# -*- Author: WangHW -*-
import socket
from concurrent.futures import ThreadPoolExecutor def Communication(conn):
# 通信循环
while 1:
try:
data = conn.recv(1024)
if not data:
break
print('Client Data:', data.decode('utf-8'))
conn.send(data.upper())
except ConnectionResetError:
break def Server(ip,post):
whw_server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
whw_server.bind((ip,post))
whw_server.listen(5)
# 链接循环
while 1:
conn, addr = whw_server.accept() pool.submit(Communication,conn) if __name__ == '__main__':
#最多可开client端为2个
pool = ThreadPoolExecutor(2) #主线程干Server的工作
Server('127.0.0.1',9000)

Server-线程池

  我们在线程池设置了最多可以有2个客户端与服务器端通信,所以当第三个客户端试图去与服务器端建立链接时是没有用的,只有当其中的一个客户端停掉才能通信

基于线程池的多并发Socket程序的实现的更多相关文章

  1. 设计模式:基于线程池的并发Visitor模式

    1.前言 第二篇设计模式的文章我们谈谈Visitor模式. 当然,不是简单的列个的demo,我们以电商网站中的购物车功能为背景,使用线程池实现并发的Visitor模式,并聊聊其中的几个关键点. 一,基 ...

  2. 【Java TCP/IP Socket】基于线程池的TCP服务器(含代码)

    了解线程池 在http://blog.csdn.net/ns_code/article/details/14105457(读书笔记一:TCP Socket)这篇博文中,服务器端采用的实现方式是:一个客 ...

  3. Linux中epoll+线程池实现高并发

    服务器并发模型通常可分为单线程和多线程模型,这里的线程通常是指“I/O线程”,即负责I/O操作,协调分配任务的“管理线程”,而实际的请求和任务通常交由所谓“工作者线程”处理.通常多线程模型下,每个线程 ...

  4. requests模块session处理cookie 与基于线程池的数据爬取

    引入 有些时候,我们在使用爬虫程序去爬取一些用户相关信息的数据(爬取张三“人人网”个人主页数据)时,如果使用之前requests模块常规操作时,往往达不到我们想要的目的,例如: #!/usr/bin/ ...

  5. Python网络爬虫之cookie处理、验证码识别、代理ip、基于线程池的数据爬去

    本文概要 session处理cookie proxies参数设置请求代理ip 基于线程池的数据爬取 引入 有些时候,我们在使用爬虫程序去爬取一些用户相关信息的数据(爬取张三“人人网”个人主页数据)时, ...

  6. 超越线程池:Java并发并没有你想的那么糟糕

    转载: 超越线程池:Java并发并没有你想的那么糟糕

  7. 基于线程池的多线程售票demo2.0(原创)

    继上回基于线程池的多线程售票demo,具体链接: http://www.cnblogs.com/xifenglou/p/8807323.html以上算是单机版的实现,特别使用了redis 实现分布式锁 ...

  8. 基于线程池的多线程售票demo(原创)

    废话不多说,直接就开撸import org.springframework.util.StopWatch;import java.util.concurrent.*;/** * 基于线程池实现的多线程 ...

  9. Tomcat如何使用线程池处理远程并发请求

    Tomcat如何使用线程池处理远程并发请求 通过了解学习tomcat如何处理并发请求,了解到线程池,锁,队列,unsafe类,下面的主要代码来自 java-jre: sun.misc.Unsafe j ...

随机推荐

  1. POJ2480 Longge's problem

    题意 Language:Default Longge's problem Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 1064 ...

  2. nginx日志格式配置

    我一向对日志这个东西有些许恐惧,因为在分析日志是需要记住不同服务器日志的格式,就拿提取ip这一项来说,有的服务器日志是在第一列,有的是第二列或则第三列等等.知道今天我才发现,日志格式是可以自定义配置的 ...

  3. ThinkPHP3.2 where方法的使用

    where方法的用法是ThinkPHP查询语言的精髓,也是ThinkPHP ORM的重要组成部分和亮点所在,可以完成包括普通查询.表达式查询.快捷查询.区间查询.组合查询在内的查询操作.where方法 ...

  4. Serv-U设置被动模式(FTP工具)

    FTP服务器在公司内网,通过端口映射把21端口映射出去. 公司一些机器也在各个省的机房内网.好在这些机器可以访问公网.由于各个地区的机器托管在各个地区机房. 我有公司防火墙的权限,可以做防火墙上做端口 ...

  5. 20165308 实验二 Java面向对象程序设计

    20165308 实验二 Java面向对象程序设计 实验二 Java面向对象程序设计 一.实验报告封面 课程:Java程序设计 班级:1653班 姓名:张士洋 学号:20165308 指导教师:娄嘉鹏 ...

  6. 判断两个IP是否处于同一子网(网段)

    如何去判断A和B两个IP是否在同一网段,假如有如下两个IP地址和子网掩码,判断他们是否是同一个网段的IP地址的方法: A IP:202.194.128.9 B IP:202.194.128.14 子网 ...

  7. MD5 SHA1 SHA256 SHA512 SHA1WithRSA 的区别

    MD5 SHA1 SHA256 SHA512 这4种本质都是摘要函数,不通在于长度  MD5 是 128 位,SHA1  是 160 位 ,SHA256  是 256 位,SHA512 是512 位. ...

  8. Hbase Shell命令详解+API操作

    HBase Shell 操作 3.1 基本操作1.进入 HBase 客户端命令行,在hbase-2.1.3目录下 bin/hbase shell 2.查看帮助命令 hbase(main):001:0& ...

  9. chmod命令详解

    Linux chmod命令 Linux/Unix 的文件调用权限分为三级 : 文件拥有者.群组.其他.利用 chmod 可以藉以控制文件如何被他人所调用. 使用权限 : 所有使用者 语法: chmod ...

  10. Apache Kafka监控之Kafka Web Console

    Kafka Web Console:是一款开源的系统,源码的地址在https://github.com/claudemamo/kafka-web-console中.Kafka Web Console也 ...