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");
      }
   }
}

客户端似乎一次读取一“行”数据?我正在连接到流式传输 OpenFlow 数据包的服务器。OpenFlow 数据包的wireshark 屏幕截图如下所示。

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

一旦我收到完整的数据包,我想将其转储到一个文件中,然后例如使用wireshark读取它。在上面的代码中,他们使用calss BufferedReader来读取“行”中的数据?至少我是这么理解的。有什么方法可以获取完整的数据包然后将其写入文件?

4

2 回答 2

2

阅读器用于处理文本数据。如果您正在使用二进制数据(从该屏幕截图中并不完全清楚),您应该使用某种类型的 Stream (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 回答