方案一: 用read()將不會拋出異常。因為read是block方式的。 readInt()拋出異常的原因(我遇到的)是對方在該端口沒有消息發送。 方案二: socket的端口被阻塞了 ,也就是我們需要更換端口號來解決. 方案三: 在初始化鏈接時,如果先創建輸入流,再創建輸出流可能會報錯,正確創建順序如下: ObjectOutputStream output=new ObjectOutputStream(socket.getOutputStream()); ObjectInputStream input=new ObjectInputStream(socket.getInputStream()); 方案四: 從上面的提示可以模糊看到,因為不知道流的末尾,當到達末尾的時候,自然拋出了此異常。既然不知道結尾如何,干脆設一個緩存,然后讀取一批數據后輸出即可。 為了保險期間,可以講此緩存設置大點,一次可以完全接收到想要的內容,這樣,一次就可以讀取到所要的內容了,避免了循環獲取。下面將此代碼放出來: ...... private static final int BUFFER_SIZE=1024*1024; ...... Socket socket = new Socket(cfg.getIp(), Integer.parseInt(SysParamsToolkit.getProperty("socketport"))); String charset = SysParamsToolkit.getProperty("socke.rexml.charset"); //Socket發送的字符集編碼 try { OutputStream dos = socket.getOutputStream(); dos.write(xmlcmd.getBytes(charset)); dos.flush(); DataInputStream dis = new DataInputStream(socket.getInputStream()); char[] data = new char[BUFFER_SIZE]; BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream(), charset)); int len = br.read(data); String rexml = String.valueOf(data, 0, len); //接收一個字符串數據 } catch (Exception e) { return false; } finally { if (socket.isConnected()) socket.close(); } ...... 經過上面的處理后,就沒問題了。 緩存的大小BUFFER_SIZE是根據你要接收內容的大小來確定。