2012-11-16 229 views
0

所以我只是測試了一些客戶端服務器的東西(我在一個更大的項目中正在處理它,但它一直在拋出錯誤,所以我決定確保我做的是正確的。不是) 其中涉及ObjectOutput和輸入流。當我在本地主機上運行客戶端和服務器時,它完美地工作,但如果我在我的計算機上運行我的Linux服務器和客戶端上的服務器,那麼當我到達提取對象的那一行時,連接已重置。下面的代碼:Socket連接意外關閉

客戶:

public static void main(String[] args){ 
    String[] stuff = {"test", "testing", "tester"}; 
    Socket s = null; 
    ObjectOutputStream oos = null; 
    try { 
     s = new Socket("my.server.website", 60232); 
     oos = new ObjectOutputStream(s.getOutputStream()); 
     oos.writeObject(stuff); 
    } catch (UnknownHostException e) { 
     e.printStackTrace(); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } finally{ 
     try { 
      s.close(); 
      oos.close(); 
     } catch (IOException e) {} 


    } 
} 

服務器:

public static void main(String[] args){ 
    ServerSocket ss = null; 
    Socket s = null; 
    ObjectInputStream ois = null; 
    try { 
     ss = new ServerSocket(60232); 
     s = ss.accept(); 
     System.out.println("Socket Accepted"); 
     ois = new ObjectInputStream(s.getInputStream()); 
     Object object = ois.readObject(); 
     System.out.println("Object received"); 
     if (object instanceof String[]){ 
     String[] components = (String[]) object; 
     for (String string : components){ 
      System.out.println(string); 
     } 
     } 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } catch (ClassNotFoundException e) { 
     e.printStackTrace(); 
    }finally{ 
     try { 
      ss.close(); 
      s.close(); 
      ois.close(); 
     } catch (IOException e) {} 
    } 
} 

回答

1

在客戶端,您關閉輸出流之前關閉底層套接字s。 試試這個:

try { 
    oos.close(); 
    s.close(); 
} catch (IOException e) {} 

的oos.close()應引起對象輸出流刷新它的所有數據插座,然後關閉對象流。然後你可以關閉底層套接字。

+0

謝謝,我不能相信這件事很簡單! – EnvisionRed

+0

實際上,您不需要關閉底層套接字。它已經被'oos.close()。'關閉了 – EJP

相關問題