Python中的UDP套接字编程

2024-04-20 13:52:01 发布

您现在位置: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()

客户端:

^{pr2}$

Tags: 文件数据代码importsend客户端ifos
1条回答
网友
1楼 · 发布于 2024-04-20 13:52:01

虽然您希望使用UDP,但使用的调用更符合基于TCP的通信。如果您只需在客户机和服务器中更改以下行,即使在TCP上也可以正常工作

发件人:

s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)

^{pr2}$

在服务器和客户端。在

对于基于UDP的通信,只需要bind和recv。在TCP的情况下,调用accept是为了接受服务器端的连接。类似地,在客户端也不需要连接调用,如果要设置源端口后跟sendto,请绑定。对服务器端来说是这样的

在服务器.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)

另外请注意,服务器需要知道发送给客户端的内容,所以在线程中,如果您希望并发服务器,则需要维护每个客户端地址的状态。另一种选择是使用TFTP风格的方法,作为响应的一部分,您可以发送一个不同的端口号来联系基于UDP的服务器,这样主端口就可以返回接收更多的请求。此外,所有send调用都必须转换为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)

稍加修改,我就可以在我的系统上传输你的文件了。在

相关问题 更多 >