Python UDP socket 端口随机,尽管已分配

3 投票
2 回答
6853 浏览
提问于 2025-04-15 17:24
print "\nReceived message '", data,"' from ", addr

我有两个简单的Python文件:client.pyserver.py。客户端的功能很简单,就是把你输入的文字通过UDP套接字发送给服务器。

服务器监听的端口是21567,但是……在server.py中有一行代码输出的addr看起来像这样:('127.0.0.1', 60471)

我不明白为什么会显示这个看起来随机的端口,每次运行脚本时,60471这个数字都是随机的。有没有人能帮我解释一下,为什么它没有显示代码中设置的21567呢?谢谢!

这两个Python脚本的内容如下:

client.py

# Client program

from socket import *

# Set the socket parameters
host = "localhost"
port = 21567
buf = 1024
addr = (host,port)

# Create socket
UDPSock = socket(AF_INET,SOCK_DGRAM)

def_msg = "===Enter message to send to server===";
print "\n",def_msg

# Send messages
while (1):
    data = raw_input('>> ')
    if not data:
        break
    else:
        if(UDPSock.sendto(data,addr)):
            print "Sending message '",data,"'....."

# Close socket
UDPSock.close()

server.py

# Server program

from socket import *

# Set the socket parameters
host = "localhost"
port = 21567
buf = 1024
addr = (host,port)

# Create socket and bind to address
UDPSock = socket(AF_INET,SOCK_DGRAM)
UDPSock.bind(addr)

# Receive messages
while 1:
    data,addr = UDPSock.recvfrom(buf)
    if not data:
        print "Client has exited!"
        break
    else:
        print "\nReceived message '", data,"' from ", addr

# Close socket
UDPSock.close()

2 个回答

2

你看到的这个端口是发送方的端口。客户端的端口总是随机的,这是操作系统的标准机制。就像一个网页服务器的端口是80一样,但当你的电脑连接到服务器时,每次连接时你使用的端口都是随机的。

4

60471是客户端的端口,21567是服务器的端口。它们不能是一样的:任何网络流量都需要说明它的来源地址和端口,以及目标地址和端口。客户端的端口通常是一个随机数,范围在32768到65535之间。addr告诉你的是客户端的地址。

这样做的目的是为了让多个客户端可以同时和同一个服务器(也就是同一个IP地址和端口)进行交流,即使使用的是像UDP/IP这样的无连接协议,也能通过客户端的端口号来区分不同的连接。

撰写回答