0

こんにちはみんな私はJavaでエコーサーバーをやろうとしていますが、それは機能していません..。理由はわかりません..しかし、サーバーがクライアントを待っているようで、クライアントがサーバーを待っているようです...だから彼らはお互いに情報を提供することはできません..

これがサーバーのコードです

    ServerSocket server = null;
        try {
             server = new ServerSocket(3333);
              System.out.println("Listening on 3333");
    } catch (IOException ex) {
        System.out.println("Error can't connect to 3333");
        System.exit(1);
    }

        Socket clientSocket = null;
    try {
        clientSocket = server.accept();
    } catch (IOException ex) {
        System.out.println("Accept fail");
        System.exit(1);
    }
    PrintWriter out = null;
    try {
         out = new PrintWriter(clientSocket.getOutputStream());
    } catch (IOException ex) {
        Logger.getLogger(JavaApplication20.class.getName()).log(Level.SEVERE, null, ex);
    }
    BufferedReader br = null;
    try {
        br = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));
    } catch (IOException ex) {
        Logger.getLogger(JavaApplication20.class.getName()).log(Level.SEVERE, null, ex);
    }
    BufferedReader stdIn = new BufferedReader(new InputStreamReader(System.in));

    String inputLine, outputLine;
 while(!(inputLine=br.readLine()).equals("bye"))
            {
                out.print("echo: " + inputLine);

            }
    out.close();
    br.close();
    clientSocket.close();
    server.close();
    System.out.println("Server Exited");

これがクライアントのコードです

 Socket client = null;
   try {
        client = new Socket("localhost", 3333);
        System.out.println("Connected on 3333");
    } catch (UnknownHostException ex) {
        System.out.println("Couldn't connect to the server");
        System.exit(1);
    } catch (IOException ex) {
        Logger.getLogger(KnockKnockClient.class.getName()).log(Level.SEVERE, null, ex);
    }


    PrintWriter out = null;
    BufferedReader in = null;
    BufferedReader stdIn = null;

    try {
        out = new PrintWriter(client.getOutputStream(), true);
    } catch (IOException ex) {
        Logger.getLogger(KnockKnockClient.class.getName()).log(Level.SEVERE, null, ex);
    }
    try {
        in = new BufferedReader(new InputStreamReader(client.getInputStream()));
    } catch (IOException ex) {
        Logger.getLogger(KnockKnockClient.class.getName()).log(Level.SEVERE, null, ex);
    }
    stdIn = new BufferedReader(new InputStreamReader(System.in));

    String fromServer, fromUser;


    while((fromUser=stdIn.readLine())!=null)
        {
            System.out.println("From user: "+ fromUser);

            out.print(fromUser);
            fromServer=in.readLine();
            System.out.println(fromServer);
        }



    out.close();
    stdIn.close();
    in.close();
    client.close();

    System.out.println("client Exited");

それについて何か助けはありますか?

4

2 に答える 2

3

クライアントから文字列を送信していて("Hello"たとえば)、サーバー上で文字列を読み取ろうとしreadLine()ています(その逆も同様です)。readLine()EOL文字が見つかった場合、または入力ストリームが閉じられた場合にのみ返されます。

クライアントはEOL文字を送信しないため、サーバーは無期限に待機します。また、クライアントはサーバーからの応答を待機するためです。

送信"Hello\n"すると、うまく機能します。

于 2012-12-07T17:21:43.247 に答える
1

クライアントとサーバーでout.print(fromUser);使用した後。out.flush()フラッシュは、それがソケットに正しくなることを確認します。

while((fromUser=stdIn.readLine())!=null)
    {
        System.out.println("From user: "+ fromUser);

        out.print(fromUser);
        out.flush();
        fromServer=in.readLine();
        System.out.println(fromServer);
    }



out.close();
stdIn.close();
in.close();
client.close();

フラッシュに関しては、javadocから抽出。

Flushes the stream. If the stream has saved any characters from the various write()      methods in a buffer, write them immediately to their intended destination. Then, if that destination is another character or byte stream, flush it. Thus one flush() invocation will flush all the buffers in a chain of Writers and OutputStreams. 

  If the intended destination of this stream is an abstraction provided by the underlying operating system, for example a file, then flushing the stream guarantees only that bytes previously written to the stream are passed to the operating system for writing; it does not guarantee that they are actually written to a physical device such as a disk drive.
于 2012-12-07T17:17:29.880 に答える