1

2台の異なるコンピューターを使用して、フレームを送受信するための送信側と受信側のアルゴリズムを実装する必要があります。私は強力なプログラマーですが、ネットワークプログラミングとPythonには比較的慣れていません。アルゴリズムは以下のとおりです。

送信者サイトのアルゴリズム:

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

受信者サイトのアルゴリズム:

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

これらのアルゴリズムを2台の別々のコンピューターに実装する必要があります。1つは送信者として、もう1つは受信者としてです。どこから始めればいいのか、例を探すのかわかりません。私は少し運が悪かったのでいくつかの研究をしました。誰かがサンプルコードまたはこれを実装するための良い記事を提供できれば、それは多くの助けになるでしょう。

4

1 に答える 1

3

私はPythonのSocketServerの例を使用していることに気づきました。これによりSendFrame()、、、ReceiveFrame()およびDeliverData()ルーチンを実行できます。

MakeFrame()とはExtractData()、送受信する必要のあるデータの量によって大きく異なります。過去に使った良い例をいくつか掘り下げてみます。

ワンストップソリューションをお探しの場合は、ツイストを調べることをお勧めします。それには明確な学習曲線がありますが、それはあなたにとって価値があるかもしれません。pyInstallerまたはを使用してPythonコードをexeにパッケージ化する場合py2exe、Twistedは、私が読んだスレッドの数に基づいて問題を引き起こす可能性があることに注意してください。

それで、私のメモを振り返った後、私が助けるための良い例を見つけることができなかったので、フレーミングの側面は私にとって痛い主題でした。代わりに、最初から作成して、微調整しました(そして今もそうです)。

ソケットプログラミングを読んでいると、すべてのデータ(socket.sendall())を送信したからといって、最初のデータの後にすべてを受信するわけではないことがわかりますsocket.recv()。これにより、メッセージフレーミングの質問が複雑になります。Webに例がないため、以下に、現在いくつかのプロセスで使用しているものの簡略版を示します。

更新
それで、アンダーヘビー/バーストをさらにテストした後、正規表現から離れて、文字ごとにストリームを処理しました。これにより、パフォーマンスが大幅に向上しました。

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 に答える