在python中实现“最简单协议”伪代码算法

时间:2012-04-22 22:20:19

标签: python telecommunication

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

发件人站点算法:

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

接收站点算法:

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

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

1 个答案:

答案 0 :(得分:3)

我发现自己使用了Python的Socket Server示例。这样您就可以使用SendFrame()ReceiveFrame()DeliverData()例程。

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

如果您正在寻找一站式解决方案,我建议您查看Twisted。它有一定的学习曲线,但对你来说可能是值得的。请注意,如果您想使用pyInstallerpy2exe将Python代码打包到exe中,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"