Java正在读取TCP流
我想创建一个Java服务器套接字应用程序,它接收TCP数据包并读取其内容。根据数据包的内容,它将执行若干操作。我设法让它读取一些内容并打印一个字符串System.out.println(sb.toString()); 但是(a)并不是所有的内容都是打印出来的,(b)我不知道当内容以网络顺序到达时如何处理。例如,接收HTTP数据包并从报头报告“内容长度”或“用户代理”。任何例子都将不胜感激Java正在读取TCP流,java,sockets,tcp,network-programming,Java,Sockets,Tcp,Network Programming,我想创建一个Java服务器套接字应用程序,它接收TCP数据包并读取其内容。根据数据包的内容,它将执行若干操作。我设法让它读取一些内容并打印一个字符串System.out.println(sb.toString()); 但是(a)并不是所有的内容都是打印出来的,(b)我不知道当内容以网络顺序到达时如何处理。例如,接收HTTP数据包并从报头报告“内容长度”或“用户代理”。任何例子都将不胜感激 public static void main(String[ ] args){ PrintWriter
public static void main(String[ ] args){
PrintWriter out = null;
BufferedReader in = null;
int bufferSize = 0;
try{
String message = args[0];
int count = 0;
ServerSocket connectionSocket = null;
try {
connectionSocket = new ServerSocket(4444);
System.out.println("Server started");
} catch (IOException e) {
System.err.println("Could not listen on port: 4444.");
System.exit(1);
}
Socket clientSocket = null;
try {
while(true){
count++;
clientSocket = connectionSocket.accept();
System.out.println("TCP packet received… " + count);
InputStream is = clientSocket.getInputStream();
out = new PrintWriter(clientSocket.getOutputStream());
in = new BufferedReader(new InputStreamReader(is));
StringBuilder sb = new StringBuilder();
String line = null;
while ((line = in.readLine()) != null) {
sb.append(line + "\n");
}
System.out.println(sb.toString());
clientSocket.close();
}
} catch (IOException e) {
System.err.println("Accept failed.");
System.exit(1);
}
}
catch(Exception e){
e.printStackTrace();
}
}
Java本身不能提供数据包级接口。在java中,您不会“接收TCP数据包”,您只会得到一个数据流。你需要安装JPCap,标准数据包捕获库的java绑定。我怀疑OP只是希望能够在流到达时处理流。
如何处理以网络顺序到达的内容
您已经在您的中这样做了,而
如果您想让它做得更多,您需要在那里添加更多的代码。我不理解这个问题。”“网络顺序”是指二进制数据中的字节顺序。您正在接收HTTP头,它是字符串,而不是二进制。所有的标题都已经过了:如果想要内容长度的标题,只需进行一些字符串比较即可。@JohnPappas您没有处理包级别的问题。我也没有看到任何需要你去做的事情。为什么只要数据以一块的形式呈现给您,您就会对包级别的信息感兴趣?使用TCP的全部意义在于,您不必处理网络细节。您当然不需要数据包级别的信息来读取HTTP头,比如您到目前为止一直在谈论的那些头,它们是您将从套接字上的InputStream中读取的内容的一部分。如果您正在读取代码中提到的这个最新头的一部分,那么它不是TCP头。