![](/img/trans.png)
[英]Python Sockets: Client and Server both sending and receiving data from each other?
[英]Python sockets; sending from client receiving on server
我正在嘗試在主機上的所有TCP / IP上發送消息。 這是可行的,盡管出於某種原因,僅需要為客戶端上的每個新消息重新初始化套接字。 例如,這是一個基本的客戶端,它發送三個單獨的消息:
import socket
host = '127.0.0.1'
class Client:
def __init__(self):
self.sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
def connect(self):
self.sock.connect((host,12347))
def send(self,message):
self.sock.sendall(message)
def close(self):
self.sock.close()
if __name__ == "__main__":
message1 = "I am message 1"
message2 = "I am message 2"
message3 = "I am message 3"
#exp = Client()
#exp.connect()
for i in range(0,3):
try:
exp = Client()
exp.connect()
if i == 0:
txt = message1
elif i == 1:
txt = message2
elif i == 2:
txt = message3
exp.send(txt)
exp.close()
print i
exp.send(txt)
except:
pass
以及接收以下內容的服務器:
#!/usr/bin/env python
import socket
class communication:
def __init__(self):
try:
host = '127.0.0.1'
self.Server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
self.Server.bind((host,12347))
self.Server.listen(1)
finally:
print "setup finished"
def recieve(self):
(connection, client_address) = self.Server.accept()
data = connection.recv(128)
return data
def close(self):
self.server.close()
if __name__ == "__main__":
exp = communication()
while True:
try:
(connection,client_address) = exp.Server.accept()
message = connection.recv(128)
finally:
print message
if message == "I am message 3":
exp.close()
您將看到在for循環的每次迭代中如何重新調用Client類。 這似乎是發送消息2和3所必需的。如果套接字在主代碼的開頭僅與connect()函數一起實例化一次,則服務器在發送第一條消息后將掛在recv()上。 。
我不明白為什么會這樣,套接字只需要在服務器端設置一次即可。 我做錯了,還是正常?
謝謝!
甚至比您想像的還要糟糕。 看一下您的服務器代碼。 exp.Server.accept()
接受來自客戶端的連接,但是connection.receive()
會完全忽略該連接並執行第二個self.Server.accept()
。 您將忽略一半的連接!
接下來,您的服務器僅接收一次消息。...即使您嘗試在連接上發送更多消息,服務器也會忽略它們。
但是您不能僅僅添加一個recv循環。 您的客戶端和服務器需要某種方式來標記消息邊界,以便服務器知道如何將其拉出。 一些基於文本的系統使用換行符。 其他的則發送服務器可以讀取的消息大小或固定大小的標頭。 例如,HTTP使用新行和數據計數的組合。
如果您想從頭開始學習套接字,請知道它們很復雜,您需要學習。 有很多構建服務器的方法,您需要了解一些權衡。 否則,從XMLRPC到zeromq,有許多框架可以為您完成一些繁重的工作。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.