Java Socket编程实例:TCP基本通信原理与代码
Java Socket编程是构建网络应用的基础。本文介绍如何使用Java标准库实现一个简单的TCP Echo Server与Client,通过实际代码解析`ServerSocket`监听、`Socket`连接以及输入输出流的读写流程,帮助开发者掌握网络通信的基本模式。
结果与目标
本例的目标是实现一个可靠的TCP通信模型:服务器端在特定端口监听请求,一旦有客户端连接,便读取其发送的数据,并将完全相同的数据原样返回(即“回声”效果)。此过程验证了Java IO流在网络传输中的可靠性,为后续处理更复杂协议打下基础。
准备条件
- 环境需安装JDK并确保
java.net.*和java.io.*包可用。 - 风险提示:Socket编程涉及底层资源管理,务必确保在
finally块中关闭Socket与流,否则可能导致连接泄漏或文件句柄耗尽。建议在正式项目中采用try-with-resources语法。
真实操作顺序
第1步:构建服务端并启动监听
目的:创建一个能够接受多个客户端连接的TCP服务器。服务器需要绑定到特定的IP和端口(例如5500),并通过循环等待新连接。
入口:主类 TCPEchoServer。
- 定义端口常量与服务缓冲区大小(如32字节)。
- 使用
new ServerSocket(servPort)创建监听 socket。 - 进入无限循环调用
servSock.accept()挂起直到客户端发起连接。 - 获取客户端地址信息用于日志记录。
import java.net.*;
import java.io.*;
public class TCPEchoServer {
private static final int BUFSIZE = 32;
public static void main(String[] args) throws IOException {
int servPort = 5500;
// 创建并绑定服务器套接字
ServerSocket servSock = new ServerSocket(servPort);
while (true) { // 永久运行,接受和处理连接
Socket clntSock = servSock.accept(); // 阻塞等待并接受连接
System.out.println("Handling client at " + clntSock.getRemoteSocketAddress());
// 获取输入输出流以进行数据传输
InputStream in = clntSock.getInputStream();
OutputStream out = clntSock.getOutputStream();
byte[] receiveBuf = new byte[BUFSIZE];
int recvMsgSize;
// 持续读取直到客户端断开(返回-1)
while ((recvMsgSize = in.read(receiveBuf)) != -1) {
// 将收到的数据立即写回给客户端
out.write(receiveBuf, 0, recvMsgSize);
}
clntSock.close(); // 处理完当前会话后关闭socket
}
}
}
第2步:编写客户端发送与接收逻辑
目的:连接到指定地址的服务端,发送测试字符串,并验证是否能正确收到相同的响应。
入口:主类 TCPEchoClient。
- 初始化服务器IP地址(本地通常为
127.0.0.1)与对应端口。 - 构造待发送的字节数据(如 “Hi, World”)。
- 实例化
Socket(server, servPort)自动建立连接。 - 利用
out.write()发送数据至服务端。
import java.net.*;
import java.io.*;
public class TCPEchoClient {
public static void main(String[] args) throws IOException {
String server = "127.0.0.1";
int servPort = 5500;
byte[] data = "Hi, World".getBytes();
// 建立与服务器的连接
Socket socket = new Socket(server, servPort);
System.out.println("Connected to server...sending echo string");
InputStream in = socket.getInputStream();
OutputStream out = socket.getOutputStream();
out.write(data); // 发送数据
// 循环读取直到收全所有字节
int totalBytesRcvd = 0;
int bytesRcvd;
while (totalBytesRcvd < data.length) {
if ((bytesRcvd = in.read(data, totalBytesRcvd, data.length - totalBytesRcvd)) == -1)
throw new SocketException("Connection closed prematurely");
totalBytesRcvd += bytesRcvd;
}
// 打印确认收到的内容
System.out.println("Received: " + new String(data));
socket.close();
}
}
第3步:执行结果与状态检查
完成判断:启动服务端程序后,控制台应显示 Handling client at ...;随后启动客户端,客户端控制台打印 Received: Hi, World 即表示成功完成了一次TCP双向通信。注意:默认的单线程服务端模型一次只能处理一个活跃连接。
原文有依据的排错
若遇到 BindException,请检查端口5500是否被其他进程占用。若出现 SocketException: Connection refused,请确认服务端已启动且客户端IP/端口配置一致。此外,单线程服务端不适合高并发场景,实际应用中需引入多线程机制。
简要总结
本文梳理了Java Socket编程在TCP环境下的核心实现步骤,从ServerSocket的搭建到Socket的数据收发,提供了可运行的基础代码片段。以上就是Java Socket编程TCP基本使用的详细内容,更多关于Java网络编程的资料请关注本站其它相关文章!
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













