在尝试使用基于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文档,但没有发现太多。我想我错过了一些东西。请帮助我解决问题。
答案 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的重试或其他数据包。