使用两台不同的计算机,我必须实现发送和接收帧的发送方和接收方算法。我是一个强大的程序员,但对网络编程和python相对较新。算法如下。
发送者站点算法:
while(true)
{
WaitForEvent();
if(Event(RequestToSend))
{
GetData();
MakeFrame();
SendFrame();
}接收方站点算法:
while(true)
{
WaitForEvent();
if(Event(ArrivalNotification))
{
ReceiveFrame();
ExtractData();
DeliverData();
}我必须在两台不同的计算机上实现这些算法,一台作为发送方,另一台作为接收方。我不知道从哪里开始或寻找示例。我做了一些研究,但运气不佳。如果有人能提供示例代码或一篇关于实现这一点的好文章,那将是很大的帮助。
发布于 2012-04-23 06:26:11
我发现自己在使用Python的Socket Server示例。这将使您进入SendFrame()、ReceiveFrame()和DeliverData()例程。
根据需要来回发送的数据量,MakeFrame()和ExtractData()会有很大的不同。我会试着挖掘出一些我过去用过的好例子。
如果你正在寻找一个一站式的解决方案,我建议你去看看Twisted。它有一个明确的学习曲线,但对你来说可能是值得的。请注意,如果您想使用pyInstaller或py2exe将Python代码打包到可执行文件中,根据我所阅读的大量线程,Twisted可能会给您带来麻烦。
因此,在回顾我的笔记之后,框架方面对我来说是一个痛苦的主题,因为我找不到任何好的例子来帮助我。相反,我从头开始写了一个,并且已经(现在仍然在)调整它。
当您阅读套接字编程时,您一定会发现,仅仅因为发送了所有数据(socket.sendall())并不意味着您将在第一个socket.recv()之后收到所有数据。这增加了消息组帧问题的一些复杂性。由于缺乏网络上的例子,下面我有一个我现在在几个过程中使用的精简版本。
更新
因此,在进一步测试under heavy / bursting之后,我离开了正则表达式,逐个字符地处理流,这极大地提高了它的性能。
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"https://stackoverflow.com/questions/10272630
复制相似问题