저는 파이썬의 Socket Server 예제를 사용하고 있습니다. 그러면 SendFrame()
, ReceiveFrame()
및 DeliverData()
루틴으로 이동하게됩니다.
MakeFrame()
및 ExtractData()
은 전송할 데이터의 양에 따라 크게 달라질 수 있습니다. 나는 과거에 사용한 좋은 모범을 파헤 치려고 노력할 것이다.
1 스톱 솔루션을 찾고있는 경우 Twisted을 살펴볼 것을 권합니다. 명확한 학습 곡선이 있지만 그만한 가치가있을 것입니다. pyInstaller
또는 py2exe
을 사용하여 파이썬 코드를 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"
토네이도가 갈 수있는 방법입니다) – jldupont