Java TCP 添加TOA

简介

TCP(传输控制协议)是一种用于在网络中传输数据的协议。TOA(Time of Arrival)是指数据包到达目的地的时间。在 Java 中,我们可以使用 Socket 和 ServerSocket 类来实现 TCP 通信。本文将介绍如何在 Java 中添加 TOA。

TCP 通信基础

在开始之前,我们先来了解一下 TCP 通信的基本原理和流程。

TCP 通信涉及两个主要角色:客户端和服务器。客户端发送请求到服务器,服务器接收请求并返回响应。

客户端

客户端的基本流程如下:

  1. 创建一个 Socket 对象,指定服务器的 IP 地址和端口号。
Socket socket = new Socket("服务器IP地址", 端口号);
  1. 通过 Socket 对象的输出流向服务器发送请求。
OutputStream outputStream = socket.getOutputStream();
outputStream.write("请求数据".getBytes());
  1. 通过 Socket 对象的输入流接收服务器返回的响应。
InputStream inputStream = socket.getInputStream();
byte[] buffer = new byte[1024];
int length = inputStream.read(buffer);
String response = new String(buffer, 0, length);
  1. 关闭 Socket 对象。
socket.close();

服务器

服务器的基本流程如下:

  1. 创建一个 ServerSocket 对象,指定监听的端口号。
ServerSocket serverSocket = new ServerSocket(端口号);
  1. 使用 ServerSocket 对象的 accept() 方法接收客户端的连接请求,并返回一个 Socket 对象。
Socket socket = serverSocket.accept();
  1. 通过 Socket 对象的输入流接收客户端发送的请求。
InputStream inputStream = socket.getInputStream();
byte[] buffer = new byte[1024];
int length = inputStream.read(buffer);
String request = new String(buffer, 0, length);
  1. 通过 Socket 对象的输出流向客户端发送响应。
OutputStream outputStream = socket.getOutputStream();
outputStream.write("响应数据".getBytes());
  1. 关闭 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,