繁体   English   中英

Python套接字发送EOF

[英]Python socket send EOF

我有一个简单的文件传输套接字程序,其中一个套接字发送文件数据,另一个套接字接收数据并写入文件

从目的地到源完成传输后,我需要发送确认

目的地代码

s.accept()
f = s.makefile()
f.read(1024)

源代码

s.connect(('localhost',6090))
f = s.makefile()
f.write('abcd') 
f.flush()

这就出现了问题,因为“abcd”不是1024字节,目标将阻塞直到接收到1024字节
解决方案是关闭()套接字,但由于我需要从目标确认,我无法关闭套接字。
如何告诉目的地停止阻止? 我正在考虑写一个EOF角色,我在网上读到“\\ x04”是EOF,但它不起作用。
此外,由于数据可能是二进制的,我不想使用readline()方法。

设计一个关于如何发送消息的协议(客户端和服务器之间的协议)。 一种简单的方法是“第一个字节是消息的长度,后跟消息”。 粗略的例子:

客户

Python 2.6.5 (r265:79096, Mar 19 2010, 21:48:26) [MSC v.1500 32 bit (Intel)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> from socket import *
>>> s=socket()
>>> s.connect(('localhost',5000))
>>> f=s.makefile()
>>> f.write('\x04abcd')
>>> f.flush()

服务器

Python 2.6.5 (r265:79096, Mar 19 2010, 21:48:26) [MSC v.1500 32 bit (Intel)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> from socket import *
>>> s=socket()
>>> s.bind(('localhost',5000))
>>> s.listen(1)
>>> c,a=s.accept()
>>> f=c.makefile()
>>> length=ord(f.read(1))
>>> f.read(length)
'abcd'

从套接字写入和读取是分开的。 您可以尝试关闭套接字进行写入,并将其打开以供阅读。

请参阅http://docs.python.org/library/socket.html#socket.socket.shutdown

此外,FTP的作用是使用两个套接字:一个用于数据,一个用于此“确认”。

你会更乐意使用第二个套接字来获得这些额外的元数据。

如果您打算通过管道发送任何二进制数据,实际上并不想使用'EOF'标记。 如果您的二进制数据恰好包含该字节序列会发生什么? 您可以“逃避”它以防止这种情况发生,但这需要您检查两端,然后确保您也逃脱了转义序列。

如果您正在为某种生产系统执行此操作,请查看是否存在可以使用的网络API(类似于FTP,HTTP,SFTP等)。

如果这是一所学校或小型项目,您需要做的是编写通信协议。 最简单的可能是发送方广播单个二进制整数X(选择数据大小,并坚持使用它),然后发送X字节的二进制数据。 接收器首先阻止大小,然后只期望接收该数量的数据。 请记住,如果您需要发送的字节数超过X可以发送的数据大小,则需要“分块”数据。

还要考虑在传输过程中丢失通信时会发生什么。 您可以在read()上设置超时,但如果在超时后立即恢复通信,则需要优雅地恢复(尽管可能会认为所有数据都是优雅的,具体取决于系统)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM