Python 2.7 Python套接字:只能发送/接收一次消息
每当我从客户端向服务器发送消息时(反之亦然),我都必须等到从另一端发送消息后,它才能注册 server.pyPython 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
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
可以解决大多数问题,但不能保证
先读这篇文章