### Java Socket 用法详解及示例
#### 一、Socket 概述
在 Java 编程语言中,Socket 是一种实现网络通信的基础类库,主要用于建立客户端与服务器之间的连接,进行数据传输。通过 Socket,应用程序可以跨越网络进行双向通信。
#### 二、ServerSocket 的配置与使用
##### 1. ServerSocket 的基本配置选项
- **SO_TIMEOUT**:表示等待客户端连接的超时时间。
- **SO_REUSEADDR**:表示是否允许重用地址。
- **SO_RCVBUF**:表示接收缓冲区的大小。
这些配置可以通过以下方法设置:
- **setSoTimeout(int timeout)**:设置等待客户端连接的超时时间。
- **getSoTimeout()**:获取等待客户端连接的超时时间。
例如,下面的代码展示了如何为一个 ServerSocket 设置超时时间为 6 秒,并捕获可能出现的异常:
```java
import java.io.*;
import java.net.*;
public class TimeoutTester {
public static void main(String args[]) throws IOException {
ServerSocket serverSocket = new ServerSocket(8000);
serverSocket.setSoTimeout(6000); // 设置超时时间为 6 秒
try {
Socket socket = serverSocket.accept(); // 等待客户端连接
socket.close();
System.out.println("连接成功");
} catch (SocketTimeoutException e) {
System.out.println("连接超时:" + e.getMessage());
} finally {
serverSocket.close();
}
}
}
```
如果在指定的时间内没有客户端连接,则会抛出 `SocketTimeoutException` 异常。
##### 2. ServerSocket 的构造方法
- **ServerSocket()**:创建一个默认监听端口的 ServerSocket 对象。
- **ServerSocket(int port)**:创建一个监听指定端口的 ServerSocket 对象。
- **ServerSocket(int port, int backlog)**:创建一个监听指定端口的 ServerSocket 对象,并设置队列长度。
- **ServerSocket(int port, int backlog, InetAddress bindAddr)**:创建一个监听指定端口的 ServerSocket 对象,设置队列长度以及绑定的 IP 地址。
##### 3. ServerSocket 的主要功能
- **accept()**:阻塞式方法,用于接受客户端的连接请求。
#### 三、Socket 示例
下面的示例展示了如何创建一个 ServerSocket,并处理多个客户端连接请求:
```java
import java.net.*;
import java.io.*;
public class MultiClientServer {
public static void main(String args[]) throws Exception {
final int length = 100;
String host = "localhost";
int port = 8000;
ServerSocket serverSocket = new ServerSocket(port);
for (int i = 0; i < length; i++) {
// 创建新的线程来处理每个客户端的连接
Thread t = new Thread(new ClientHandler(serverSocket.accept()));
t.start();
System.out.println("已连接第 " + (i + 1) + " 个客户端");
}
}
}
class ClientHandler implements Runnable {
private Socket clientSocket;
public ClientHandler(Socket socket) {
this.clientSocket = socket;
}
@Override
public void run() {
try {
// 处理客户端连接
InputStream in = clientSocket.getInputStream();
OutputStream out = clientSocket.getOutputStream();
// 进行数据读写操作...
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
clientSocket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
```
该示例中,ServerSocket 通过 `accept()` 方法等待客户端连接,并为每个客户端创建一个新的线程来处理连接。这样可以确保服务器能够同时处理多个客户端的请求。
### 总结
通过本文的学习,我们了解了 Java 中 Socket 的基本概念,ServerSocket 的配置与使用方法,以及如何通过示例代码来实现一个简单的多客户端服务器程序。这对于开发基于网络的应用程序非常有用。在实际开发过程中,还需要根据具体需求调整配置参数,并处理各种异常情况,确保网络通信的稳定性和安全性。