私は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"