Java套接字闲置了吗?
这是我第一次使用socket。由于某种原因,在没有任何错误/异常的情况下约20分钟后,套接字不会从服务器接收任何内容。我是在代码中犯了严重错误,还是错过了某种套接字空闲状态?我试着使用基础知识Java套接字闲置了吗?,java,websocket,Java,Websocket,这是我第一次使用socket。由于某种原因,在没有任何错误/异常的情况下约20分钟后,套接字不会从服务器接收任何内容。我是在代码中犯了严重错误,还是错过了某种套接字空闲状态?我试着使用基础知识 executorService1.execute(new Runnable() { @Override public void run() { while (true) { System.out.println("
executorService1.execute(new Runnable() {
@Override
public void run() {
while (true) {
System.out.println("Trying");
String answer = null;
try {
//answer = setInput(s).readLine();
input.ready();
answer = input.readLine();
} catch (IOException e) {
e.printStackTrace();
}
if (answer == null) {
System.out.println("Starting to reconnect");
checkPrintQueue();
try {
s = new Socket(serverIpAddress, serverPort);
input = new BufferedReader(new InputStreamReader(s.getInputStream()));
} catch (IOException e) {
e.printStackTrace();
}
} else if (answer.equals("print")) {
System.out.println("Printed");
checkPrintQueue();
} else {
System.out.println("Testing");
}
}
}
在套接字的生命周期中,您需要使用相同的
BufferedReader
。否则,您可能会丢失数据
注意:当
readLine()
返回null时,必须关闭连接。您正在泄漏套接字。catch(IOException e){e.printStackTrace();}
-不要这样做,它通常只会隐藏您可能遇到的任何问题,例如您当前遇到的问题。如果您不知道如何处理选中的异常,则将其重新显示为未选中是一个更好的选择。@eis为什么?错误将被打印出来。您不应该做的是捕获并忽略,这里不是这种情况。@Gimby如果同一个套接字已经发生IOException,那么继续使用或重试它是没有意义的。它不会神奇地开始工作。错误可能会打印出来,也可能不会打印出来,这取决于其他情况,但您不应该像什么都没有发生一样继续。定义“不接收任何内容”。接收空值?阻碍?什么是setInput()
?@eis,但这不是我至少会看到打印出来的东西吗?或者它不会打印任何东西,因为我以前没有遇到过这样的情况。但是在我的例子中,它没有达到创建新BufferedReader的程度,因为它只在一行中进行侦听和等待。但我将使用与您建议的相同的BufferedReader,然而,这真的是问题所在吗?您正在丢失数据。这怎么可能不是问题呢?我之所以使用这种方法,是因为当套接字只有一个BufferedReader时,我陷入了(answer==null)逻辑,例如,当internet连接丢失时。如果我没有赶上你,我真的很抱歉,我对这个话题很陌生。如果你“陷入(答案==null)
逻辑”中,对等方将关闭连接。创建一个新的BufferedReader
无法改变这一点。这与“互联网丢失”无关。到底是哪一个?在套接字的生命周期中,您不需要使用相同的BufferedReader
?你不能丢失数据吗null
并不意味着流的结束?您不需要在流结束时关闭套接字?他没有漏插座?请解释一下。