gpt4 book ai didi

python - 用python实现 "Simplest Protocol"伪代码算法

转载 作者:行者123 更新时间:2023-11-30 23:44:08 31 4
gpt4 key购买 nike

使用两台不同的计算机,我必须实现发送方和接收方算法来发送和接收帧。我是一名实力雄厚的程序员,但对网络编程和 python 相对较新。算法如下。

发件人站点算法:

while(true)
{
WaitForEvent();
if(Event(RequestToSend))
{
GetData();
MakeFrame();
SendFrame();
}

接收端算法:

while(true)
{
WaitForEvent();
if(Event(ArrivalNotification))
{
ReceiveFrame();
ExtractData();
DeliverData();
}

我必须在两台独立的计算机上实现这些算法,一台作为发送方,另一台作为接收​​方。我不知道从哪里开始或寻找例子。我做了一些研究,但运气不佳。如果有人可以提供示例代码或一篇关于实现此功能的好文章,那将会有很大的帮助。

最佳答案

我发现自己使用Python的Socket Server例子。这将使您继续SendFrame() , ReceiveFrame() ,和DeliverData()例程。

MakeFrame()ExtractData() ,将根据您需要来回发送的数据量而有很大差异。我会尝试挖掘一些我过去使用过的好例子。

如果您正在寻找一站式解决方案,我建议您查看 Twisted 。它有一个明确的学习曲线,但对您来说可能是值得的。请注意,如果您想使用 pyInstaller 将 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"

关于python - 用python实现 "Simplest Protocol"伪代码算法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10272630/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com