2012-03-06 320 views
0

我正在編寫服務器客戶端應用程序。客戶端通過不同的流向服務器發送某種數據。一旦我在主要方法中放置這樣的流,程序什麼都不做;也不例外只是空控制檯:通過套接字流式傳輸

try { 
       socket = new Socket("localhost", 4050);      
       din = new DataInputStream(socket.getInputStream()); 
       oin = new ObjectInputStream(socket.getInputStream()); 
       dout = new DataOutputStream(socket.getOutputStream());      


      } catch (UnknownHostException e) {    
       System.out.println("Exception: the host is unknown"); 
      } catch (IOException e) { 
       System.out.println("I/O exception thrown by socket"); 
      } 

有一次,我從main方法的部分刪除此流oin = new ObjectInputStream(socket.getInputStream());程序拋出EOFException類或連接復位異常。 上述代碼中的特殊之處在於,程序什麼都不做,並且不會引發異常?

一旦您將提到的流中的一個單獨的方法

private static MessageObject readObject(){ 
     MessageObject mo = null; 

     try{ 
      oin = new ObjectInputStream(socket.getInputStream()); 
      mo = (MessageObject)oin.readObject(); 

     } 
     catch(IOException e){ 
      System.err.println(e.getCause()); 
     } 
     catch(ClassNotFoundException e){ 
      System.err.println(e.getCause()); 
     } 
     return mo; 
    } 

它拋出該異常:

Exception in thread "main" java.net.SocketException: Connection reset 
    at java.net.SocketInputStream.read(Unknown Source) 
    at java.net.SocketInputStream.read(Unknown Source) 
    at java.io.DataInputStream.readBoolean(Unknown Source) 
    at Server.main(Server.java:77) 

在服務器上它是在如果分支:

if (din.readBoolean()) { 

     ObjectInputStream oin = new ObjectInputStream(s.getInputStream()); 
     MessageObject o = (MessageObject)oin.readObject(); 

     // server saves the whole thing 
     MessageDB.add(o); 

    } 

我不能在這裏放置我所有的代碼,這是我的任務。

ooops,抱歉的人,發現了錯誤。一些邏輯錯誤,服務器期待一些輸入,但客戶拒絕發送它。

+0

究竟你在哪裏得到'EOFException'?看起來好像你沒有顯示整個代碼 – yegor256 2012-03-06 23:17:18

+0

那麼,在代碼中沒有錯誤......所以這就解釋了爲什麼沒有發生這種情況。 – Jon 2012-03-06 23:17:20

回答

7

你在這裏犯了幾個錯誤。

  1. 您正在同一套接字上使用多個流。不要這樣做,他們只會互相混淆。由於您需要對象I/O,因此只需使用ObjectInputStreamObjectOutputStream即可。

  2. 錯誤的施工順序。您必須在ObjectInputStream之前構建兩端的ObjectOutputStream

  3. 您正在使用具有不同生命週期的流。你還沒有遇到問題,但最終這將導致StreamCorruptedException。在兩端使用與Socket相同的ObjectInputStreamObjectOutputStream

  4. 你可能還需要閱讀的Javadoc ObjectOutputStream.reset().writeUnshared()瞭解他們在做什麼,以及爲什麼你可能需要調用一個或另一個人。