我是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来读取“行”中的数据?至少这就是我理解它的方式。在某种程度上,我可以获得完整的数据包,然后将其写入文件?
答案 0 :(得分:2)
读者可以使用文本数据。如果您正在使用二进制数据(从该屏幕截图中并不完全清楚),您应该使用某种类型的Stream(InputStream
或可能DataInputStream
)。不要只是在网上寻找随机的例子,试着找到那些真正适用于你感兴趣的事情。
另外,不要使用InputStream.available
,它几乎没用。就像使用它的任何示例代码一样。
另外,一个简单的谷歌搜索“OpenFlow java”有一些有趣的点击。你确定你需要从头开始写东西吗?
答案 1 :(得分:2)
不,但有些库提供了这样的功能。参见例如Guava
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是二进制的,那么你应该使用字节。