Python 2.7 Python套接字:只能发送/接收一次消息

Python 2.7 Python套接字:只能发送/接收一次消息,python-2.7,sockets,Python 2.7,Sockets,每当我从客户端向服务器发送消息时(反之亦然),我都必须等到从另一端发送消息后,它才能注册 server.py from socket import * host = '127.0.0.1' port = 80 s = socket(AF_INET, SOCK_STREAM) s.connect((host, port)) while True: message = raw_input("Send message: ") s.send(message) print s

每当我从客户端向服务器发送消息时(反之亦然),我都必须等到从另一端发送消息后,它才能注册

server.py

from socket import *

host = '127.0.0.1'
port = 80

s = socket(AF_INET, SOCK_STREAM)
s.connect((host, port))

while True:
    message = raw_input("Send message: ")
    s.send(message)
    print s.recv(1024)
client.py

from socket import *

host = '127.0.0.1'
port = 80

s = socket(AF_INET, SOCK_STREAM)
s.bind((host, port))
s.listen(5)
c,addr = s.accept()

while True:
    message = raw_input("Send message: ")
    c.send(message)
    print c.recv(1024)
例如:

服务器发送消息

客户端没有发生任何事情

客户端发送消息

服务器和客户端都接收它们的消息


这将一次又一次地发生,很明显,您必须等待“另一方”,因为您的代码中有
原始输入调用,正在等待用户键入某些内容

也就是说,您也接收1024字节,但发送的可能要少得多。因此recv()通常会挂起,直到它有足够的数据为止(但并不总是如此,在这种情况下,它返回的数据更少)。请记住,使用低级套接字通信时,您必须自己适当地注意消息大小/边界

您可以商定一个终止字节,如“\n”,表示消息之间的边界,或者另一种策略是在每条消息前面加上几个字节,表示后面消息的大小。然后,您可以精确地记录该金额。或者只是为每条消息发送固定数量的数据

剩下的是,您仍然需要处理这样一个事实:send()和recv()有时并不发送或接收所有内容:它们有一个重要的返回值。使用
sendall
和带有
MSG_WAITALL
标志的
recv
可以解决大多数问题,但不能保证

先读这篇文章