1、实现io多路复用利用select

s1同时接受三个客户端(开启了三个服务器端口)

 #!/usr/bin/env python
# -*- coding: utf-8 -*- import socket
import select sk = socket.socket()
sk.bind(('127.0.0.2', 9001))
sk.listen() sk1 = socket.socket()
sk1.bind(('127.0.0.2', 9002))
sk1.listen() sk2 = socket.socket()
sk2.bind(('127.0.0.2', 9003))
sk2.listen() inputs = [sk, sk1, sk2]
while True: # [sk, sk1, sk2]select 内部自动监听sk1,sk,sk2三个对象,一旦某个句柄 # 如果有人连接sk1,sk2
# r_list = [sk1,sk2]
r_list, w_list, e_list = select.select(inputs, [], [], 1)
# 1,是等待1秒的意思
for sk in r_list:
conn, address = sk.accept()
conn.sendall(bytes('hello', encoding='utf-8'))
conn.close()
for sk in e_list:
inputs.remove(sk

s1

 #!/usr/bin/env python
# -*- coding: utf-8 -*-
import socket obj = socket.socket()
obj.connect(('127.0.0.2', 9001)) content = str(obj.recv(1024), encoding='utf-8')
print(content) obj.close()

c1

 #!/usr/bin/env python
# -*- coding: utf-8 -*-
import socket obj = socket.socket()
obj.connect(('127.0.0.2', 9002)) content = str(obj.recv(1024), encoding='utf-8')
print(content) obj.close()

c2

 #!/usr/bin/env python
# -*- coding: utf-8 -*-
import socket obj = socket.socket()
obj.connect(('127.0.0.2', 9003)) content = str(obj.recv(1024), encoding='utf-8')
print(content) obj.close()

c3

  2、实现io多路的复用利用select

s1中只有一个服务器端口,底层用select,类似与,同时接三个电话,开免提,谁说话回答谁

 #!/usr/bin/env python
# -*- coding: utf-8 -*- import socket
import select sk1 = socket.socket()
sk1.bind(('127.0.0.2', 9000))
sk1.listen() inputs = [sk1]
while True: # r_list 中一开始只有服务器sk1,小军连接时,会把小军加入到inputs r_list, w_list, e_list = select.select(inputs, [], inputs, 1)
# 1,是等待1秒的意思
print('正在监听的socket对象%d' % len(inputs))
print(r_list)
for sk1_or_conn in r_list:
# 每一个连接对象
if sk1_or_conn == sk1:
conn, address = sk1_or_conn.accept()
inputs.append(conn)
else:
try: # 有老用户发消息了
data_bytes = sk1_or_conn.recv(1024)
data_str = str(data_bytes,encoding='utf-8')
sk1_or_conn.sendall(bytes(data_str+'好', encoding='utf-8'))
except Exception as ex:
inputs.remove(sk1_or_conn)

server

 # 只需重复运行三次即可
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import socket obj = socket.socket()
obj.connect(('127.0.0.2', 9000)) while True:
inp = input('>>>>')
obj.sendall(bytes(inp, encoding='utf-8'))
ret = str(obj.recv(1024), encoding='utf-8')
print(ret) obj.close()

c3(当三个客户端)

  3、io多路复用socketserver

 #!/usr/bin/env python
# -*- coding: utf-8 -*-
import socketserver class MyServer(socketserver.BaseRequestHandler):
def handle(self):
conn = self.request # request 不要加括号,加括号显示不出来东西,
conn.sendall(bytes('欢迎来到梦幻西游', encoding='utf-8'))
while True:
ret_bytes = conn.recv(1024)
ret_str = str(ret_bytes, encoding='utf-8')
if ret_str == 'q':
break
conn.sendall(bytes(ret_str + "好", encoding='utf-8')) if __name__ == '__main__':
server = socketserver.ThreadingTCPServer(('127.0.0.2', 1324), MyServer)
server.serve_forever()

socketserver

 #!/usr/bin/env python
# -*- coding: utf-8 -*- import socket obj = socket.socket()
obj.connect(('127.0.0.2', 1324)) # 阻塞
re_bytes = obj.recv(1024)
ret_str = str(re_bytes, encoding='utf-8')
print(ret_str)
while True:
inp = input('请输入要发送的内容:')
if inp == 'q':
obj.sendall(bytes(inp, encoding='utf-8'))
break
else:
obj.sendall(bytes(inp, encoding='utf-8'))
ret = str(obj.recv(1024), encoding='utf-8') print(ret) obj.close()

client

  4、io多路复用select

outputs的使用,inputs的使用

 #!/usr/bin/env python
# -*- coding: utf-8 -*- import socket
import select sk1 = socket.socket()
sk1.bind(('127.0.0.2', 9000))
sk1.listen() inputs = [sk1]
outputs = []
message_dict = {} while True: # r_list 中一开始只有服务器sk1,小军连接时,会把小军加入到inputs r_list, w_list, e_list = select.select(inputs, outputs, inputs, 1)
# 1,是等待1秒的意思
print('正在监听的socket对象%d' % len(inputs))
print(r_list)
for sk1_or_conn in r_list:
# 每一个连接对象
if sk1_or_conn == sk1:
# 表示有新用户连接
conn, address = sk1_or_conn.accept()
inputs.append(conn)
message_dict[conn] = [] # 建立了一个字典{小军:[]}
else:
try: # 有老用户发消息了
data_bytes = sk1_or_conn.recv(1024)
except Exception as ex:
inputs.remove(sk1_or_conn)
else:
# 用户正常发消息
data_str = str(data_bytes, encoding='utf-8')
message_dict[sk1_or_conn].append(data_str) # {小军:1233}
outputs.append(sk1_or_conn) # [小军]
# 谁发消息就会在w_list中显示。
for conn in w_list:
recv_str = message_dict[conn][0]
del message_dict[conn][0]
conn.sendall(bytes(recv_str + '好', encoding='utf-8'))
outputs.remove(conn) for sk in e_list:
inputs.remove(sk)

s1

 #!/usr/bin/env python
# -*- coding: utf-8 -*-
import socket obj = socket.socket()
obj.connect(('127.0.0.2', 9000)) while True:
inp = input('>>>>')
obj.sendall(bytes(inp, encoding='utf-8'))
ret = str(obj.recv(1024), encoding='utf-8')
print(ret) obj.close()

c1

最新文章

  1. spring boot 自动部署方案
  2. PHP 表单验证--安全性--小记
  3. 根据SQL Server排序规则创建顺序GUID
  4. android:ems
  5. 安装和卸载windows程序
  6. 细谈JavaScript中的书写规范
  7. The Angles of a Triangle
  8. 获得创建临时表的session id
  9. keil提示:missing ';' before 'XXX'但又找不到是哪里少了分号——已解决!
  10. hdu 5493 (树状数组)
  11. python基本面试题
  12. Codeforces Round #433 Div. 1
  13. Vue学习1:实例及生命周期
  14. 【杂谈】Starter Template
  15. mobx 入门
  16. python 目录切换
  17. 【git】git简单使用教程
  18. pycharm + git 的集成使用
  19. windows 7 php 7.1 命令行 执行 中文文件名 的PHP文件
  20. 【centos6.5】安装LAMP

热门文章

  1. Object的对象的相关方法
  2. 堆排序用JavaScript实现
  3. JS: javascript 点击事件执行两次js问题 ,解决jquery绑定click事件出现点击一次执行两次问题
  4. pandas学习笔记之删除指定列
  5. 2020牛客寒假算法基础集训营4-I 匹配星星【贪心】
  6. linux 搭建python虚拟环境
  7. Pikachu-over permission(越权操作)
  8. 原型链污染(Node.js污染,javasrcipt原型链污染的)
  9. Win10安装3 —— U盘启动工具安装
  10. 辣些数据结构的思维题(思维题好难一个都不会TAT)