我发现自己在使用 Python 的Socket Server示例。这将使您继续执行SendFrame()
、ReceiveFrame()
和DeliverData()
例程。
MakeFrame()
和ExtractData()
, 将根据您需要来回发送的数据量而有很大差异。我将尝试挖掘一些我过去使用过的好例子。
如果您正在寻找一站式解决方案,我建议您研究Twisted。它有一个明确的学习曲线,但对你来说可能是值得的。请注意,如果您想使用pyInstaller
or将 Python 代码打包到 exe 中py2exe
,基于我读过的许多线程,Twisted 可能会给您带来麻烦。
所以回顾我的笔记后,框架方面对我来说是一个痛苦的话题,因为我找不到任何好的例子来帮助我。相反,我从头开始写了一个,并且(现在仍在)对其进行了调整。
当您阅读套接字编程时,您肯定会看到,仅仅因为您发送了所有数据(socket.sendall()
)并不意味着您将在第一次之后收到所有数据socket.recv()
。这增加了消息框架问题的一些复杂性。由于网络上缺乏示例,下面我有一个我现在在几个进程中使用的精简版本。
更新
所以在进一步测试了欠重/爆裂之后,我离开了正则表达式并逐个字符地处理流,这大大提高了它的性能。
SendFrame()
, ReceiveFrame()
, ExtractData()
,DeliverData()
例子:
MESSAGE_FRAME_START = '@'
MESSAGE_FRAME_END = '#'
def process_raw_socket_message_stream(raw_message_stream):
message_list = []
cmd = ''
last_footer_idx = message_string.rfind(MESSAGE_FRAME_END)
cmd_str_len = len(message_string)
byte_cnt = 0
while (byte_cnt <= last_footer_idx):
cmd_chr = message_string[byte_cnt]
cmd += cmd_chr
if cmd_chr == MESSAGE_FRAME_START:
cmd = MESSAGE_FRAME_START
elif cmd_chr == MESSAGE_FRAME_END:
message_list.append(cmd)
byte_cnt += 1
# Remove the parsed data
if last_footer_idx > 0:
message_string = message_string[last_footer_idx+1:]
return message_list, message_string
def add_message_frames(unframed_message):
return MESSAGE_FRAME_START + unframed_message + MESSAGE_FRAME_END
def remove_message_frames(framed_message):
clean_message = framed_message.lstrip(MESSAGE_FRAME_START)
clean_message = clean_message.rstrip(MESSAGE_FRAME_END)
return clean_message
def process_messsage(clean_message):
# Do what needs to be done
pass
def send_data(mysocket, payload):
framed_payload = add_message_frames(payload)
mysocket.sendall(framed_payload)
def receive_data(mysocket, byte_size=1024):
data = ''
while(1):
try: # Wait for data
data += mysocket.recv(byte_size)
if(data != '') and (data != None):
# Decode all messsages
message_list, remaining_data = process_raw_socket_message_stream(data)
# Process all of the messages
for messsage in message_list:
process_messsage(remove_message_frames(message))
# Store the remaining data
data = remaining_data
except:
print "Unexpected Error"