多线程-并发的套接字通信
我们来看看原来的例子,简单的套接字通信:
服务端:
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 条评论