查看套接字InputStream

时间:2014-05-26 13:22:50

标签: java sockets

我想在处理从远程主机接收的数据时,每隔x ms测试一次ScheduledExecutorService中客户端和服务器之间的连接。

所以我做了这样的事情:

public class MyClass {
    private final ScheduledExecutorService _timer = Executors.newScheduledThreadPool(1);
    private Socket _connection;

    public void connectToDistantHost() {
        try {
            _connection = new Socket();
            _connection.connect(_adresseServeur);
            new Thread(new Runnable() {
                @Override
                public void run() {
                    try {
                        //let another object know the connection is ok
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            }).start();
        } catch (IOException e) {
            e.printStackTrace();
        }

        _timer.scheduleAtFixedRate(new Runnable() {
            @Override
            public void run() {
                testConnection();
            }
        }, 0, 200, TimeUnit.MILLISECONDS);
    }

    private void testConnection() {
        //would like to peek on the socket's inputstream to know if something's wrong
    }

    private void myProcessing() {
        while (true) {
            ...

            //read what's inside stream
            //process it in a thread
        }
    }
} 

因此,如果我在Socket的输入流上使用.read(),那么它将使用myProcessing()。我想在BufferedReader中包装输入流并在读取之前标记缓冲区位置然后重置位置,但是由于测试和处理是两个不同的线程,它无论如何都不会工作。

我该怎么做?知道我在c#中做了很多没问题:

class TraitementEnvoiClient {
    ...
    private void testConnection(Object obj, ElapsedEventArgs args) {
        _connectionIsOk = _connexionAuServeur.IsConnected();

        if (!_connectionIsOk) {
            tryToReconnect();
        }
    }
}

public static class ExtensionTcpClient {
    //Credit to ElFenix: http://social.msdn.microsoft.com/Forums/en-US/c857cad5-2eb6-4b6c-b0b5-7f4ce320c5cd/c-how-to-determine-if-a-tcpclient-has-been-disconnected?forum=netfxnetcom
    public static bool IsConnected(this TcpClient client) {
        // Detect if client disconnected
        try {
            if (client.Client.Poll(0, SelectMode.SelectRead)) {
                byte[] buff = new byte[1];
                if (client.Client.Receive(buff, SocketFlags.Peek) == 0) {
                    // Client disconnected
                    return false;
                }
            }
        } catch (SocketException se) {
            return false;
        }
        return true;
    }
}

谢谢

编辑:我想做出类似的事情:

private static boolean isConnected(Socket client) {
    try {
        InputStream is = client.getInputStream();
        if(is.peek() == -1) return false;
        OutputStream os = client.getOutputStream();
        os.write(new byte[]{}); //if it fails a IOException will trigger
    } catch(SocketException se) {
        return false;
    } catch(IOException ioe) {
        return false;
    }
    return true;
}

1 个答案:

答案 0 :(得分:1)

测试是多余的。如果另一端在操作之前或期间关闭或断开,则读或写操作将返回-1。首先“测试”连接是没有意义的,因为它可能会在IO操作期间失败。

另见评论中提到的其他答案。