通过 UDP 发送数据时,我应该使用相同的端口号吗?

Should i use the same port numbers when sending data through UDP?

当我们将数据(在本例中)发送到 client/server 时,使用相同的端口号真的很重要吗? 我的猜测是 no,因为发送数据到哪个端口并不重要。 (协议在内部随机给你 - 这就是这个想法?)唯一必须保留的是,端口必须是接收方机器上的任何可用端口(超过 1000,因为这些是系统保留的),并且如果那个接收者决定发回一些东西,他或她将有足够的关于发送者的信息:他的 IP 地址、端口号等。 据我所知,收到的包裹提供了所有这些信息。

下面只是对我上面所说内容的说明。

public class Server {

    public static void main(String[] args) {
        GameServer server = new GameSever(9822);
        server.start();
        
        InetAddress address = null;
        int port = 7877;
        try {
            address = InetAddress.getByName("192.168.0.2");
        } catch (UnknownHostException e) {
            e.printStackTrace();
        }
        server.send(new byte[] { 1, 2, 3 }, address, port);
    }
}

当服务器在计算机上侦听时,它会指定一个它希望连接来自 的端口,因此端口对于设置服务器很重要。这很有用,因为您可以让多个应用程序侦听不同的端口,而不同的应用程序不会意外地相互通信。因此,您应该决定一个非标准端口(例如 80 用于 HTTP)专门用于您的游戏服务器,以便客户端知道将请求发送到哪个端口。

如果您想一次处理多个连接,最好的办法是线程。

When we send data (in this case) to a client/server, does this really matter to use the same port number? My guess is no, because it doesn't matter which port you are using when sending data to.

首先,区分使用客户端和服务器(因为通常客户端通过发送消息发起,服务器响应消息) .

接下来,您使用的端口在逻辑上没有意义,原因是服务器在发送响应时使用 request.getPort() 来确定端口; (请求是客户端发送的DatagramPacket)。

虽然您可以在服务器上对端口进行硬编码(如果事先知道),但是,这是一个坏主意。在那些您不知道是谁发送数据报包的应用程序中怎么办?

Java documentation by Oracle 还使用了客户端-服务器的示例,其中客户端的端口号留给构造函数选择。它提到:

大多数情况下,客户端使用不需要端口号的构造函数。此构造函数只是将 DatagramSocket 绑定到任何可用的本地端口。 客户端绑定到哪个端口并不重要,因为 DatagramPackets 包含寻址信息。服务器从 DatagramPackets 获取端口号并将其响应发送到该端口。


MORE INFO (taken from Java Network Programming) :

public DatagramSocket() throws SocketException

此构造函数创建一个绑定到匿名端口的套接字。例如:

DatagramSocket client = new DatagramSocket();

为发起与服务器对话的客户端选择此构造函数。 在这种情况下,您不关心套接字绑定到哪个端口,因为服务器会将其响应发送到数据报的来源端口。让系统分配一个端口意味着您不必担心找到未使用的端口。如果出于某种原因,您需要知道本地端口,可以使用 getLocalPort() 方法查找。

注意:同一个套接字可以接收服务器发回给它的数据报(底层实现)。

然而,下面的构造函数创建了一个套接字,用于侦听特定端口上的传入数据报,由端口参数指定:

public DatagramSocket(int port) throws SocketException

使用此构造函数编写一个在已知端口上侦听的服务器。

简答:
你的猜测是正确的。

更长的答案:
客户端在向服务器发送数据时获得一个随机端口号,每个数据包都有一个 header,其中包含有关客户端端口、ip 地址等信息。因此服务器可以轻松检索此信息并发回任何内容。

而服务器需要绑定到特定端口以便客户端能够将数据发送到该服务器,因为当您使用 UDP 时,您需要指定 IP 地址和端口。