TCP服务端实现并发
socket 在 tcp 协议下通信
客户端
import socket # 创建客户端TCP协议通信 c = socket.socket() # 与指定服务端握手 c.connect(('127.0.0.1', 8080)) # 通信循环 while True: # 向服务端发送信息 msg = input('>>>') if len(msg) == 0:continue c.send(msg.encode('utf-8')) # 接受服务端信息 data = c.recv(1024) print(data.decode('utf-8'))
普通服务端
import socket # 创建服务端TCP通信 s = socket.socket() # 绑定ip+port s.bind(('127.0.0.1', 8080)) s.listen(5) # 连接循环 while True: # 接收用户端管道和地址 conn, addr = s.accept() print(addr) # 通信循环 while True: # 客户端若异常退出会报错,try一下 try: # 接收客户端发送的信息 data = conn.recv(1024) if len(data) == 0:break # 在服务端打印出来 print(data.decode('utf-8')) # 转大写发给服务端 conn.send(data.upper()) except ConnectionResetError: break # 客户端退出 服务端则关闭连接通道 conn.close()
此时服务端每次只能服务一个用户,因为建立连接与接受信息是同一个人在干活,要想建立另外一个连接需要先断开正在连接的这个用户
所以实现socket并发的思路是: 让建立连接与接受信息分开干活
并发服务端(线程下的实现方法)
import socket from threading import Thread # 创建TCP协议socket通信对象 s = socket.socket() s.bind(('127.0.0.1', 8080)) s.listen(5) # 创建循环通信的子线程 def communication(conn, addr): while True: try: data = conn.recv(1024) print(data.decode('utf-8')) msg = input('>>>:') if len(msg) == 0:continue conn.send(msg.encode('utf-8')) except ConnectionResetError as e: print(e,addr) break conn.close() # 创建连接循环 while True: conn, addr = s.accept() # print(conn) print(addr) # 创建子线程, t = Thread(target=communication, args=(conn,addr)) t.start()