在Python中的UDP套接字编程
问题描述:
我想实现一个程序,该程序将使UDP服务器能够发送客户端请求的文件,并在文件发送到特定目录后创建日志。在Python中的UDP套接字编程
任何人都可以请指导我与代码发送文件,并在Python中记录它? 此外,我们需要以10 KB的块和$结尾的数据发送数据以完成数据。如果我尝试运行服务器端代码:这里是我得到的错误:
任何帮助表示赞赏。提前致谢。
服务器端:
import socket
import threading
import os
def RetrFile(name, sock):
filename = sock.recv(1024)
if os.path.isfile(filename):
sock.send("EXISTS " + str(os.path.getsize(filename)))
userResponse = sock.recv(1024)
if userResponse[:2] == 'OK':
with open(filename, 'rb') as f:
bytesToSend = f.read(1024)
sock.send(bytesToSend)
while bytesToSend != "":
bytesToSend = f.read(1024)
sock.send(bytesToSend)
else:
sock.send("ERR ")
sock.close()
def Main():
host = '192.168.0.24'
port = 9090
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
s.bind((host,port))
s.listen(5)
print("Server Started.")
while True:
c, addr = s.accept()
print("client connedted ip:<" + str(addr) + ">")
t = threading.Thread(target=RetrFile, args=("RetrThread", c))
t.start()
s.close()
if __name__ == '__main__':
Main()
客户端:
import socket
def Main():
host = '192.168.0.24'
port = 9090
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
s.connect((host, port))
print("connected")
filename = raw_input("Filename? -> ")
if filename != 'q':
s.send(filename)
data = s.recv(1024)
if data[:6] == 'EXISTS':
filesize = long(data[6:])
message = raw_input("File exists, " + str(filesize) + "Bytes, download? (Y/N)? -> ")
if message == 'Y':
s.send("OK")
f = open('new_' + filename, 'wb')
data = s.recv(1024)
totalRecv = len(data)
f.write(data)
while totalRecv < filesize:
data = s.recv(1024)
totalRecv += len(data)
f.write(data)
print ("{0:.2f}".format((totalRecv/float(filesize)) * 100) + "% Done")
print("Download Complete!")
f.close()
else:
print ("File Does Not Exist!")
s.close()
if __name__ == '__main__':
Main()
答
虽然要使用UDP使用的电话是更加符合了基于TCP通讯。如果简单地改变以下线在客户端和服务器,这将很好地工作虽然在TCP
来自:在服务器和客户端
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
到
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
。
对于基于UDP的通信,只需要绑定和recv。接受呼叫是为了接受服务器端的连接而使用TCP。同样在客户端,不需要连接调用,如果要设置sendto后面的源端口,则进行绑定。事情是这样的服务器端
Server.py
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
s.bind((host,port))
#s.listen(5)
print("Server Started.")
while True:
#c, addr = s.accept()
data, client_addr = s.recvfrom(1024)
还要注意,服务器需要了解已经发送到客户端,以便线程中你需要维护,如果你希望并发服务器每client_addr状态。另一种方法是使用TFTP风格的方法,其中作为响应的一部分,您发送不同的端口号以联系基于UDP的服务器,以便主端口可以返回到接收更多请求。此外,所有发送呼叫都必须转换为必须指定客户端地址的sendto呼叫。
同样在客户端,你需要的东西如下(我评论过以下TCP式部分)
host = '127.0.0.1'
port = 9090
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
server = (host, port)
#s.connect((host, port))
#print("connected")
filename = raw_input("Filename? -> ")
if filename != 'q':
s.sendto(filename, server)
data,server = s.recvfrom(1024)
有了一点改变的,我能够在我的传送系统上的文件。