0

みなさん、こんにちは。

ソケット接続を介して長い文字列を送信しようとしていますが、2つの部分に分かれているため、プロセスの実行中にエラーが発生します。

クライアントでファイルを送信していますが、

BufferedWriter bufferedOut = null;
BufferedReader in = null;
socket = new Socket("192.168.0.15",4444);
bufferedOut = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
in = new BufferedReader(new InputStreamReader(socket.getInputStream()));

bufferedOut.write(xmlInString, 0, xmlInString.length());

/**
* wait for response
*/

byte[] buf = new byte[10000];
int actualNumberOfBytesRead = socket.getInputStream().read(buf);
String responseLine = new String(buf, 0, actualNumberOfBytesRead);

サーバーでは、

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

//get the input
 byte[] buf = new byte[10000];
 int actualNumberOfBytesRead = client.getInputStream().read(buf);
 line = new String(buf, 0, actualNumberOfBytesRead);
 //send back
 out.println(result);

文字列を一部として取得するにはどうすればよいですか?コードのどこに間違いがあるのか​​教えていただけますか?

皆さん、ありがとうございました

4

2 に答える 2

1

文字列の最後に到達するまで、入力ストリームから繰り返し読み取り、読み取ったデータを毎回連結するループが必要になります。

編集-もう少し詳細。このような複数の文字列/ファイルの送信を検討している場合は、@arnaudの回答を参照してください。あなたが探しているのが1つの大きな文字列を送信することだけである場合:

  1. 送信側では、出力ストリームを作成し、(行ったように)データを送信してから、ストリームを再度閉じることを忘れないでください(これにより、データがネットワーク経由で送信されることを確認するフラッシュも実行され、通知されますもう一方の端は、これ以上データがないことです)。

  2. 受信者サイトで、入力ストリームが終了するまでループでデータを読み取り(read(buf)は-1を返します)、1つの大きなバッファーで毎回データを連結してから、入力ストリームを閉じます。

また、ファイルを文字列ではなくバイトとして送信することについての私のコメントを読んでください。これは、エンコーディング検出にかなり特別なルールがあるXMLファイルにとって特に重要です。

于 2011-10-12T15:03:35.113 に答える
1

TCPソケットを使用する場合は、「ストリーム」を処理します。つまり、デフォルトではメッセージ間に区切りはありません。あなたがするように進むことによって、あなたはメッセージの一部を読むかもしれません、あるいはさらに悪いことに、メッセージより多くを読むかもしれません。

続行する最も一般的な方法は、メッセージを区切ることです。文字列をバイトにエンコードするDataInputStream/DataOutputStreamを使用し、最初のバイトを使用してその長さを示すことができます。このようにして、レシーバー側で読み取る必要のあるバイト数を認識します。

    DataOutputStream out = null;
    DataInputStream in = null;
    Socket socket = new Socket("192.168.0.15",4444);
    out = new DataOutputStream(new BufferedOutputStream(socket.getOutputStream()));
    in = new DataInputStream(new BufferedInputStream(socket.getInputStream()));

    out.writeUTF(xmlInString);
    out.flush(); // to ensure everything is sent and nothing is kept in the buffer.

    // wait for response

    String responseLine = in.readUTF();

次に、それに応じてサーバーコードを調整します。

Bufferedパフォーマンス上の理由から推奨されるソケット付きの出力を使用するflush()場合は、メッセージを書き込んだ後で、すべてが実際にネットワーク経由で送信され、バッファに何も保持されないようにすることをお勧めします。

最初の問題は、メッセージに複数のTCP / IPパケットが必要であり、サーバーでは、到着したばかりの最初のパケットのみを読み取るために発生した可能性があります。

于 2011-10-12T15:10:36.140 に答える