Java Socket编程
Socket是网络通信的端点,Java通过Socket类实现TCP网络编程。
核心类
| 类 | 作用 |
|---|---|
| Socket | 客户端套接字,连接服务器 |
| ServerSocket | 服务端套接字,监听客户端连接 |
| InetAddress | IP地址封装 |
服务端实现
基本服务端
Java
public class SimpleServer {
public static void main(String[] args) throws IOException {
// 创建服务端Socket,监听8888端口
ServerSocket serverSocket = new ServerSocket(8888);
System.out.println("服务端启动,等待连接...");
// 等待客户端连接(阻塞)
Socket clientSocket = serverSocket.accept();
System.out.println("客户端连接: " + clientSocket.getInetAddress());
// 获取输入输出流
InputStream in = clientSocket.getInputStream();
OutputStream out = clientSocket.getOutputStream();
// 读取客户端数据
BufferedReader reader = new BufferedReader(new InputStreamReader(in));
String message = reader.readLine();
System.out.println("收到: " + message);
// 发送响应
PrintWriter writer = new PrintWriter(out, true);
writer.println("服务端已收到消息");
// 关闭连接
clientSocket.close();
serverSocket.close();
}
}
多线程服务端
Java
public class ThreadedServer {
public static void main(String[] args) throws IOException {
ServerSocket serverSocket = new ServerSocket(8888);
while (true) {
Socket clientSocket = serverSocket.accept();
// 每个客户端一个线程
new Thread(new ClientHandler(clientSocket)).start();
}
}
static class ClientHandler implements Runnable {
private Socket socket;
public ClientHandler(Socket socket) {
this.socket = socket;
}
@Override
public void run() {
try {
BufferedReader in = new BufferedReader(
new InputStreamReader(socket.getInputStream()));
PrintWriter out = new PrintWriter(socket.getOutputStream(), true);
String line;
while ((line = in.readLine()) != null) {
System.out.println("收到: " + line);
out.println("Echo: " + line);
}
} catch (IOException e) {
e.printStackTrace();
} finally {
try { socket.close(); } catch (IOException e) {}
}
}
}
}
客户端实现
Java
public class SimpleClient {
public static void main(String[] args) throws IOException {
// 连接服务端
Socket socket = new Socket("localhost", 8888);
System.out.println("已连接服务端");
// 获取输入输出流
OutputStream out = socket.getOutputStream();
InputStream in = socket.getInputStream();
// 发送数据
PrintWriter writer = new PrintWriter(out, true);
writer.println("Hello Server");
// 接收响应
BufferedReader reader = new BufferedReader(new InputStreamReader(in));
String response = reader.readLine();
System.out.println("服务端响应: " + response);
// 关闭连接
socket.close();
}
}
Socket常用方法
Java
Socket socket = new Socket();
// 连接设置
socket.connect(new InetSocketAddress("localhost", 8888), 5000); // 超时5秒
socket.setSoTimeout(3000); // 读操作超时
socket.setKeepAlive(true); // 保持连接
socket.setTcpNoDelay(true); // 禁用Nagle算法
// 连接信息
InetAddress address = socket.getInetAddress(); // 服务端地址
int port = socket.getPort(); // 服务端端口
InetAddress localAddress = socket.getLocalAddress(); // 本地地址
int localPort = socket.getLocalPort(); // 本地端口
// 状态检查
socket.isConnected(); // 是否已连接
socket.isClosed(); // 是否已关闭
InetAddress使用
Java
// 获取本机地址
InetAddress localHost = InetAddress.getLocalHost();
String hostName = localHost.getHostName(); // 主机名
String hostAddress = localHost.getHostAddress(); // IP地址
// 根据主机名获取
InetAddress address = InetAddress.getByName("www.baidu.com");
// 根据IP获取
InetAddress address = InetAddress.getByName("192.168.1.1");
// 获取所有地址(多IP主机)
InetAddress[] addresses = InetAddress.getAllByName("www.baidu.com");
Socket通信流程
text
服务端 客户端
| |
ServerSocket(port) |
| |
accept() ←─────────────────── Socket(host, port)
| |
getInputStream() ←───────────── getOutputStream()
getOutputStream() ─────────────→ getInputStream()
| |
close() close()
注意事项
accept() 是阻塞方法,直到有客户端连接才返回
客户端和服务端的流操作要匹配,避免死锁(双方都在等待对方发送)
关闭Socket会同时关闭关联的流
大量连接时应使用线程池或NIO(Selector)代替单线程处理
读写超时设置很重要,防止无限等待
要点总结
- ServerSocket 监听端口,accept() 等待连接
- Socket 连接服务端,获取流进行通信
- 服务端需多线程处理多个客户端连接
- 设置超时防止阻塞等待
- 使用完及时关闭Socket释放资源
📝 发现内容有误?点击此处直接编辑