您好我正在嘗試在 python 中創建一個非常簡單的點對點聊天程式。第一個用戶可以運行下面的 server.py 程式來系結到一個套接字。
import sys
import socket
import select
import threading
# Bind to socket
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
s.bind(('127.0.0.1', 11111))
s.listen()
def chat(conn, addr):
# Set blocking to false so that program can send and receive messages at the same time
conn.setblocking(0)
# Receive messages using select
while conn in select.select([conn], [], [], 0)[0]:
text = conn.recv(4096)
if text:
print("{}: {}".format(addr, text))
else:
return
# get user input and send message
while True:
msg = input(">>>")
conn.send(msg.encode())
if __name__ == '__main__':
## Accept connections and start new thread
(conn, addr) = s.accept()
threading.Thread(target=chat, args=([conn, addr])).start()
然后另一個用戶可以使用netcat連接到服務器并進行通信。但是,該程式只能獲取用戶的輸入并發送到另一端。對方用戶無法發送訊息。

uj5u.com熱心網友回復:
input()塊,所以你正在通過你的chat函式并進入input()回圈并且永遠不會再次檢查接收。在執行緒上接收并在主執行緒上進入輸入回圈。TCP 是全雙工的,因此您可以在兩個執行緒上同時發送/接收,而無需關閉阻塞。
send()我還需要netcat在行緩沖中添加一個換行符。
import socket
import threading
# Bind to socket
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
s.bind(('', 11111))
s.listen()
def chat(conn, addr):
while True:
text = conn.recv(4096)
if not text: break
print("{}: {}".format(addr, text))
if __name__ == '__main__':
## Accept connections and start new thread
conn, addr = s.accept()
threading.Thread(target=chat, args=(conn, addr), daemon=True).start()
# get user input and send message
while True:
msg = input(">>>")
conn.sendall(msg.encode() b'\n')
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/512334.html
標籤:Python插座非阻塞
上一篇:套接字未完全填充接收緩沖區
