1

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

发件人站点算法:

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

接收端算法:

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

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

4

1 回答 1

3

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

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

如果您正在寻找一站式解决方案,我建议您研究Twisted。它有一个明确的学习曲线,但对你来说可能是值得的。请注意,如果您想使用pyInstalleror将 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"
于 2012-04-22T22:26:11.130 回答