Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/369.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.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 - Fatal编程技术网

Java 如何演示所有TCP套接字状态

Java 如何演示所有TCP套接字状态,java,sockets,tcp,Java,Sockets,Tcp,我试着在笔记本电脑上使用Ubuntu操作系统在运行时观察一个简单的java echo服务器和客户端程序。为了了解幕后发生的事情,我运行了服务器客户端并使用了这个命令 sudo netstat -pant 10007 Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name tcp6 0 0 :::10007

我试着在笔记本电脑上使用Ubuntu操作系统在运行时观察一个简单的java echo服务器和客户端程序。为了了解幕后发生的事情,我运行了服务器客户端并使用了这个命令

   sudo netstat -pant 10007

Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name

tcp6       0      0 :::10007                :::*                    LISTEN      3551/java          
tcp6       0      0 127.0.0.1:35459         127.0.0.1:10007         ESTABLISHED 3570/java       
tcp6       0      0 127.0.0.1:10007         127.0.0.1:35459         ESTABLISHED 3551/java      
因此,我们可以看到被动服务器(环回)处于侦听状态,在接受客户机(127.0.0.1.35459)后,套接字将与处于已建立状态的主动服务器(127.0.0.1.10007)创建一个新的TCP连接。 但是,我们知道有几个TCP套接字状态,例如:SYN_SEND、SYN_RECEIVED、esthed、LISTEN、FIN_WAIT_1、TIMED_WAIT、CLOSE_WAIT、FIN_WAIT_2、LAST_ACK、CLOSED等。因此,我对其他状态感到困惑,程序是否跳过这些套接字状态

我想查看所有TCP套接字状态,以了解整个套接字状态转换场景。那么我哪里做错了?我的命令错了吗?或者缺少任何代码修改?我是否缺少任何网络工具?在我的循序渐进的过程中出了什么问题

那么,如何演示所有TCP套接字状态

以下是服务器代码:

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

public class EchoServer 
{ 
 public static void main(String[] args) throws IOException 
   { 
    ServerSocket serverSocket = null; 

    try { 
         serverSocket = new ServerSocket(10007); 
        } 
    catch (IOException e) 
        { 
         System.err.println("Could not listen on port: 10007."); 
         System.exit(1); 
        } 

    Socket clientSocket = null; 
    System.out.println ("Waiting for connection.....");

    try { 
         clientSocket = serverSocket.accept(); 
        } 
    catch (IOException e) 
        { 
         System.err.println("Accept failed."); 
         System.exit(1); 
        } 

    System.out.println ("Connection successful");
    System.out.println ("Waiting for input.....");

    PrintWriter out = new PrintWriter(clientSocket.getOutputStream(), 
                                      true); 
    BufferedReader in = new BufferedReader( 
            new InputStreamReader( clientSocket.getInputStream())); 

    String inputLine; 

    while ((inputLine = in.readLine()) != null) 
        { 
         System.out.println ("Server: " + inputLine); 
         out.println(inputLine); 

         if (inputLine.equals("Bye.")) 
             break; 
        } 

    out.close(); 
    in.close(); 
    clientSocket.close(); 
    serverSocket.close(); 
   } 
} 
以下是客户端代码:

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

public class EchoClient {
    public static void main(String[] args) throws IOException {

        String serverHostname = new String ("127.0.0.1");

        if (args.length > 0)
           serverHostname = args[0];
        System.out.println ("Attemping to connect to host " +
        serverHostname + " on port 10007.");

        Socket echoSocket = null;
        PrintWriter out = null;
        BufferedReader in = null;

        try {

            echoSocket = new Socket(serverHostname, 10007);
            out = new PrintWriter(echoSocket.getOutputStream(), true);
            in = new BufferedReader(new InputStreamReader(
                                        echoSocket.getInputStream()));
        } catch (UnknownHostException e) {
            System.err.println("Don't know about host: " + serverHostname);
            System.exit(1);
        } catch (IOException e) {
            System.err.println("Couldn't get I/O for "
                               + "the connection to: " + serverHostname);
            System.exit(1);
        }

    BufferedReader stdIn = new BufferedReader(
                                   new InputStreamReader(System.in));
    String userInput;

        System.out.print ("input: ");
    while ((userInput = stdIn.readLine()) != null) {
        out.println(userInput);
        System.out.println("echo: " + in.readLine());
            System.out.print ("input: ");
    }

    out.close();
    in.close();
    stdIn.close();
    echoSocket.close();
    }
}

这里的问题是,操作系统将负责状态。您不能简单地从Java控制L4协议。如果您想这样做,您必须在linux原始套接字上实现您自己的TCP堆栈(可能已经有了一个实现,还没有看到)

所以,让操作系统负责状态并使用环回进行测试,您的状态将有几微秒的生存时间。(事实上,我相信现代linux甚至会跳过其中一些,当两端在同一台机器上,并且没有实际的网络参与时。)我想说,试图通过netstat查看状态对于理解TCP是如何工作的几乎没有价值

我建议,你去看一看。它很好地描述了所有的状态,并且有很好的图表描述了状态转换

如果您想查看“在线”上发生的情况,我建议您尝试tcpdump或tcpdump<代码>tcpdump-n-i lo端口10007(有关更多用法、更详细的输出等,请参阅手册页),或GUI应用程序Wireshark。Wireshark可能是您更好的选择,因为它能很好地解析数据包,并解释几乎每一个细节


(实际上,tcpdump可以用来捕获到文件中的数据包-使用
-w file
标志,然后稍后在Wireshark中打开。)

您必须快速,或者在延迟非常低的链接上运行。如果网络正常运行,SYN-SENT和SYN-RECEIVED将在一秒钟内转换为已建立,这同样适用于几个关闭阶段。您需要使用某种节流工具将网络连接速度降低到大约10字节/秒,然后您将看到所有状态。我怀疑事情发生得太快了,你无法观察所有的状态。我不明白。你能说得更具体一点吗:有没有明确的代码、指南或类似的链接。你不明白到底是什么?你有两条评论,都表达得很清楚。我理解这些评论的意思,但怎样才能让它慢下来呢?需要什么命令或代码才能使其变慢?在您的评论之后,我现在很清楚了。但是仍然可以在特定的套接字连接和端口上检索tcp数据包(我猜tcp数据包包含:SYN标志、ACK标志、FIN标志等),然后我可以很容易地得到关于背后发生的事情的其他解释。那么,你知道任何命令(例如:netstat等)?@user5005768我更新了答案。。。希望能有帮助。