0

「マルチクライアント - 単一サーバー」接続を作成しようとしています。私のクライアントは接続を開き、私が作成したサーバー側で

     Client clt = new Client("127.0.0.1", 9000);
        clt.openConn();

...

public Client(String serverAddress, int serverPort) {
    this.serverAddress = serverAddress;
    this.serverPort = serverPort;
}
try {
        this.clientSocket = new Socket(this.serverAddress, this.serverPort);
        this.clientSocket.setKeepAlive(true);
        this.clientSocket.setSoTimeout(0);

            oos = new DataOutputStream(this.clientSocket.getOutputStream());
            ois = new DataInputStream(this.clientSocket.getInputStream());...}

...

サーバー側では、スレッドにラップした ServerSocket のそれぞれの ListArray を作成しました。

    ServerSocket serverSocket = null ;
        Socket clientSocket;
        boolean listening = true;
        ArrayList threadList = new ArrayList();
        Iterator itSrvThr;
    try {
            serverSocket = new ServerSocket(port);

        } catch (IOException e) {
            System.err.println("Could not listen on port: " + port + ".");
            System.exit(-1);
        }
        while (listening) {
            clientSocket = serverSocket.accept();
            ServerThread srvThread = new ServerThread(clientSocket);
            srvThread.start();
`...`
    }

どこ

 ServerThread extends Thread
    {...
         public void run() {
           this.ois = new DataInputStream(socket.getInputStream());
           this.oos = new DataOutputStream(socket.getOutputStream());    
         }
    }

私のプログラムは、ファイルと文字列のある種のラッパーであるオブジェクト(私はそれらを「データグラム」と呼んでいます)を送受信します(クライアントサーバー用の言語であるとしましょう)

そして今、私が抱えている問題について。サーバー側から「生きている」ソケットをテストする必要があるたびに検証を行う必要があります...その瞬間にArrayListに新しい要素が表示されたときにこの検証を行おうとしていますが、「データグラムの」送信に問題が発生します

itSrvThr = threadList.iterator();
            while (itSrvThr.hasNext()) {
                ServerThread st = (ServerThread) itSrvThr.next();
                boolean stoppedSocket = st.getStopped();

                if (stoppedSocket) {
                    st.stop();
                    itSrvThr.remove();
                }else {??? resolution???}

stoppedSocket - これは、プログラムによってクライアント サイトからソケットをオフにしたことを示す値です。

正直なところ、私はソケットとスレッドを数週間しか扱っていません。そのため、すべてのヘルプと批評が受け入れられます。...回答ありがとうございますが、ハートビートのコーディングに問題があります。まず、ハートビートの正確な場所をサーバー側に配置する必要があります。

4

1 に答える 1

1

しばらくメッセージを送信していないときはいつでも、クライアントおよび/またはサーバーからハートビート メッセージを送信することをお勧めします (秒)。この時間の倍数の間何も受信していない場合、相手側はタイムアウトになる可能性があります。

{message length} {message} のようなプロトコルがある場合、メッセージの長さ = 0 をハートビートとして使用します。

于 2012-07-06T09:25:32.453 に答える