【问题标题】:Can socket receive infinite data stream python?套接字可以接收无限数据流python吗?
【发布时间】:2019-03-16 02:56:03
【问题描述】:

在尝试使用基于 python 的套接字时,我有 2 个问题无法解决。请帮助我。这是我的示例套接字代码:

import socket
import threading
import chardet
bind_ip = '0.0.0.0'
bind_port = 9999

server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server.bind((bind_ip, bind_port))
server.listen(1)  # max backlog of connections

print (('Listening on {}:{}').format(bind_ip, bind_port))


def handle_client_connection(client_socket):
    request = client_socket.recv(4096 )
    result = chardet.detect(request)
    print(result)
    print (request.decode(result['encoding']))
    client_socket.send('ACK!'.encode(result['encoding']))
    client_socket.close()

while True:
    client_sock, address = server.accept()
    print (('Accepted connection from {}:{}').format(address[0], address[1]))
    client_handler = threading.Thread(
        target=handle_client_connection,
        args=(client_sock,)  # without comma you'd get a... TypeError: handle_client_connection() argument after * must be a sequence, not _socketobject
    )
    client_handler.start()

上面是服务器,下面是客户端:

import socket

client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

client.connect(('127.0.0.1', 9999))

client.send(str('test data').encode("utf-16"))

response = client.recv(4096)

print(response.decode("utf-16"))

现在的问题:

1) 这个语句中的数字是什么意思:client.recv(4096)?什么是4096,是接收数据的位还是千字节? 2)我可以通过套接字接收无限数据流吗?意思是,正如client.recv(4096)这个语句,不管4096的意思是什么,可能是字节,那么套接字将只接收4096字节的数据。我无法控制通过套接字接收的数据的大小,因此,我可以概括它以通过套接字接受任何大小的数据吗?

请帮我解答上述问题。我尝试了 socket 的 python 文档,但没有找到太多。我想我错过了什么。请帮助我度过难关。

【问题讨论】:

  • 请阅读官方文档here。网上有很多关于套接字的教程,你可以熟悉它们和迭代的概念
  • client_socket.close() 不是无限循环的一部分! ACK 是不同的线程,所以如果你不发送数据,你需要检查连接是否处于活动状态。数据包大小也不能大于 1600 字节。每个发送/接收的数据包都会被检查并返回一个唯一的数字。无限套接字一般设计为 UDP(忽略附加信息)。除未延迟的 TCP 连接外,所有数据包都有 50 毫秒的延迟(硬件冻结、缓冲内存耗尽、内存不足、硬件读取延迟等)。
  • 1.byte 2.你可以,使用while 1: recv(4096)
  • @obgnaw 是的,但需要 2 个线程用于发送/接收,否则不是 无限循环2 thread2 socket 哪个更好?在 TCP 连接上:只有 1(一个)工作可以做(读/写),所以完全同步进程!
  • @dsgdfg 通常,我们接收数据,然后处理它,然后发送响应。所以我们不需要它是无限的,如果必须,使用 2 个套接字。

标签: python python-3.x python-2.7 sockets


【解决方案1】:

根据文档 “如果消息太长而无法放入提供的缓冲区,则可能会丢弃多余的字节,具体取决于接收消息的套接字类型。” 在这里找到 "https://linux.die.net/man/2/recv" 这是来自 python 3.6 文档 “一次接收的最大数据量由 bufsize 指定。参见 Unix 手册页 recv(2)” 在这里找到 “https://docs.python.org/3.6/library/socket.html” 所以它是一个字节对象,它实际上可能会根据协议截断消息。因此消息完整性由下一层处理。因此,您可能会丢失部分 UDP 数据包,如果消息太大而无法放入缓冲区,您将获得重试或额外的 TCP 数据包。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-09-24
    • 1970-01-01
    • 2016-08-04
    • 1970-01-01
    • 2019-01-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多