【问题标题】:Java MulticastSocket setSoTimeout freezes programJava MulticastSocket setSoTimeout 冻结程序
【发布时间】:2018-11-12 20:13:41
【问题描述】:

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

【问题讨论】:

    标签: java multicastsocket


    【解决方案1】:

    setSoTimeout的文档是

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

    还有SO_TIMEOUT

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

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

    该选项必须在进入阻塞操作之前设置 影响。如果超时到期并且操作将继续 块,引发 java.io.InterruptedIOException。套接字不是 在这种情况下关闭。

    我不明白你的用法。

    【讨论】:

      猜你喜欢
      • 2015-05-09
      • 2016-12-18
      • 1970-01-01
      • 2010-09-17
      • 2017-10-18
      • 1970-01-01
      • 2020-12-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多