0

当我们(在这种情况下)向客户端/服务器发送数据时,使用相同的端口号真的很重要吗?我的猜测是否定的,因为发送数据时使用的端口并不重要。(协议在内部随机给你 - 这是这个想法吗?)唯一必须保留的东西,端口必须是接收机器上的任何可用端口(超过 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);
    }
}
4

3 回答 3

2

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

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

于 2016-09-05T10:58:33.883 回答
0

当我们(在这种情况下)向客户端/服务器发送数据时,使用相同的端口号真的很重要吗?我的猜测是否定的,因为发送数据时使用哪个端口并不重要。

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

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

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

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

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


更多信息(取自Java Network Programming):

public DatagramSocket() throws SocketException

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

DatagramSocket client = new DatagramSocket();

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

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

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

public DatagramSocket(int port) throws SocketException

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

于 2016-09-05T14:02:22.040 回答
0

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

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

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

于 2016-09-10T10:56:09.587 回答