0

そのため、ネットワーク クラスの課題のために、学校のサーバーのポートをバインドしてリッスンしようとしています。私が実行しているのは、Java で ServerSocket を作成するときに、上位帯域にあるポートにバインドしようとしても、常に IOException が発生することです。

最初はポート 1088 にバインドしようとしますが (多かれ少なかれ高い期待から)、それが失敗した場合は、1024 より大きいランダムなポートにバインドしようとします (それより低いポートはサーバーで予約されています)。

これが私が得たものです:

import java.io.IOException;

import java.net.InetAddress;
import java.net.ServerSocket;
import java.net.UnknownHostException;
import java.util.Random;


public class main 
{

    /**
     * @param args
     */
    public static void main(String[] args) 
    {
        Random r = new Random();
        boolean connected = true;
        ServerSocket serverSocket = null;
        int welcomePortNum = new Integer(args[0]);
        if(welcomePortNum >= 65536)
        {
            System.out.println("Invalid welcome port number, terminating execution.");
            System.exit(0);
        }

        do
        {
            connected = true;
            System.out.println(welcomePortNum);
            try
            {
                serverSocket = new ServerSocket(welcomePortNum, 5, InetAddress.getByName("loki.ist.unomaha.edu"));
            }   catch(UnknownHostException e)
            {
                System.err.println("Could not connect to 'loki.ist.unomaha.edu'.");
                connected = false;
                //System.exit(1);
            }catch(IOException e)
            {
                System.err.println("Could not get the I/O for the connection to loki.ist.unomaha.edu.");
                connected = false;
                //System.exit(1);
            }
            if(connected == false)
                welcomePortNum = r.nextInt(64512) + 1024;
            System.out.println(connected);
        }
        while(connected == false);
        // TODO Auto-generated method stub

    }

}

何か案は?

4

1 に答える 1

2

JavaServerSocketsは「リモート ホストに接続」しません。それらはローカル IP アドレスにバインドできます。これが、使用しているコンストラクターの目的です

EDIT 割り当てに関するコメント。

  1. ステップ 2 の「関連付ける IP アドレス」の部分は不正確で不必要であるため、自宅でテストすることはできません。あなたのサーバーが実際にそのホストで実行されていない限り、彼があなたに与えた指示は機能しない可能性があり、いずれにせよ、それは一般的にサーバーでは行われません. IP アドレス パラメータに null を渡すだけで、ソケットは任意のローカル IP アドレスからの接続を受け入れることができ、この回答にリンクするコメントを追加できます。そして正しい言葉は「連想」ではなく「束縛」です。割り当てで正しい用語が使用されていれば、「接続」と「バインド」の間の混乱は発生しなかったでしょう。

  2. ステップ3もわかりません。いずれかのクライアントが接続されるまで、状態を初期化するクライアントはありませんその後、状態を初期化するときが来ます。「その接続を非アクティブとしてマークする」という彼の意味もわかりません。あなたがしなければならないことは、そのクライアントの受け入れられたソケットを閉じることだけです。

  3. ステップ 4 の「イベントを待機する」は、提案されているようにスレッドを使用している場合、個別のステップとして実装できません。関数は、接続を受け入れるスレッドとすべての接続処理スレッドに分散されます。

  4. この段階で select() を使用するオプションが与えられるべきだとは思いません。部分的には教育上の理由から、部分的にはあなたが両方を確実に学べるようにするために、私はそれをその後の課題にしたでしょう.

于 2013-04-22T21:46:31.783 に答える