1

私はJavaネットワークプログラミングが初めてです。JavaでTCPクライアントのコードをグーグルで調べていました。次の例に出くわしました。

import java.lang.*;
import java.io.*;
import java.net.*;

class Client {
   public static void main(String args[]) {
      try {
         Socket skt = new Socket("localhost", 1234);
         BufferedReader in = new BufferedReader(new
            InputStreamReader(skt.getInputStream()));
         System.out.print("Received string: '");

         while (!in.ready()) {}
         System.out.println(in.readLine()); // Read one line and output it

         System.out.print("'\n");
         in.close();
      }
      catch(Exception e) {
         System.out.print("Whoops! It didn't work!\n");
      }
   }
}

クライアントは一度に 1 行ずつデータを読み込んでいるように見えますか?. OpenFlow パケットをストリーミングしているサーバーに接続しています。OpenFlow パケットの Wireshark スクリーンショットを以下に示します。

[http://www.openflow.org/downloads/screenshot-openflow-dissector-2008-07-15-2103.jpg][1]

完全なパケットを受信したら、それをファイルにダンプし、後でたとえばwiresharkを使用して読み取ります。上記のコードでは、calss BufferedReaderを使用してデータを「行」で読み取りますか? 少なくともそれが私が理解している方法です。完全なパケットを取得してファイルに書き込む方法はありますか?

4

2 に答える 2

2

リーダーは、テキスト データを操作するためのものです。バイナリ データを操作している場合 (スクリーンショットからは完全にはわかりません)、何らかの種類のストリーム (InputStreamまたは場合によってはDataInputStream) を操作する必要があります。オンラインで無作為に例を探すのではなく、自分が興味を持っていることに実際に当てはまる例を見つけてください。

また、絶対に使用しないでください。ほとんど役に立ちませんInputStream.available。それを使用したサンプルコードと同様です。

また、「OpenFlow Java」をグーグルで簡単に検索すると、興味深いヒットがいくつかありました。本当に最初から何かを書く必要がありますか?

于 2013-08-03T23:00:26.377 に答える
2

いいえ、しかしそのような機能を提供するライブラリがあります。たとえば、グアバを参照してください

http://docs.guava-libraries.googlecode.com/git/javadoc/com/google/common/io/ByteStreams.html

ライブラリを使用したくない (または使用できない) 場合は、このようなストリームを使用する必要があります

List<String> lst = new ArrayList<String>();
String line;
while ((line = in.readLine()) != null) {
   lst.add(line);
}

また

String str = "";
String line;
while ((line = in.readLine()) != null) {
   str += line + "\n";
}

BufferedReader.readLine() メソッドは、改行 ('\n') で新しい行を提供することに注意してください。InputStream がバイナリの場合は、代わりにバイトを使用する必要があります。

于 2013-08-03T23:00:44.603 に答える