首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用python实现“最简单协议”伪码算法

用python实现“最简单协议”伪码算法
EN

Stack Overflow用户
提问于 2012-04-23 06:20:19
回答 1查看 1.6K关注 0票数 1

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

发送者站点算法:

代码语言:javascript
复制
while(true)
{
    WaitForEvent();
    if(Event(RequestToSend))
    {
        GetData();
        MakeFrame();
        SendFrame();
    }

接收方站点算法:

代码语言:javascript
复制
while(true)
{ 
    WaitForEvent();
    if(Event(ArrivalNotification))
    {
        ReceiveFrame();
        ExtractData();
        DeliverData();
    }

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-04-23 06:26:11

我发现自己在使用Python的Socket Server示例。这将使您进入SendFrame()ReceiveFrame()DeliverData()例程。

根据需要来回发送的数据量,MakeFrame()ExtractData()会有很大的不同。我会试着挖掘出一些我过去用过的好例子。

如果你正在寻找一个一站式的解决方案,我建议你去看看Twisted。它有一个明确的学习曲线,但对你来说可能是值得的。请注意,如果您想使用pyInstallerpy2exe将Python代码打包到可执行文件中,根据我所阅读的大量线程,Twisted可能会给您带来麻烦。

因此,在回顾我的笔记之后,框架方面对我来说是一个痛苦的主题,因为我找不到任何好的例子来帮助我。相反,我从头开始写了一个,并且已经(现在仍然在)调整它。

当您阅读套接字编程时,您一定会发现,仅仅因为发送了所有数据(socket.sendall())并不意味着您将在第一个socket.recv()之后收到所有数据。这增加了消息组帧问题的一些复杂性。由于缺乏网络上的例子,下面我有一个我现在在几个过程中使用的精简版本。

更新

因此,在进一步测试under heavy / bursting之后,我离开了正则表达式,逐个字符地处理流,这极大地提高了它的性能。

SendFrame()ReceiveFrame()ExtractData()DeliverData()示例:

代码语言:javascript
复制
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"
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10272630

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档