![](/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.