【发布时间】:2015-12-12 06:52:33
【问题描述】:
我是 Python 的初学者,所以请考虑一下我无法一次性提供完整的信息。
我的要求是:
我正在实现一个基于 Python 的套接字接收器。实施已完成,但我必须处理以下消息/数据流:
1) 数据流将包含 4 种不同类型的消息。每个都有一个我正在使用的消息头(1-4)
type_msg=struct.unpack('B',data[0])[0]
2) 第二部分是接下来的 4 位将根据标头具有每种类型数据的实际长度。所以,
actual_len = struct.unpack('i', data[1:5])[0]
3) 下一部分是处理接收到的数据并使用它。接收到的数据长度可以取**rcv_len = len(data)**
在收到的数据少于/多于实际长度的情况下,我遇到了问题。我有使用actual_len-rcv_len 得到的delta-length
在此之后我无法处理代码。到目前为止,接收增量消息然后将其附加到接收到的数据的最佳方法是什么。我也想将数据写入文件。
我已阅读有关 data.append 的信息,但不太确定如何实现它。我应该再次使用 conn.recv(del_len) 接收数据还是做其他事情。
任何指导都会非常有帮助。
在下面添加代码:
BUFFER_SIZE=40960
import socket
import struct
class mySocket:
def __init__(self, sock=None):
if sock is None:
self.sock = socket.socket(
socket.AF_INET, socket.SOCK_STREAM)
self.sock.bind(('', 9988))
self.sock.listen(1)
else:
self.sock = sock
def receive_data(self):
# Wait for a connection
print >>sys.stderr, 'waiting for a connection'
conn, client_address= self.sock.accept()
print "Connected to client with IP---->", client_address
while True:
data = conn.recv(BUFFER_SIZE)
if not data:
print "Connection is Broken.."
break
else:
if data<5:
print "MSG HEADER STILL NOT COMPLETELY RECEIVED"
else:
type_msg=struct.unpack('B',data[0])
msg_type = type_msg[0]
rcv_len = len(data)
actual_len = struct.unpack('i', data[1:5])[0]
print "Received Length: ",rcv_len
print "Actual Length : ",actual_len
if msg_type == 1:
f_cfg = open("test.xml", "wb")
if rcv_len < actual_len:
del_len = actual_len-rcv_len
print "Delta length :",del_len
while (del_len):
print "Receiving Falcon Config File..."
print "Actual Length : ",actual_len,"and total length now is",rcv_len+del_len
f_cfg.write(data[5:rcv_len]+data[del_len]) //Feel something wrong in this.
else:
print "Writing Falcon config"
f_cfg.write(data[5:])
f_cfg.close()
else:
print "INVALID MESSAGE TYPE. DATA CORRUPTED !!"
break
conn.send("Data Received")
conn.close()
【问题讨论】: