0

接続後にクライアントに応答を送信したい

ここにコードのスニペットがあります

try {

    while (true)

    {
        in = socket.getInputStream();
        out = socket.getOutputStream();

        byte[] reception = new byte[1024];
        ByteArrayOutputStream baos = new ByteArrayOutputStream();
        int read = in.read(reception);

        String bufferServer = "Buffer Server ";
        baos.write(reception, 0, read);
        reception = baos.toByteArray();
        String chaine = new String(reception, "Cp1252");
        System.out.println("Reception from client : " + chaine);

        byte[] bufferServeurToClient = bufferServer.getBytes();
        out.write(bufferServeurToClient); // send to client
        out.flush();
    }
}

クライアントは複数のリクエストを送信できます。そのため、クライアントが切断されるまでリクエストをリッスンするために while(true) を使用します。

問題は、クライアント側のサーバーから何も受信しないことです。while(true) を削除すると機能し、クライアント側で変数「bufferServeurToClient」を受け取ります

編集: クライアント側は現在動作していますが、応答を出力すると、文字列の後に奇妙な文字 (正方形) がたくさんあります。なぜですか?

String ip = InetAddress.getLocalHost ().getHostAddress ();
        Socket socket = new Socket(ip, port);
        System.out.println("SOCKET = " + socket);

         InputStream in = socket.getInputStream();
    BufferedInputStream bis = new BufferedInputStream(in);
    OutputStream out = socket.getOutputStream();
    BufferedOutputStream bos=new BufferedOutputStream(out);
    String bufferClient="Buffer Client ";

    byte[] bufferClientToServer= bufferClient.getBytes();
    out.write(bufferClientToServer);

    byte[] reception = new byte[1024] ;          

    int read;

    while ((read = bis.read(reception)) != -1){
        String chaine = new String( reception , "Cp1252" );
        System.out.println("Reception from server: " + chaine);


    }
    bis.close();
    bos.close();

}

ご協力ありがとうございました

4

4 に答える 4

3

クライアントは複数のリクエストを送信できるため、クライアントが切断されるまでリクエストをリッスンするために while(true) を使用します。

クライアントが複数のリクエストを送信できる場合、それらを区別する方法、およびレスポンスを区別する方法が必要になります。現時点では、 を 1 回呼び出すだけで問題が解決すると想定しているだけですread

int read =in.read(reception);

これは、リクエストの一部、または場合によっては複数のリクエストを読み取る可能性があります。これを修正するための一般的なオプションは、ある種の区切り文字 (たとえば、テキスト行ごとに 1 つの要求) を使用するか、(たとえば) 各要求または応答の最初の 4 バイトがどれだけのデータがあるかを示す長さのプレフィックスを使用することです。

これで、クライアント側がどのように見えるかはまったく示されていませんが、サーバーが接続を閉じるのを実際に待っていると思います。もちろん、while(true)ループが存在する間は決して閉じません。これは、変更する必要がある別のコードです。

于 2012-09-10T14:27:52.910 に答える
1

何かを印刷する前にクライアントでEOSまで読んでいて、サーバーが接続を閉じることはないため、EOSはありません。

これらすべてのByteArrayOutputStreamsは必要ありません。コードをよく見てください。コードを完全に削除できることがわかります。これにより、EOSの問題も解決されます。

read()が-1を返す場合、サーバーはソケットを閉じる必要があります。

于 2012-09-10T18:24:42.880 に答える
1

複数のリクエストを送信すると、それらが単一のリクエストとして読み取られる可能性が高いことは何の価値もありません。これは、ストリームにはメッセージの概念がないため、多くのバイトを書き込むと、どのような方法でも読み取ることができるためです。たとえば、一度に 1 バイトずつ、またはすべてを一度に。

いずれにせよ、少なくとも 1 つの応答を取得する必要があります。

于 2012-09-10T14:28:48.030 に答える
0

このチュートリアルドキュメントを見てください: http://docs.oracle.com/javase/tutorial/networking/sockets/readingWriting.html これはあなたを助けるかもしれません

于 2012-09-10T14:32:37.760 に答える