【问题标题】:TCP socket - recive only part of the messageTCP 套接字 - 只接收部分消息
【发布时间】:2016-02-21 15:13:22
【问题描述】:

我有一个使用 TCP 进行通信的客户端和服务器。我想将数据从客户端传输到服务器。

客户:

import socket
V=''
for i in range(1,400)
    V=V+"%s %s %s" %s (i,i,i)

s = socket.socket(socket.AF_INT,socket.SOCK_STREAM)
s.connect((IP,PORT))
s.send(V)
s.close

和服务器:

import socket
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind((TCP_IP, TCP_PORT))
s.listen(1)

while 1:
        connection, addr = s.accept() 
        V_recived = connection.recv(8192)

当我运行这两个脚本时,我看到客户端计算机上 V 的大小为 4485 字节,而服务器计算机上 V_received 的大小在不同运行之间发生变化:大部分时间是 1481 字节,有时是为 4485 或更少。 据我了解,使用 TCP 协议应该保证我的所有数据都会被传输,因此我不明白我在做什么错......

有什么想法吗?

【问题讨论】:

  • TCP 保证在一端塞入流中的字节将以相同的顺序从另一端掉出,并且不会丢失或重复。仅此而已,当然不支持大于一个字节的实体。

标签: python sockets tcp size buffer


【解决方案1】:

您将获得分块的 TCP 数据。这些块的大小可能取决于很多,但你永远不能相信一个包可以通过一个部分。您总是需要查看是否有更多数据传入。由于我对python不是很熟悉,我不知道确切的实现,但通常你会循环直到你得到0字节,然后把你得到的包加起来。

编辑:

试试这个:

import socket
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind((TCP_IP, TCP_PORT))
s.listen(1)

connection, addr = s.accept() 
while 1:
    data = conn.recv(8192)
    if not data: break
    print "received data:", data

在这里找到:https://wiki.python.org/moin/TcpCommunication

【讨论】:

  • 您好,感谢您的回答。据我了解,在 Python 中没有办法这样做,因为它不是必需的。我的理解是基于这篇帖子How to check if all data are received with a TCP Socket in Python...还有其他想法吗?
  • 据此:docs.python.org/3.0/library/socket.html 似乎 python recv 或多或少是围绕操作系统功能的包装器(它甚至参考 Unix 手册页 recv(2))。所以,在接受后尝试写一个新的while。 (我从这里更新我的答案。wiki.python.org/moin/TcpCommunication
  • 您提到的答案甚至表明您不能保证获得 n 个字节,并且必须执行循环,直到获得所有数据。可能有一些库,例如 PHP 的 file_get_contents,但您的示例看起来不像那样。
  • 您的示例是解决方案:我的问题是“connection, addr = s.accept()”行在服务器脚本的循环内...谢谢
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-03-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多