使用两台不同的计算机,我必须实现发送器和接收器算法来发送和接收帧。我是一名优秀的程序员,但对网络编程和python来说相对较新。算法如下。
发件人站点算法:
while(true)
{
WaitForEvent();
if(Event(RequestToSend))
{
GetData();
MakeFrame();
SendFrame();
}
接收站点算法:
while(true)
{
WaitForEvent();
if(Event(ArrivalNotification))
{
ReceiveFrame();
ExtractData();
DeliverData();
}
我必须在两台独立的计算机上实现这些算法,一台作为发送方,另一台作为接收方。我不知道从哪里开始或寻找例子。我做了一些运气很少的研究。如果有人可以提供示例代码或者有关实现它的好文章,那将会有很多帮助。
答案 0 :(得分:3)
我发现自己使用了Python的Socket Server示例。这样您就可以使用SendFrame()
,ReceiveFrame()
和DeliverData()
例程。
MakeFrame()
和ExtractData()
根据您需要来回传输的数据量而有很大差异。我将尝试挖掘一些我过去使用过的好例子。
如果您正在寻找一站式解决方案,我建议您查看Twisted。它有一定的学习曲线,但对你来说可能是值得的。请注意,如果您想使用pyInstaller
或py2exe
将Python代码打包到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"