【发布时间】: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 thread与2 socket哪个更好?在 TCP 连接上:只有 1(一个)工作可以做(读/写),所以完全同步进程! -
@dsgdfg 通常,我们接收数据,然后处理它,然后发送响应。所以我们不需要它是无限的,如果必须,使用 2 个套接字。
标签: python python-3.x python-2.7 sockets