套接字可以接收无限数据流python吗?

时间:2018-10-11 05:47:10

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

在尝试使用基于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字节的数据。我无法控制通过套接字接收的数据大小,因此,我可以将其概括为通过套接字接受任何大小的数据吗?

请帮助我获得上述查询的答案。我尝试了套接字的python文档,但没有发现太多。我想我错过了一些东西。请帮助我解决问题。

1 个答案:

答案 0 :(得分:0)

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