簡體   English   中英

DataOutputStream.write(byte b [],int off,int len)不會引發異常

[英]DataOutputStream.write(byte b[], int off, int len) don't throws exception

我使用DataOutputStream向服務器發送/接收字節流。 首先,我討論重要的代碼部分,然后提出問題。

我有一個發送方法如下:

protected static void sendMessage (Socket socket, byte[] b)  throws IOException
{
   BufferedOutputStream bos = new BufferedOutputStream(socket.getOutputStream(), 2048);
   DataOutputStream serverOut = new DataOutputStream(bos);

   serverOut.write(b, 0, b.length);
   serverOut.flush();
}

我使用上述方法通過DataOutputStream實例將消息發送到服務器。 注意: Socket實例之前已初始化,並作為參數發送給此方法;

另外,我有如下的receive方法:

protected static void receive (Socket socket, byte[] b) throws IOException
{ 
   BufferedInputStream bis = new BufferedInputStream (socket.getInputStream ());
   DataInputStream serverIn = new DataInputStream (bis);

   serverIn.readFully(b, 0, b.length);
}

在最后一步中,我展示了main方法:

public static void main(String[] args)
{
    ServerSocketFactory socket_factory = ServerSocketFactory.getDefault();
    InetAddress host =  InetAddress.getByName("192.168.20.33");
    ServerSocket server_socket = socket_factory.createServerSocket(1111,3,host);
    Socket socket = server_socket.accept();
    System.out.println(socket.isConnected());

    byte[] request = new byte[]{48,48,48};
    send(socket, request);

    byte[] response = new byte[10];
    receive(socket,response);
}

在正常情況下,一切正常,但我的問題是:通過socket.isConnected()語句測試連接后服務器停機時, send方法可以正常工作,並且不會拋出任何異常,但是在調用receive方法時,它將為未連接的主機拋出異常。 我很困惑,當服務器發生故障時,哪種send方法不會引發異常,而當連接丟失時,哪種send方法receive引發異常? 還有沒有辦法在類似於readFully方法的write方法中檢查連接,例如拋出異常?

(很抱歉,如果我使用了錯誤的術語或語法,那么我正在學習英語。)

isConnected()方法沒有告訴您連接的活躍性,僅告訴您套接字在某個時間點連接的。

有關處理斷開的連接的更多詳細信息,請查看此答案

當您發送消息時,您的軟件不知道目的地是否收到了您的消息。 您可以將消息發送到任何位置,並且永遠不會出現錯誤或異常。 但是,當您收到一條消息時,您的軟件就會完全意識到它正在收到一條消息,並且在未收到預期的消息時會提醒您。

如果要在發送消息之前確保另一端有東西,則可以通過向目標發送ping並在發送前確保另一端已連接東西來修改軟件。

除了jtahlborn和Recursed的正確答案之外,您的消息可能甚至還沒有離開JVM。 您正在寫包裹在BufferedOutputStream.周圍的DataOutputStream BufferedOutputStream. 除非您調用DataOutputStream.flush().否則什么都不會發生DataOutputStream.flush().

暫無
暫無

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

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