[英]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,則系統會決定數據包大小。 因此, uname
和passw
可以在一個數據包中發送,甚至可以以任何其他方式拆分。
在接收方, data1
最多接收64個字節,這對於uname
和passw
來說已經足夠了。
上面的解釋也表明,為什么第二個工作原理:
在這里你需要一些時間發送uname
和passw
。 在此期間,您的操作系統決定發送數據包(即刷新網絡緩沖區)。
當您使用流時,您不應該考慮數據包而是考慮流。 send
調用僅意味着:在我的網絡堆棧上推送一些數據(如管道)。
如果您對數據包感興趣,可以嘗試使用UDP進行實驗:
socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
使用這種類型的套接字,您的第一個發送方將按預期工作
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.