【发布时间】:2019-04-05 12:06:18
【问题描述】:
我有一个 java 程序,其中客户端将使用套接字不断地向服务器发送一个数字。 通常,“readObject”或“writeObject”调用会等到对方准备好发送或接收。但在我这里的具体情况下,如果服务器当前没有读取,客户端将跳过对服务器的写入。
下面是我的客户端代码。我有一个请求类来发送信息,在我的情况下它只是一个整数:
Socket socket = new Socket("localhost", 2910);
ObjectOutputStream outToServer = new ObjectOutputStream(socket.getOutputStream());
Random r = new Random();
while(true) {
Request request = new Request();
request.reqType = Request.TYPE.ADD;
request.add = r.nextInt(100);
System.out.println("Sending to server: " + request.add);
outToServer.writeObject(request);
Thread.sleep(100);
}
这是服务器部分:
try {
ObjectInputStream inFromClient = new ObjectInputStream(socket.getInputStream());
ObjectOutputStream outToClient = new ObjectOutputStream(socket.getOutputStream());
while(true) {
Request req = (Request)inFromClient.readObject();
switch (req.reqType) {
case ADD : {
Logger.getInstance().log(name + " added " + req.add);
serv.add(req.add);
break;
}
case RESULT : {
Logger.getInstance().log(name + " produced result " + req.result);
break;
}
case RETRIEVE : {
int[] retrieve = serv.retrieve();
Logger.getInstance().log(name + " retrieved: " + retrieve[0] + ", " + retrieve[1] + ", " + retrieve[2]);
outToClient.writeObject(new Request(retrieve));
break;
}
}
}
} catch (IOException | ClassNotFoundException e) {
e.printStackTrace();
}
以上代码在线程中运行。 所以这里的事情是,我的客户发送一个 Request 对象,并将类型设置为 ADD。服务器将读取/接收请求,并检查类型,发现它是 ADD,所以它会调用 'serv.add'。这个调用可能会导致一个“wait()”调用,这意味着这里的线程在此时暂停,因此,卡住了。 客户端将尝试发送下一个请求对象,但由于服务器线程卡在“serv.add”调用上,客户端似乎没有写任何东西,只是跳过调用,并执行while循环再次。 所以我试图发送一堆请求,服务器没有收到。
我希望这是有道理的。
所以我想我的问题是: 如果服务器当前没有尝试从客户端读取,而客户端正在尝试写入,那么“writeObject”调用是否会超时,然后继续,或者发生了什么?
【问题讨论】:
标签: java multithreading sockets java-threads