1

サーバーに文字列を送信するための次のクライアントソケットがあります。サーバーがメッセージを取得していません。問題は何でしょうか?

public void startClient() throws IOException {

    Socket socket = null;
    PrintWriter out = null;
    BufferedReader in = null;
    InetAddress host = null;
    BufferedReader stdIn = null;

    try {
        host = InetAddress.getByName("172.16.2.97");
        socket = new Socket(host, 52000);

        out = new PrintWriter(socket.getOutputStream(), true);
        in = new BufferedReader(new InputStreamReader(socket.getInputStream()));

        stdIn = new BufferedReader(new InputStreamReader(System.in));
        String fromServer;
        String fromUser = null;
        //ClientHelper.unpackISO();
        fromUser = ClientHelper.createISO();
        if (fromUser != null) {
            //System.out.println("Client - " + fromUser);
            out.write(fromUser);
            System.out.println("Sent message");
        }


        while ((fromServer = in.readLine()) != null) {
            System.out.println("Server - " + fromServer);
            if (fromUser != null) {
                //System.out.println("Client - " + fromUser);
                out.println(fromUser);
            }
        }
    } catch (ISOException ex) {
        Logger.getLogger(ClientDemo.class.getName()).log(Level.SEVERE, null, ex);
    } catch (UnknownHostException e) {
        System.err.println("Cannot find the host: " + host.getHostName());
        System.exit(1);
    } catch (IOException e) {
        System.err.println("Couldn't read/write from the connection: " +            e.getMessage());
        System.exit(1);
    } finally { //Make sure we always clean up
        out.close();
        in.close();
        stdIn.close();
        socket.close();
    }
}

メソッド ClientHelper.createISO() は、サーバーに送信される文字列を返します。残念ながら、サーバーは文字列を取得していません。問題はプロキシ設定でしょうか。もしそうなら、どのようにそれを解決することができます。それとも、私のコードに別の問題がありますか? 私のコードの問題は何ですか?

4

2 に答える 2

1

以下の 5 行目を確認してください。出力ストリームをフラッシュする必要があります。そうしないと、サーバーはパケットを取得せず、ブロックされているため、最初の in.readLine() でスタックします。

    fromUser = ClientHelper.createISO();
    if (fromUser != null) {
        //System.out.println("Client - " + fromUser);
        out.write(fromUser);
        out.flush(); // FLUSH IT HERE, packet wont be sent until you flush your stream
        System.out.println("Sent message");
    }

また、ループ内の out.write(fromUser) の後にフラッシュを追加します。

于 2013-04-30T11:46:22.817 に答える
1

ストリームに書き込んだ後、ストリームを flush() する必要があります。それ以外の場合は、完全なパケットを取得するまでソケットがバッファリングされます

于 2013-04-30T11:17:23.773 に答える