Java MulticastSocket setSoTimeout冻结程序

时间:2018-11-12 20:13:41

标签: java multicastsocket

我正在尝试在我的程序中使用多播套接字。今天,我不确定发生了什么变化,但是当调用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);
    }
}

1 个答案:

答案 0 :(得分:0)

setSoTimeout的文档是

  

启用/禁用具有指定超时的SO_TIMEOUT,以毫秒为单位。   将此选项设置为非零超时后,将在   与此套接字关联的InputStream仅对此阻塞   多少时间。如果超时到期,则   尽管Socket仍然存在,但引发了java.net.SocketTimeoutException   有效。在进入阻止之前必须启用该选项   操作才有效果。超时必须大于0。超时为零   被解释为无限超时。

还有SO_TIMEOUT

  

设置阻止Socket操作的超时时间:

     
      
  • ServerSocket.accept()
  •   
  • SocketInputStream.read()
  •   
  • DatagramSocket.receive()
  •   
     

必须先设置选项,然后才能进入阻止操作   影响。如果超时到期,操作将继续   块,引发java.io.InterruptedIOException。套接字不是   在这种情况下关闭。

我不明白您对它的用法。