我想使用套接字在服务器和客户机之间创建一个简单的通信。cliend应该发送一条消息,然后服务器向客户端发送一条消息。你知道吗
这是我的客户代码:
import socket
s = socket.socket()
HOST = '127.0.0.1'
s.connect((HOST, 1234))
s.send('Hi')
print ('Client send')
print s.recv(1024)
s.close
这是我的服务器代码:
import socket
s = socket.socket()
HOST = '127.0.0.1'
s.bind((HOST, 1234))
s.listen(5)
while True:
c, addr = s.accept()
c.send('Hi client')
c.close()
但它只打印“客户端发送”。你知道吗
潜在的问题是,您将套接字视为消息总线(每次一条消息,总是完全接收),而实际上它们是字节流。你知道吗
没有人能保证发送X字节的数据会到达相反的方向。它可以是X1,X2,X3,Y1,其中X1+X2+X3=X,Y1是下一条消息Y的开始,以及所有其他类型的组合和错误。你知道吗
为了解决这个问题,现实世界中的客户机-服务器应用程序使用协议。以HTPP为例:请求总是以HTTP开始,以两行换行结束。在这个块中,有一个Content-Length头告诉客户端要读取多少字节,而不管块大小。你知道吗
因此,要真正解决您的问题,您要么编写一个完整的协议,要么构建一个为您实现这一点的库,例如Twisted、Nanomsg或ZeroMQ
在服务器中,发送“Hi client”后,必须等待客户端读取消息。你知道吗
你可以做两件事之一:
在服务器的套接字上使用
shutdown()
,请参见https://docs.python.org/2/library/socket.html#socket.socket.shutdown在服务器上执行
.recv(..)
,这将在客户端执行close
操作后终止 读取服务器发送的回复后的套接字。更新:在我的系统(MacOSX)上尝试过。启动了两个python解释器。将服务器代码一字不差地粘贴到一个服务器中;服务器现在已启动并正在运行并接受连接。你知道吗
在另一个python解释器客户机shell中,我执行了以下操作
这表明-至少在我的系统上-代码按预期工作。你知道吗
我不能责备你的问题,因此投票结束你的问题。你知道吗
以下是我使用的代码:
我得到的结果是:
如果问题仍然存在,请在您的问题中添加更多详细信息,说明您的设置仍然无法工作的原因和方式。也许问题只是你如何运行程序。请添加有关此的详细信息。你知道吗
相关问题 更多 >
编程相关推荐