概要
TCP通信中的核心类和数据流
在 Java 中,TCP 通信涉及两个主要的类:Socket
和 ServerSocket
。
1. 代表客户端的类:Socket
- 用途:
Socket
类用于客户端与服务器端进行通信。它提供了流式 I/O 操作的功能,使客户端能够通过网络发送和接收数据。 - 主要方法:
getOutputStream()
:获取一个OutputStream
对象,用于向服务器发送数据。getInputStream()
:获取一个InputStream
对象,用于从服务器接收数据。
- 创建实例:客户端通过
new Socket(String host, int port)
创建连接到指定 IP 地址和端口的套接字实例。
2. 代表服务端的类:ServerSocket
- 用途:
ServerSocket
类用于服务器端监听并接受来自客户端的连接请求。它用于在指定端口上等待客户端的连接,并为每个连接创建一个新的Socket
对象。 - 主要方法:
accept()
:接受来自客户端的连接请求,返回一个新的Socket
实例,用于与客户端通信。
- 创建实例:服务器端通过
new ServerSocket(int port)
创建一个在指定端口上监听连接的套接字实例。
Java 实现 TCP 通信例子
客户端
public class TcpClient {
public static void main(String[] args) {
System.out.println("客户端启动,连接到服务器...");
try (Socket socket = new Socket("127.0.0.1", 10010);
OutputStream os = socket.getOutputStream();
InputStream is = socket.getInputStream();
Scanner scanner = new Scanner(System.in)) {
while (true) {
System.out.print("输入消息 (输入 'exit' 退出): ");
String message = scanner.nextLine();
if ("exit".equalsIgnoreCase(message)) {
System.out.println("客户端退出");
break;
}
// 发送消息到服务器
os.write(message.getBytes());
os.flush();
// 接收服务器的响应
byte[] bytes = new byte[1024];
int len = is.read(bytes);
if (len != -1) {
String response = new String(bytes, 0, len);
System.out.println("服务端返回数据: " + response);
}
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
服务端
public class TcpServer {
public static void main(String[] args) {
System.out.println("服务器启动,等待客户端连接...");
try (ServerSocket server = new ServerSocket(10010)) {
while (true) {
// 接受客户端连接
try (Socket socket = server.accept()) {
System.out.println("客户端已连接:" + socket.getInetAddress());
// 读取客户端发送的数据
try (InputStream is = socket.getInputStream();
OutputStream os = socket.getOutputStream()) {
byte[] bytes = new byte[1024];
int len;
while ((len = is.read(bytes)) != -1) {
String receivedMessage = new String(bytes, 0, len);
System.out.println("接收到客户端数据: " + receivedMessage);
// 发送响应到客户端
String response = "服务端接收成功";
os.write(response.getBytes());
os.flush(); // 确保数据被及时发送
}
}
}
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
Socket socket = server.accept();
用于接受来自客户端的连接请求,并返回一个新的 Socket 实例,用于与客户端进行通信。accept() 方法是一个阻塞调用
,这意味着服务器在调用此方法时会等待,直到有客户端尝试连接。如果没有客户端连接请求,服务器会在这里暂停执行,直到一个连接请求到达。
总结
- 客户端 (
Socket
) 用于创建连接并进行数据发送和接收。 - 服务端 (
ServerSocket
) 用于监听端口并接受客户端连接。 OutputStream
和InputStream
用于在 TCP 连接中发送和接收数据。
在实际应用中,确保在发送数据后调用 flush()
方法,以确保数据及时发送,并在接收数据时正确处理流的关闭和异常情况。
❤觉得有用的可以留个关注ya❤