0

これは私が決して理解できなかった問題です。多くの人に聞いたのですが、彼らも知りません。とにかく、問題に取り掛かりましょう。これが私がやろうとしたことです... クライアントとサーバーを作成します。クライアントはサーバーに接続し、3 分ごとにメッセージを送信します (テストの時間を短縮しました)。ただし、2 つの独立したスレッド (クライアントとサーバー用に 1 つ) が必要です。私が見つけたのは、クライアントは引き続きメッセージを送信しますが、サーバーはポート 1234 をリッスンしなくなるということです。

クライアント:

import java.io.PrintWriter;
import java.net.Socket;


public class Client {

        public Client(){
                startClient();
        }

        public void startClient(){
                new Thread(new Runnable(){
                        @Override
                        public synchronized void run(){
                                try{
                                        Socket sendChat = new Socket("localhost", 1234);
                                        PrintWriter writer = new      PrintWriter(sendChat.getOutputStream());

                                while(true){
                                        Thread.sleep(1000); // normally 180000

                                        writer.println("Hello Server!");
                                }
                                }catch(Exception err){
                                        err.printStackTrace();
                                }
                        }
                }).start();
        }

}

サーバ:

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Date;


public class Server {

public Server(){
        startServer();
}

    public void startServer(){
            new Thread(new Runnable(){
                    @Override
                    public synchronized void run(){
                            try{
                                    @SuppressWarnings("resource")
                                    ServerSocket server = new ServerSocket(1234);

                                    while(true){
                                            final Socket test = server.accept();
                                            BufferedReader reader = new BufferedReader(new InputStreamReader(test.getInputStream()));

                                            while(!test.isClosed()) {
                                                    Date date = new Date();

                                                    System.out.println("Server got message from client " + date);
                                            }
                                            reader.close();
                                    }
                            }catch(Exception err){
                                    err.printStackTrace();
                            }
                    }
            }).start();
    }

}

始める:

public class Start {
    public static void main(String[] args){
        new Server();
        new Client();   
    }
}

私は正直なところ手がかりがないので、誰かが何が間違っているのか教えていただければ幸いです。

4

3 に答える 3

0

whileServer クラスのループから 2 行以下に記述してください。

 final Socket test = server.accept();
 BufferedReader reader = new BufferedReader(new InputStreamReader(test.getInputStream()));

コードで何が起こっているか: サーバーは while ループの完了後に毎回新しいクライアントを待機しますが、そのインスタンスでサーバーに接続するクライアントはありません。したがって、サーバーは新しいクライアントが来るまで待機し、サーバーはその新しいクライアントを受け入れて処理を続行します。

于 2013-08-23T12:59:23.783 に答える
0

あなたはループにスタックしています。メッセージの後にクライアントで接続を閉じてみてください。

于 2013-08-23T13:18:36.377 に答える