【网络编程】3.TCP网络通信编程
1. Socket
1.1 基本介绍
- 套接字(Socket)广泛应用于开发网络应用程序。
- 通信两端都要有Socket,是两台机器间通信的端点。
- 网络通信就是Socket间的通信。
- Socket允许程序把网络连接当成当作一个流,数据在两个Socket间通过IO传输。
- 一般将主动发起通信的应用程序称作客户端,等待通信请求的应用程序为服务端。
1.2 Socket类介绍
- 构造方法
- Socket(InetAddress address, int port)
- 参数为IP地址和端口
- Socket(InetAddress address, int port)
- 成员方法
- InputStream getInputStream()
- 获取输入流
- OutputStream getOutputStream()
- 获取输出流
- void close()
- 关闭套接字
- InputStream getInputStream()
1.3 ServerSocket类介绍
- 构造方法
- ServerSocket(int port)
- port:监听的端口号
- ServerSocket(int port)
- 成员方法
- Socket accept()
- 该方法从连接请求队列中取出一个客户端连接请求,创建与客户端连接的Socket对象并返回。如果队列中没有连接请求,accept()方法会一直等待,直到接受到连接请求。
- void close()
- 关闭服务端套接字
- Socket accept()
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 介绍

- netstat可以查看当前主机的网络状况,包括端口监听情况和网络连接情况。
- 使用 -a 参数会显示所有socket,包括正在监听的。
- 使用 -n 以数字形式显示地址和端口号。
- 使用 -b 参数会显示在创建每个连接或监听端口时涉及的可执行程序。
2.2 常见状态
| 状态 | 含义 |
|---|---|
| LISTENING | 监听中 |
| ESTABLISHED | 已连接 |
| TIME_WAIT | 等待足够的时间以确保远程TCP接收到连接中断请求的确认 |
| CLOSE_WAIT | 等待从本地用户发来的连接中断请求 |
浙公网安备 33010602011771号