首页 » 编程 » Python-7.并发编程 » 正文

多线程-并发的套接字通信

我们来看看原来的例子,简单的套接字通信:

服务端:

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()

此时再次运行的时候,多个客户端连接就都可以同时工作了。

但是一台机器的性能终归不是无限的,现在的方案没有做任何控制,只要有连接进来就接收,假如此时有十万个连接进来,可能机器瞬间就宕机了,所以接下来进行处理。

 

利用进程池和线程池来处理,请看下一节。

 

 

发表评论

80 − = 78