據我所知,套接字連接的客戶端和服務器腳本不能在同一個程式(執行緒)中運行。但是下面的例子允許在套接字之間建立連接,甚至在同一個程式(執行緒)中它們之間交換訊息。
誰能解釋一下這里有什么問題?
from socket import socket, AF_INET, SOCK_STREAM, SOL_SOCKET, SO_REUSEADDR
import time
SERV_SOCK = socket(AF_INET, SOCK_STREAM)
SERV_SOCK.setsockopt(SOL_SOCKET, SO_REUSEADDR, 1)
SERV_SOCK.bind(('localhost', 8888))
SERV_SOCK.listen()
CLIENT_SOCK = socket(AF_INET, SOCK_STREAM)
CLIENT_SOCK.connect(('localhost', 8888))
CLIENT_SOCK_SERV, ADDR = SERV_SOCK.accept()
TIMESTR = time.ctime(time.time()) "\n"
CLIENT_SOCK_SERV.send(TIMESTR.encode('utf-8'))
TIME_BYTES = CLIENT_SOCK.recv(1024)
print(f"Current time: {TIME_BYTES.decode('utf-8')}")
time.sleep(1)
TIMESTR = time.ctime(time.time()) "\n"
CLIENT_SOCK.send(TIMESTR.encode('utf-8'))
TIME_BYTES = CLIENT_SOCK_SERV.recv(1024)
print(f"Current time: {TIME_BYTES.decode('utf-8')}")
uj5u.com熱心網友回復:
這段代碼中的任何一個都不會被視為“阻塞”,為什么它不起作用呢?
盡管服務器和客戶端套接字在 python 中是可編程的,但使用的套接字庫通過系統可用的 API 呼叫底層系統。
Python 介面是 Unix 系統呼叫和套接字庫介面到 Python 面向物件風格的直接音譯:socket() 函式回傳一個套接字物件,其方法實作各種套接字系統呼叫。引數型別比 C 介面中的級別更高:與 Python 檔案上的 read() 和 write() 操作一樣,接收操作的緩沖區分配是自動的,并且緩沖區長度在發送操作中是隱式的。
我強烈建議閱讀關于 python 套接字和python 套接字庫參考的How-To,因為它們將阻塞作為套接字的 3 個狀態之一(阻塞、非阻塞和超時)
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/371390.html
上一篇:限制惰性列中的專案
