[英]Python Socket, send and recv with only one socket
我將使用 python 實現一個基於套接字的客戶端-服務器應用程序。 客戶端向服務器發送一個文件,服務器應該向客戶端返回一個響應。
這是服務器端的代碼:
TCP_IP = 'localhost'
TCP_PORT = 9001
BUFFER_SIZE = 1024
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
sock.bind((TCP_IP, TCP_PORT))
f = open("test_file", 'wb')
while True:
data = sock.recv(BUFFER_SIZE)
if not data:
f.close()
break
f.write(data)
f.close()
response = Function("test_file")
self.sock.sendall(response.encode())
這是客戶端的代碼:
TCP_IP = 'localhost'
TCP_PORT = 9001
BUFFER_SIZE = 1024
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((TCP_IP, TCP_PORT))
f = open("input_file", 'rb')
while True:
l = f.read(BUFFER_SIZE)
x = ''
while (l):
s.send(l)
l = f.read(BUFFER_SIZE)
if not l:
x = s.recv(10).decode()
print("Response: ", x)
f.close()
s.close()
break
它的工作原理如下。 客戶端正確發送文件,文件保存在服務器端。 但是當服務器試圖取回響應時,客戶端不接受它,如果我刪除客戶端上的 recv() function,服務器會通過我的網絡發送響應(現在我在本地工作),但是,如果我保留recv() function。 沒有任何反應,計算響應。 我的理解是 recv() 不接受數據? 任何想法?
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
sock.bind((TCP_IP, TCP_PORT))
f = open("test_file", 'wb')
while True:
data = sock.recv(BUFFER_SIZE)
您正在使用 TCP:這里服務器必須listen
服務器套接字,然后accept
一個新連接(這意味着它獲得一個新套接字)並通過這個新套接字進行通信。 您不能簡單地跳過listen
和accept
,因為沒有這些,來自客戶端的connect
將不起作用。
可以使用 UDP ( socket.SOCK_DGRAM
) 而不是 TCP 進行這樣的設置,因為 TCP 需要在連接設置和拆除中涉及到真正的連接。 UDP 只是傳輸單個數據包。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.