Python併發編程-IO模型-非阻塞IO實現SocketServer

  • Server.py
import socket

sk = socket.socket()
sk.bind(('127.0.0.1',8080))
sk.setblocking(False) #把socket中全部須要阻塞的方法都設爲非阻塞IO, recv,accept, recvfrom
sk.listen()
conn_l = [] #保存全部來請求server端conn鏈接
del_conn = [] #用來存儲全部已經與server端斷開的conn
while True:
    try:
        conn,addr = sk.accept() #不阻塞,但沒人連我會報錯,用try...except,直到鏈接創建
        print('鏈接創建了',addr)
        conn_l.append(conn) 
    except BlockingIOError:
        for con in conn_l:
            try:
                msg = con.recv(1024)  #不阻塞,可是沒有消息會報錯
                if msg == b'': #若是msg爲空, 把相應的鏈接加入del_conn,而後繼續
                    del_conn.append(con)
                    continue
                print(msg)
                con.send(b'hi')
            except BlockingIOError: pass
        for con in del_conn:
            conn.close()
            conn_l.remove(con) #上次相應del_conn項
        del_conn.clear() #清除del_conn列表
  • Client.py
import socket
import time
import threading
def func():
    sk = socket.socket()
    sk.connect(('127.0.0.1',8080))
    sk.send(b'hello')
    time.sleep(0.1)
    sk.send(b'world')
    time.sleep(0.1)
    print(sk.recv(1024))
    sk.close()

for i in range(20):
    threading.Thread(target=func).start()

相關文章
相關標籤/搜索