在Python中的UDP套接字编程

在Python中的UDP套接字编程

问题描述:

我想实现一个程序,该程序将使UDP服务器能够发送客户端请求的文件,并在文件发送到特定目录后创建日志。在Python中的UDP套接字编程

任何人都可以请指导我与代码发送文件,并在Python中记录它? 此外,我们需要以10 KB的块和$结尾的数据发送数据以完成数据。如果我尝试运行服务器端代码:这里是我得到的错误:

Error message

任何帮助表示赞赏。提前致谢。

服务器端:

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) 

有了一点改变的,我能够在我的传送系统上的文件。