socket 在 tcp 协议下通信
客户端
import socket # 创建客户端TCP协议通信 c = socket.socket() # 与指定服务端握手 c.connect(('127.0.0.1', 8080)) # 通信循环 while True:# 向服务端发送信息msg = input('>>>')if len(msg) == 0:continuec.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:continueconn.send(msg.encode('utf-8'))except ConnectionResetError as e:print(e,addr)breakconn.close() # 创建连接循环 while True:conn, addr = s.accept()# print(conn)print(addr)# 创建子线程,t = Thread(target=communication, args=(conn,addr))t.start()