簡體   English   中英

如何在Python套接字中發送和接收?

[英]How sending and receiving works in Python sockets?

我正在使用python套接字一段時間,我寫了一些很好的簡單程序。

我每次面臨的問題是關於在套接字中發送和接收方法! 給你一個基本而簡單的例子:

這是接收器(服務器!):

 import socket s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) s.bind(('', 4001)) s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) s.listen(5) while True: conn, addr = s.accept() print conn, addr data1 = conn.recv(64) data2 = conn.recv(64) print 'uname is %s , password is: %s' %(data1, data2, ) conn.close() 

這是發件人(或客戶端!):

 import socket s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) s.connect(('', 4001)) uname = raw_input('enter username>') passw = raw_input('enter password>') s.send(uname) s.send(passw) print 'exiting ...' s.close() 

所以問題是,為什么服務器在第一個s.recv()方法中同時接收uname和passw? 這意味着data2總是空的!

我真的不知道當客戶端使用s.send()時會發生什么。 我在想每個s.send()都會向目的地發送一個“數據包”(ip,port)!!

並且有人可以向我解釋為什么第二個代碼(另一個客戶端)正在工作?

 import socket s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) s.connect(('', 4001)) uname = raw_input('enter username>') s.send(uname) passw = raw_input('enter password>') s.send(passw) print 'exiting ...' s.close() 

我也遇到過類似的問題。 然后我實現了一個協議,一次發送和接收一條消息。 希望這個鏈接能夠提供很多幫助: LINK

socket.SOCK_STREAM表示您正在通過TCP進行通信。 這意味着,如果您調用send ,您的數據將被推送到系統的網絡堆棧。 兩個send呼叫都是一個接一個地調用。

如果使用TCP,則系統會決定數據包大小。 因此, unamepassw可以在一個數據包中發送,甚至可以以任何其他方式拆分。

在接收方, data1最多接收64個字節,這對於unamepassw來說已經足夠了。

上面的解釋也表明,為什么第二個工作原理:

在這里你需要一些時間發送unamepassw 在此期間,您的操作系統決定發送數據包(即刷新網絡緩沖區)。

當您使用流時,您不應該考慮數據包而是考慮流。 send調用僅意味着:在我的網絡堆棧上推送一些數據(如管道)。

如果您對數據包感興趣,可以嘗試使用UDP進行實驗:

socket.socket(socket.AF_INET, socket.SOCK_DGRAM)

使用這種類型的套接字,您的第一個發送方將按預期工作

暫無
暫無

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

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