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

Short answer:
Your guess is correct.

Longer answer:
Client gets a random port number when sending data to a server and each packet has a header which contains the info about client's port, ip address ect. So server can easily retreive this information and send anything back.

Whereas the server needs to be bind to a specific port in order to clients be able to send data to that server because when you use UDP, you need to specify an IP address and a port.

于 2016-09-10T10:56:09.587 に答える
0

データ (この場合) をクライアント/サーバーに送信する場合、同じポート番号を使用することは本当に問題になるのでしょうか? データを送信するときにどのポートを使用しているかは問題ではないため、私の推測ではノーです。

まず、クライアントとサーバーという用語を区別して使用します (通常、クライアントはサーバーが応答するメッセージを送信することで開始します)。

次に、使用しているポートは論理的には重要ではありません。これは、サーバーがrequest.getPort()応答の送信中にポートを決定するために使用するためです。(リクエストはクライアントから送信された DatagramPacket です)。

サーバーでポートをハードコードすることはできますが (事前にわかっている場合)、それは悪い考えです。データグラム パケットの送信者がわからないアプリケーションではどうでしょうか。

Oracle による Java ドキュメントでは、クライアントのポート番号がコンストラクターによって選択されるクライアントサーバーの例も使用しています。それは言及しています:

ほとんどの場合、クライアントはポート番号を必要としないコンストラクターを使用します。このコンストラクターは、DatagramSocket を使用可能なローカル ポートにバインドするだけです。DatagramPackets にはアドレス指定情報が含まれているため、クライアントがどのポートにバインドされているかは問題ではありません。サーバーは DatagramPackets からポート番号を取得し、そのポートに応答を送信します。


MORE INFO ( Java Network Programmingから取得):

public DatagramSocket() throws SocketException

このコンストラクターは、匿名ポートにバインドされるソケットを作成します。例えば:

DatagramSocket client = new DatagramSocket();

サーバーとの会話を開始するクライアントには、このコンストラクターを選択します。このシナリオでは、サーバーはデータグラムの発信元のポートに応答を送信するため、ソケットがバインドされているポートは気にしません。システムにポートを割り当てさせるということは、未使用のポートを見つけることを心配する必要がないことを意味します。何らかの理由でローカル ポートを知る必要がある場合は、getLocalPort() メソッドで調べることができます。

注 : 同じソケットは、サーバーが返送するデータグラムを受信できます (基本的な実装)。

一方、以下のコンストラクターは、ポート引数で指定された特定のポートで着信データグラムをリッスンするソケットを作成します。

public DatagramSocket(int port) throws SocketException

このコンストラクターを使用して、既知のポートでリッスンするサーバーを記述します。

于 2016-09-05T14:02:22.040 に答える