簡體   English   中英

Python 套接字,只用一個套接字發送和接收

[英]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一個新連接(這意味着它獲得一個新套接字)並通過這個新套接字進行通信。 您不能簡單地跳過listenaccept ,因為沒有這些,來自客戶端的connect將不起作用。

可以使用 UDP ( socket.SOCK_DGRAM ) 而不是 TCP 進行這樣的設置,因為 TCP 需要在連接設置和拆除中涉及到真正的連接。 UDP 只是傳輸單個數據包。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM