java - Java Socket:客户端等待服务器被接受
问题描述
我有一个线程池,最多可提供 3 个线程。每个人都创建并接受一个客户。当第四个客户端尝试连接时,我希望它被告知它必须等到线程/连接空闲。
问题是,当第 4 个客户端使用 connect() 启动请求时,理论上它应该卡住 500 毫秒,然后打印异常超时字符串,最后再试一次,直到服务器线程有空为其提供服务。实际上,客户端通过了 connect(),当然会卡在 ObjectOutputStream 中而没有显示任何错误消息......
客户端:
boolean connected = false;
Socket s=null;
ObjectOutputStream dos = null;
ObjectInputStream dis = null;
while (!connected) {
try {
s = new Socket();
InetSocketAddress sa = new InetSocketAddress("localhost", 5056);
s.connect(sa,500);
connected = true;
dos = new ObjectOutputStream(s.getOutputStream());
dis = new ObjectInputStream(s.getInputStream());
} catch (ConnectException e) {
System.out.println("Error while connecting. " + e.getMessage());
} catch (SocketTimeoutException e) {
System.out.println("Connection: " + e.getMessage() + ".");
} catch (IOException e) {
e.printStackTrace();
}
}
//<CONNECTED: OPERATIONS TO DO>
服务器端:
服务器调度员:
ServerSocket ss = new ServerSocket(5056);
ExecutorService exec = Executors.newFixedThreadPool(3);
for (int i = 0; i < 10; i++) { // only 10 connections in total
Runnable task = new ClientHandler(ss);
exec.execute(task);
}
exec.shutdown();
服务器任务:
class ClientHandler implements Runnable {
final ServerSocket ss;
private Socket s;
private ObjectInputStream dis;
private ObjectOutputStream dos;
// Constructor
public ClientHandler(ServerSocket ss) {
this.ss = ss;
}
@Override
public void run() {
try {
System.out.println("ClientHandler: "+Thread.currentThread().getName()+" <WAITING>");
s = ss.accept();
System.out.println("ClientHandler: "+Thread.currentThread().getName()+" <CONNECTED>");
dis = new ObjectInputStream(s.getInputStream());
dos = new ObjectOutputStream(s.getOutputStream());
} catch (IOException e) {
e.printStackTrace();
}
//<OPERATIONS>
}
}
解决方案
推荐阅读
- c# - Visual Studio:如何使用构建后脚本将字符串参数传递给 exe
- python - 在 numpy / scipy 中为 A 求解 A x = b
- javascript - 我如何在 react-native 中自定义下划线代码
- github - 为什么 github 会阻止零提交拉取请求?
- java - SaxonParserTest 缺少 SaxonXQDataSource?
- android - 如何在 Android 设备上的 Flutter 应用中显示 TIFF 图像?
- angular - 使用 HTMLAudioElement 检测角度变化
- express - Express/Node/Mongoose:为什么 find() on collection 在我的 router.js 中失败?
- java - 如何在 Java 中将 HMAC 密钥指定为十六进制
- mysql - 如何向用户生成的 sql 查询添加 LIMIT