簡體   English   中英

Java套接字非阻塞讀取

[英]Java Sockets nonblocking read

我正在使用DataInputStream從套接字讀取字符/數據。

我想使用.readUnsignedShort(); 如果沒有要讀取的2個字節,則拋出異常。 我應該繼承DataInputStream並覆蓋添加異常的方法,還是有更簡單的方法?

如果你想要快速和臟的東西,請嘗試inputStream.available()

if (stream.available() < 2) {
    // throw it
}

如果您希望在數據可用時進行真正的非阻塞讀取和回調,我認為Pablo的答案更好。

我認為Java NIO非阻塞類是您的最佳選擇。 檢查SocketChannel類及其相關代碼示例。

但是要小心,當你發出你的讀命令時,可能是字節不可用的情況,但這並不意味着它永遠不會到達你的套接字......

void readButDoNotBlockForALongTime(java.net.Socket socket) {
    int someTimeout = 1000;
    socket.setSoTimeout(someTimeout);
    try {
        // read as much as you want - blocks until timeout elapses
    } catch (java.net.SocketTimeoutException e) {
        // read timed out - you may throw an exception of your choice
    }
}

這是一種只在你想要的時候阻止的簡單方法。

setSoTimeout(int timeout):使用指定的超時啟用/禁用SO_TIMEOUT,以毫秒為單位。 如果將此選項設置為非零超時,則與此Socket關聯的InputStream上的read()調用將僅阻止這段時間。 如果超時到期,則引發java.net.SocketTimeoutException,盡管Socket仍然有效。 必須在進入阻止操作之前啟用該選項才能生效。 超時必須> 0.超時為零被解釋為無限超時。

要獲得更優雅的解決方案,您可以考慮使用NIO。

如果輸入在提供兩個字節之前結束,則會拋出EOFException。 如果沒有可用的輸入()將返回零,雖然它也可以返回零,如果在某些情況下(如SSL)輸入。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM