多线程-并发的套接字通信
我们来看看原来的例子,简单的套接字通信:
服务端:
import socket
server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server.bind(("127.0.0.1", 9090))
server.listen(5)
while True:
conn, addr = server.accept()
while True:
try:
data = conn.recv(1024)
if not data: break
conn.send(data.upper())
except ConnectionResetError:
break
conn.close()
server.close()
客户端:
import socket
client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
client.connect(("127.0.0.1", 9090))
while True:
msg = input(">>:").strip()
if not msg: continue
client.send(msg.encode("UTF-8"))
data = client.recv(1024)
print(data.decode("UTF-8"))
client.close()
客户端运行效果:
>>:sss SSS >>:dsf DSF
以上例子只是实现了一个简单的套接字通信,没有并发的效果,如果此时启动多个客户端进行连接,其他的客户端就是阻塞(卡住),需要等待前一个连接断开,下一个连接才可以工作。
需要并发效果就需要用到多线程,我们来修改一下:
服务端:
import socket
from threading import Thread
def communicate(conn):
while True:
try:
data = conn.recv(1024)
if not data: break
conn.send(data.upper())
except ConnectionResetError:
break
conn.close()
def server(ip, port):
server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server.bind((ip, port))
server.listen(5)
while True:
conn, addr = server.accept()
t = Thread(target=communicate, args=(conn,)) # 每建立了一个新连接,就创建一个线程去处理,各线程间互就不影响
t.start()
server.close()
if __name__ == '__main__':
server("127.0.0.1", 9090)
客户端:
import socket
client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
client.connect(("127.0.0.1", 9090))
while True:
msg = input(">>:").strip()
if not msg: continue
client.send(msg.encode("UTF-8"))
data = client.recv(1024)
print(data.decode("UTF-8"))
client.close()
此时再次运行的时候,多个客户端连接就都可以同时工作了。
但是一台机器的性能终归不是无限的,现在的方案没有做任何控制,只要有连接进来就接收,假如此时有十万个连接进来,可能机器瞬间就宕机了,所以接下来进行处理。
利用进程池和线程池来处理,请看下一节。
共有 0 条评论