socket recv 一直返回1
时间: 2023-12-14 08:02:07 浏览: 181
关于socket阻塞与非阻塞情况下的recv、send、read、write返回值.zip
5星 · 资源好评率100%
`socket.recv(size)` 方法返回接收到的数据,其中 `size` 参数指定要接收的最大字节数。如果 `recv()` 方法一直返回1,有可能是因为你在循环中不断调用该方法,但没有检查接收到的数据是否已经包含了完整的消息。
实际上,`recv()` 方法返回的1表示接收到了1个字节的数据,这并不意味着你已经接收到了完整的消息。你需要在循环中不断接收数据,直到接收到了完整的消息为止。通常情况下,你需要在消息中包含一些分隔符,比如换行符 `\n` 或空格符 ` `,以便在接收到分隔符时知道已经接收到了完整的消息。
以下是一个示例代码,用来接收一条包含 `\n` 分隔符的消息:
```python
import socket
def recv_until(sock, delimiter='\n'):
buffer = ''
while not buffer.endswith(delimiter):
data = sock.recv(1024)
if not data:
break
buffer += data.decode('utf-8')
return buffer.rstrip(delimiter)
# 创建 socket 连接
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.connect(('localhost', 8000))
# 接收消息
message = recv_until(sock)
print(message)
# 关闭连接
sock.close()
```
在上述代码中,我们定义了一个 `recv_until()` 函数,该函数用于接收一条以 `\n` 为分隔符的消息。该函数会循环调用 `socket.recv()` 方法,每次接收最多 1024 字节的数据,直到接收到了以 `\n` 结尾的完整消息为止。最后,函数会返回去掉分隔符的消息字符串。
阅读全文