我正在尝试在我的一个程序中使用多播套接字。今天,我不确定发生了什么变化,但我的程序(它没有变化,以前工作得很好)在调用setSoTimeout(int)方法时随机地开始冻结。这是不一致的,在这种情况发生之前,该方法可能会被调用几次。有关于这是什么的线索吗?
代码:
private String[] getPlayerInfo() {
sendMessageToPlayers("count", 500);
String[] temp = new String[4];
while (true) {
try {
byte[] buffer = new byte[1000];
DatagramPacket datagram = new DatagramPacket(buffer, buffer.length);
cSocket.receive(datagram);
String message = new String(datagram.getData());
if (message.contains("received")) {
message.substring(message.indexOf("received") - 1, 1);
int playerNum = Integer.parseInt(message.substring(message.indexOf("received") - 1, 1));
temp[playerNum] = message.substring(message.indexOf("received") + "received ".length());
}
} catch (IOException e) {
try {
cSocket.setSoTimeout(100000);
} catch (SocketException e1) {
break;
}
break;
}
}
return temp;
}
public void sendMessageToPlayers(String message, int timeout) {
byte[] buf = (message).getBytes();
DatagramPacket dg = new DatagramPacket(buf, buf.length, group, 6789);
try {
cSocket.send(dg);
cSocket.setSoTimeout(timeout);
} catch (IOException ex) {
System.out.println(ex);
}
}发布于 2018-11-13 04:26:26
setSoTimeout的文档是
以指定的超时时间启用/禁用SO_TIMEOUT,单位为毫秒。当此选项设置为非零超时时,与此套接字关联的InputStream上的read()调用将仅在此时间段内阻塞。如果超时到期,则会引发java.net.SocketTimeoutException,但套接字仍然有效。必须在进入阻止操作之前启用该选项才能生效。超时必须大于0。零的超时被解释为无限超时。
设置阻塞套接字操作的超时时间:
必须在进入阻塞操作之前设置该选项才能生效。如果超时时间到期,操作将继续阻塞,则会引发java.io.InterruptedIOException。在这种情况下,套接字未关闭。
我不明白你是怎么用它的。
https://stackoverflow.com/questions/53269427
复制相似问题