文件通过UDP套接字发送

Puj*_*ava 1 python

我正在使用python'UDP socket发送文件.在接收方(file_receiver.py),您需要中断(ctrl-c)程序以便在最后接收文件.因此,我将settimeout设置为2秒,以便在完全接收数据后自动退出程序.如果我知道,你不能在UDP中设置非阻塞套接字.什么是克服这个问题的最佳方法.

file_sender.py

#!/usr/bin/env python

from socket import *
import sys

s = socket(AF_INET,SOCK_DGRAM)
host ="localhost"
port = 9999
buf =1024
addr = (host,port)

f=open (sys.argv[1], "rb") 
data = f.read(buf)
while (data):
    if(s.sendto(data,addr)):
        print "sending ..."
        data = f.read(buf)
s.close()
f.close()
Run Code Online (Sandbox Code Playgroud)

file_receiver.py

#!/usr/bin/env python

from socket import *
import sys
import select

host="0.0.0.0"
port = 9999
s = socket(AF_INET,SOCK_DGRAM)
s.bind((host,port))

addr = (host,port)
buf=1024


f = open("op.pdf",'wb')
data,addr = s.recvfrom(buf)


while(data):
    f.write(data)
    s.settimeout(2)
    data,addr = s.recvfrom(buf)

f.close()
s.close()
Run Code Online (Sandbox Code Playgroud)

谢谢.

rod*_*ion 5

由于UDP是无连接的,因此接收方无法直接了解发送方何时完成.

你可以解决这个问题,例如,当发送者完成时发送一个特殊的数据包,表明不再有数据包.

但是,我强烈建议你不要这样做; UDP不保证数据包的传送 - 数据包可能会丢失,重复或无序传送.显然,对于大多数文件来说,如果他们丢失了一个部件,或者重新排序等等,这将是不可接受的.如果你想在主机之间传输文件,我认为你使用TCP要好得多.