【网络编程】3.TCP网络通信编程

1. Socket

1.1 基本介绍

  1. 套接字(Socket)广泛应用于开发网络应用程序。
  2. 通信两端都要有Socket,是两台机器间通信的端点。
  3. 网络通信就是Socket间的通信。
  4. Socket允许程序把网络连接当成当作一个流,数据在两个Socket间通过IO传输。
  5. 一般将主动发起通信的应用程序称作客户端,等待通信请求的应用程序为服务端。

1.2 Socket类介绍

  • 构造方法
    • Socket(InetAddress address, int port)
      • 参数为IP地址和端口
  • 成员方法
    • InputStream getInputStream()
      • 获取输入流
    • OutputStream getOutputStream()
      • 获取输出流
    • void close()
      • 关闭套接字

1.3 ServerSocket类介绍

  • 构造方法
    • ServerSocket(int port)
      • port:监听的端口号
  • 成员方法
    • Socket accept()
      • 该方法从连接请求队列中取出一个客户端连接请求,创建与客户端连接的Socket对象并返回。如果队列中没有连接请求,accept()方法会一直等待,直到接受到连接请求。
    • void close()
      • 关闭服务端套接字

1.4 案例

当客户端输入“name”时,服务端返回“我是alan”;当客户端输入“hobby”时,服务端返回“唱歌”;当客户端输入“exit”时,客户端和服务端都退出;当客户端输入其他内容时,服务端返回“你说什么?”。服务端代码如下:

@Test
public void testServer() throws IOException {
    System.out.println("服务端启动...");
    ServerSocket serverSocket = new ServerSocket(9999);
    Socket socket = serverSocket.accept();
    BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
    BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
    String s;
    while (!"exit".equals(s = br.readLine())) {
        if ("name".equals(s)) {
            System.out.println("name");
            bw.write("我是alan");
        } else if ("hobby".equals(s)) {
            System.out.println("hobby");
            bw.write("唱歌");
        } else {
            System.out.println("other");
            bw.write("你说什么?");
        }
        bw.newLine();
        bw.flush();
    }
    bw.close();
    br.close();
    socket.close();
    serverSocket.close();
    System.out.println("服务端退出...");
}

客户端代码如下:

@Test
public void testClient() throws IOException {
    Socket socket = new Socket("127.0.0.1", 9999);
    BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
    BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
    System.out.println("客户端启动");
    Scanner scanner = new Scanner(System.in);

    while (true) {
        String s = scanner.next();
        bw.write(s);
        bw.newLine();
        bw.flush();
        if ("exit".equals(s)) {
            break;
        }
        System.out.println(br.readLine());
    }
    bw.close();
    br.close();
    socket.close();
    System.out.println("客户端退出...");
}

注意:当客户端连接到服务端后,客户端也是通过一个端口和服务端进行通讯的,这个端口时TCP/IP协议随机来分配的。

2. netstat指令

2.1 介绍

image-20210728181424747

  1. netstat可以查看当前主机的网络状况,包括端口监听情况和网络连接情况。
  2. 使用 -a 参数会显示所有socket,包括正在监听的。
  3. 使用 -n 以数字形式显示地址和端口号。
  4. 使用 -b 参数会显示在创建每个连接或监听端口时涉及的可执行程序。

2.2 常见状态

状态 含义
LISTENING 监听中
ESTABLISHED 已连接
TIME_WAIT 等待足够的时间以确保远程TCP接收到连接中断请求的确认
CLOSE_WAIT 等待从本地用户发来的连接中断请求
posted @ 2021-07-31 17:38  haojinglei  阅读(189)  评论(0)    收藏  举报