2013-09-23 94 views
0

正如我在question中所提到的,我得到了一個SocketException:Connection reset。
Aaron的答案實施後,似乎按預期工作。但是今天我再次運行代碼,我又一次遇到了連接重置錯誤。
的問題是,如果我跑我的代碼像5倍,它似乎工作2/5的時間,其餘的給我的錯誤...隨機SocketException:連接重置

服務器:

import java.io.*; 
import java.net.*; 

public class Server { 

    public static void main(String[] args) throws IOException, ClassNotFoundException {  
      ServerSocket server = new ServerSocket(444); 
      while (true) { 
       Socket socket = server.accept(); 
       ObjectInputStream objIn = new ObjectInputStream(socket.getInputStream()); 
       Object objRead = objIn.readObject(); 
       if (objRead != null) { 
        System.out.println(objRead); 
       } 
      }  
    } 
} 

客戶:

import java.io.*; 
import java.net.InetAddress; 
import java.net.Socket; 
import java.util.HashMap; 

public class Client { 

    public static void main(String[] args) throws IOException { 
     Socket sock; 
     int port = 444; 
     HashMap<Integer, String> mapSend= new HashMap<>(); 
     mapSend.put(1,"row1"); 
     mapSend.put(2,"row2"); 

     sock = new Socket(InetAddress.getLocalHost(), port); 
     ObjectOutputStream objOut = new ObjectOutputStream(sock.getOutputStream()); 

     objOut.writeObject(mapSend); 
     objOut.flush(); 
    } 
} 

這是錯誤:(它出現在服務器的輸出端,後我運行客戶端):

java.net.SocketException: Connection reset 
    at java.net.SocketInputStream.read(SocketInputStream.java:189) 
    at java.net.SocketInputStream.read(SocketInputStream.java:121) 
    at java.io.ObjectInputStream$PeekInputStream.read(ObjectInputStream.java:2308) 
    at java.io.ObjectInputStream$BlockDataInputStream.read(ObjectInputStream.java:2716) 
    at java.io.ObjectInputStream$BlockDataInputStream.readFully(ObjectInputStream.java:2740) 
    at java.io.ObjectInputStream.defaultReadFields(ObjectInputStream.java:1978) 
    at java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:1913) 
    at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1796) 
    at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1348) 
    at java.io.ObjectInputStream.readObject(ObjectInputStream.java:370) 
    at java.util.HashMap.readObject(HashMap.java:1154) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    at java.lang.reflect.Method.invoke(Method.java:606) 
    at java.io.ObjectStreamClass.invokeReadObject(ObjectStreamClass.java:1017) 
    at java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:1891) 
    at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1796) 
    at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1348) 
    at java.io.ObjectInputStream.readObject(ObjectInputStream.java:370) 
    at iotest.Server.main(Server.java:16) 

在客戶端,我沒有任何錯誤。

編輯
任何方式我可以調試客戶端服務器?這可能有助於給你們更多的信息。

回答

1

關閉輸出流,而不是隻刷新它。

NB readObject()不會返回null,除非您寫入null。測試毫無意義。

+0

在flush()之後關閉ObjectOutputStream,解決了這個問題。 非常感謝你 – akafortes

+0

@akafortes如果關閉它,你根本不需要衝洗。 – EJP

相關問題