0

ソケットを介して文字列を送信しようとしていますが、いくつか問題があります。送信しようとしている文字列は ; (注意: XML ではなく文字列です)

<message>
<header>
<messageType>snmp</messageType>
<sendFrom>192.168.0.16</sendFrom>
<hostName>oghmasysMehmet</hostName>
<sendTo>192.168.0.12</sendTo>
<receiverName>Mehmet</receiverName>
<date>03/10/2011</date>
</header>
<body>
<snmpType>getbulk</snmpType>
<ip>127.0.0.1</ip>
<port>161</port>
<oids>
  <oid>1.3.6.1.2.1.1.3.0</oid>
</oids>
<community>community</community>
<nR>0</nR>
<mR>5</mR>
</body>
</message>

しかし、サーバーから取得したものを見ると、それはただです。

<?xml version="1.0" encoding="UTF-8"?>

何が問題なのかわかりません:

私は使っている 、

socket = new Socket(localIP, Integer.parseInt(localPort));
out = new PrintWriter(socket.getOutputStream(), true);

クライアントから文字列を送信して使用するには、

in = new BufferedReader(new InputStreamReader(client.getInputStream()));
line = in.readLine();

サーバー上の文字列を読み取ります。

どうすれば解決できますか?

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

4

5 に答える 5

1

ストリームで改行文字が使用可能になるまで BufferedReader.readLine が返されないため、改行文字が欠落している可能性があります。

于 2011-10-03T15:15:49.607 に答える
1

これで、複数行を含む XML を書き出すことができました。最初の行は次のとおりです。

<?xml version="1.0" encoding="UTF-8"?>

サーバーでは、最初の行を読みました - 1 つのreadLine()呼び出しがあります。当然のことながら、これで 1 行のテキストが得られます。

改行を含む文字列を 1 行として送信する場合は、改行をエスケープする必要があります。

より良い代替手段は、行にまったく依存しないことです。送信する各文字列の長さのプレフィックスなので、次を送信します。

  • 長さ (バイト単位) (4 バイト)
  • 文字列データ (バイト配列として)

読み取り側では、4 バイトを読み取ってメッセージの長さを確認し、メッセージをバイト配列に読み取り、そのバイト配列から文字列を作成します。

DataInputStream合理的に簡単にそれを行うのにDataOutputStream役立ちます。すべての文字列に使用するエンコーディングを必ず指定する必要があることに注意してください。ほとんどの場合、UTF-8 は適切な出発点です。

于 2011-10-03T15:17:39.497 に答える
1

ルーカスには答えがあると思います。個人的には、私は readLine() を信頼していません。そうすることで、ソケットで有効な文字列データを受信して​​いると仮定しているためです....これは非常に貧弱な仮定です!

最初にバイトバッファに読み込んでから、文字列に変換してみてください:

byte[] buf = new byte[4096];

int actualNumberOfBytesRead = socket.getInputStream().read(buf);

String dataString = new String(buf, 0, actualNumberOfBytesRead);

...さて、私の例にはいくつかの問題がありますが、ポイント (すべき) は =D です。

于 2011-10-03T15:22:23.860 に答える
0

まず第一に、サーバーが送信したものを解析するためにバッファを使用する必要があります。良い例については、http://www.kodejava.org/examples/266.htmlを参照してください。

これをコードに追加したくない場合は、Apache Commons IO ライブラリを使用して次のことを行うことができます。

ByteArrayInputStream out = new ByteArrayInputStream();
IOUtils.readFully( in, out );
String output = new String( out.getBytes(), "UTF-8");

ストリーム サーバー側を flush() するように注意する必要があることに注意してください。すべてのデータが受信されるとすぐに、クライアントがソケットを閉じるようにします。このようにして、ソケットをあまりにも早く close() することはできません。

于 2011-10-03T16:18:03.547 に答える
0

入力がなくなるまで in.readline をループする必要があると思います。

http://download.oracle.com/javase/tutorial/networking/sockets/readingWriting.htmlの例を確認してください

于 2011-10-03T15:17:15.690 に答える