我正在网络学习的那一点上,我刚刚意识到事情并不完美,网络数据包可能会失去同步,并且可能无法将所有内容发送到一个数据包中。
我的程序适用于通过套接字发送的小数据,但不适用于大文件。我每次尝试发送一个大文件时都会ValueError: Expecting ','
或Expecting ':'
,我认为这是因为我的接收功能并不好。我已经阅读了很多关于如何实现自己的协议来从套接字读取信息的内容,但我仍然没有找到关于如何实现它的信息。
我的程序序列化计算机上的一些信息,并通过JSON将其发送到另一台计算机。我听说JSON会自动处理发送数据包信息或类似信息,但我不清楚这是什么意思。
无论如何,这是我的接收功能:
def recieve(node, s, timeout=2):
s.setblocking(False)
#array of all data
all_data = []
begin = time.time()
while True:
#If data was received, break after timeout
if all_data and time.time()-begin > timeout:
break
#If no data received at all, wait some more
elif time.time() - begin > timeout * 2:
break
try:
data = ''
while len(data) < BUFFER_SIZE:
data += s.recv(BUFFER_SIZE - len(data))
if data:
all_data.append(data.decode('utf-8'))
#Reset begin for timeout
begin = time.time()
except:
pass
return json.loads(''.join(all_data))
我只使用`sendall(dumps((data1,data2,data3,data4,data5))。encode())来编码我的python信息(可以是字典,列表等)。
我不确定我的超时是否有任何意义,我是网络编程的完全初学者,而且我不确定从何处开始。我应该使用socket.makefile()
吗?使用JSON时是否仍需要实现网络协议?如果需要,我如何实现网络包装系统?
提前非常感谢!