Java TCP 添加TOA
简介
TCP(传输控制协议)是一种用于在网络中传输数据的协议。TOA(Time of Arrival)是指数据包到达目的地的时间。在 Java 中,我们可以使用 Socket 和 ServerSocket 类来实现 TCP 通信。本文将介绍如何在 Java 中添加 TOA。
TCP 通信基础
在开始之前,我们先来了解一下 TCP 通信的基本原理和流程。
TCP 通信涉及两个主要角色:客户端和服务器。客户端发送请求到服务器,服务器接收请求并返回响应。
客户端
客户端的基本流程如下:
- 创建一个 Socket 对象,指定服务器的 IP 地址和端口号。
Socket socket = new Socket("服务器IP地址", 端口号);
- 通过 Socket 对象的输出流向服务器发送请求。
OutputStream outputStream = socket.getOutputStream();
outputStream.write("请求数据".getBytes());
- 通过 Socket 对象的输入流接收服务器返回的响应。
InputStream inputStream = socket.getInputStream();
byte[] buffer = new byte[1024];
int length = inputStream.read(buffer);
String response = new String(buffer, 0, length);
- 关闭 Socket 对象。
socket.close();
服务器
服务器的基本流程如下:
- 创建一个 ServerSocket 对象,指定监听的端口号。
ServerSocket serverSocket = new ServerSocket(端口号);
- 使用 ServerSocket 对象的 accept() 方法接收客户端的连接请求,并返回一个 Socket 对象。
Socket socket = serverSocket.accept();
- 通过 Socket 对象的输入流接收客户端发送的请求。
InputStream inputStream = socket.getInputStream();
byte[] buffer = new byte[1024];
int length = inputStream.read(buffer);
String request = new String(buffer, 0, length);
- 通过 Socket 对象的输出流向客户端发送响应。
OutputStream outputStream = socket.getOutputStream();
outputStream.write("响应数据".getBytes());
- 关闭 Socket 对象。
socket.close();
添加TOA
要添加 TOA(Time of Arrival)功能,我们需要在客户端发送请求之前记录当前时间,在服务器接收请求后记录当前时间,并计算两个时间之差。
在客户端发送请求之前,我们可以使用 System 类的 currentTimeMillis() 方法获取当前时间戳,并将其作为请求的一部分发送给服务器。
long sentTime = System.currentTimeMillis();
outputStream.write((sentTime + " 请求数据").getBytes());
在服务器接收到请求后,我们可以再次使用 System 类的 currentTimeMillis() 方法获取当前时间戳,并计算时间差。
long receivedTime = System.currentTimeMillis();
long timeOfArrival = receivedTime - sentTime;
完整示例
客户端代码
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;
public class Client {
public static void main(String[] args) {
try {
// 创建 Socket 对象
Socket socket = new Socket("服务器IP地址", 端口号);
// 获取输出流
OutputStream outputStream = socket.getOutputStream();
// 记录发送时间并发送请求
long sentTime = System.currentTimeMillis();
outputStream.write((sentTime + " 请求数据").getBytes());
// 获取输入流
InputStream inputStream = socket.getInputStream();
// 接收响应
byte[] buffer = new byte[1024];
int length = inputStream.read(buffer);
String response = new String(buffer, 0, length);
// 关闭 Socket
socket.close();
// 打印响应和TOA
System.out.println("响应:" + response);
System.out.println("TOA:" + (System.currentTimeMillis() - sentTime));
} catch (IOException e) {
e.printStackTrace();
}
}
}
服务器代码
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;
public class Server {
public static void main(String[] args) {
try {
// 创建 ServerSocket 对象
ServerSocket serverSocket = new ServerSocket(端口号);
// 接收客户端连接
Socket socket = serverSocket.accept();
// 获取输入流
InputStream inputStream = socket.getInputStream();
// 接收请求
byte[] buffer = new byte[1024];
int length = inputStream.read(buffer);
String request = new String(buffer,