java - 在通过 Socket 接收数据时设置超时

标签 java

我有一个在 Java 中通过 Socket 类发送数据的函数。当我发送数据时,我需要接收一些数据。问题是如何在 2 秒内设置等待数据的超时时间(如果我在 2 秒内没有收到数据,我需要了解发生了通信错误并显示消息)。 这是我的代码,有什么帮助吗?

    public boolean SendMonitorMessage(
            final MonitorRequestRepeatMessageTCP message) {
        boolean result = true;
        System.out
                .println("****************** SEND MONITOR REQUEST REPEAT MESSAGE TCP **********************************");

        // new Thread() {
        // public void run() {
        int prevService=message.GetService();
        synchronized (socket) {
            try {
                System.out.println("IPADDRESS=" + ipAddress);
                System.out.println("PORT=" + port);
                System.out.println("Is reachable=" + Ping());
                message.PrintMessage(message.toBytes());

                OutputStream socketOutputStream = (OutputStream) socket
                        .getOutputStream();
                socketOutputStream.write(message.toBytes());

                InputStream socketInputStream = (InputStream) socket
                        .getInputStream();
                
                byte[] buffer = new byte[256];
                List<byte[]> received = new LinkedList<byte[]>();
                int numberReceived;
                byte[] tempBuffer;

                while ((numberReceived = socketInputStream.read(buffer)) != -1) {
                    tempBuffer = new byte[numberReceived];
                    ByteBuffer baferce = ByteBuffer.wrap(tempBuffer);
                    baferce.put(buffer, 0, numberReceived);
                    received.add(tempBuffer);
                }
                
                if (received.size()>0){
                    new MonitorResponseMessageTCP(received, message.GetMonitorVariablesArrayList(), prevService);
                }
            } catch (UnknownHostException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
        return true;
    }

最佳答案

参见 SocketServerSocket .这两个类都有一个 setSoTimeout 方法来指定等待连接或等待接收数据时等待的最长时间。当该时间过去时,套接字将抛出一个 SocketTimeoutException,您可以使用错误消息或任何您想要的方式处理它。

在执行您想要超时的操作之前,您必须调用 setSoTimeout

之前

while ((numberReceived = socketInputStream.read(buffer)) != -1) {

你需要打电话

socket.setSoTimeout(2000);

然后将 catch(SocketTimeoutException) 部分添加到您已有的 try/catch block 中。

关于java - 在通过 Socket 接收数据时设置超时,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4992191/

相关文章:

java - jdbc 如何确保 2 行在一起是唯一的

java - Polar 心率传感器不可用作 google fit api 中的数据源 (xamarin android)

java - 为什么这个方法返回null? (从数组中调用一组字符串)

c# - 二维数组的所有可能组合

java - JSF validator 的 JUnit 测试

java - 如何捕获异常并在 Java 中继续处理

java - 如何使用 NetBeans 构建 ant 的 build.xml?

java 模式和匹配器

Java如何获取给定时区缩写的时区ID列表

java - 如何在 Struts 2 中转换 DTO