我想使用套接字在服务器和客户端之间创建简单的通信。 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()
但它只打印"客户端发送"
答案 0 :(得分:1)
在您的服务器中,在发送' Hi client'你必须等待客户阅读信息。
你可以做以下两件事之一:
在服务器的套接字上使用shutdown()
,请参阅https://docs.python.org/2/library/socket.html#socket.socket.shutdown
在服务器中执行.recv(..)
,这将在客户端close
之后终止
读取服务器发送的回复后的套接字。
更新:在我的系统上尝试了它(MacOSX)。开始了两个python解释器。将服务器代码逐字粘贴;服务器现在已启动并正在运行并接受连接。
在另一个python解释器中,客户端shell,我做了以下
>>> import socket
>>> HOST = '127.0.0.1'
>>> def test():
... s = socket.socket()
... s.connect((HOST, 1234))
... s.send('Hi')
... print s.recv(1024)
... s.close() # <== Note function call here!
...
>>> test()
Hi client
>>> test()
Hi client
>>> test()
Hi client
>>> test()
Hi client
这表明 - 至少在我的系统上 - 代码按预期工作。
答案 1 :(得分:0)
我无法重新解决您的问题,因此投票结束您的问题。
这是我使用的代码:
import socket
import threading
HOST = '127.0.0.1'
PORT = 12345
def client():
s = socket.socket()
s.connect((HOST, PORT))
s.send('Hi')
print ('Client send')
print s.recv(1024)
s.close()
def server():
s = socket.socket()
s.bind((HOST, PORT))
s.listen(5)
c, addr = s.accept()
c.send('Hi client')
c.close()
if __name__ == "__main__":
server = threading.Thread(target=server)
server.start()
client()
server.join()
这是我得到的输出:
$ python test.py
Client send
Hi client
如果问题仍然存在,请在您的问题中添加其他详细信息,说明您的设置仍然不起作用的原因和方式。也许问题只是关于你如何运行程序。请添加有关此内容的详细信息。
答案 2 :(得分:0)
潜在的问题是您将套接字视为消息总线(一次一条消息,始终完全接收),实际上它们是字节流。
没有人保证发送X字节的数据会达到相反的一面。它可以是X1,X2,X3,Y1,其中X1 + X2 + X3 = X,Y1是下一条消息Y的开头。还有所有其他类型的组合和错误。
为了解决这个问题,现实世界的客户端 - 服务器应用程序使用协议。以HTPP为例:一个请求始终使用HTTP启动,并以两个换行符结束。在这个块中,有一个Content-Length标头告诉客户端要读取多少字节 - 无论块大小如何。
因此,要真正解决您的问题,您必须编写完整的协议,或者基于为您执行此操作的库构建 - 例如Twisted,Nanomsg或ZeroMQ