Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/387.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java正在读取TCP流_Java_Sockets_Tcp_Network Programming - Fatal编程技术网

Java正在读取TCP流

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

我想创建一个Java服务器套接字应用程序,它接收TCP数据包并读取其内容。根据数据包的内容,它将执行若干操作。我设法让它读取一些内容并打印一个字符串System.out.println(sb.toString()); 但是(a)并不是所有的内容都是打印出来的,(b)我不知道当内容以网络顺序到达时如何处理。例如,接收HTTP数据包并从报头报告“内容长度”或“用户代理”。任何例子都将不胜感激

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头。