首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Java MulticastSocket setSoTimeout冻结程序

Java MulticastSocket setSoTimeout冻结程序
EN

Stack Overflow用户
提问于 2018-11-13 04:13:41
回答 1查看 106关注 0票数 0

我正在尝试在我的一个程序中使用多播套接字。今天,我不确定发生了什么变化,但我的程序(它没有变化,以前工作得很好)在调用setSoTimeout(int)方法时随机地开始冻结。这是不一致的,在这种情况发生之前,该方法可能会被调用几次。有关于这是什么的线索吗?

代码:

代码语言:javascript
复制
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);
    }
}
EN

回答 1

Stack Overflow用户

发布于 2018-11-13 04:26:26

setSoTimeout的文档是

以指定的超时时间启用/禁用SO_TIMEOUT,单位为毫秒。当此选项设置为非零超时时,与此套接字关联的InputStream上的read()调用将仅在此时间段内阻塞。如果超时到期,则会引发java.net.SocketTimeoutException,但套接字仍然有效。必须在进入阻止操作之前启用该选项才能生效。超时必须大于0。零的超时被解释为无限超时。

SO_TIMEOUT

设置阻塞套接字操作的超时时间:

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

必须在进入阻塞操作之前设置该选项才能生效。如果超时时间到期,操作将继续阻塞,则会引发java.io.InterruptedIOException。在这种情况下,套接字未关闭。

我不明白你是怎么用它的。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53269427

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档