2016-06-08 2 views
0

피어에 의한 연결 재설정이 발생합니다. 개체를 전송하려고 시도하는 동안 소켓 쓰기 오류가 발생하며 이유를 알 수 없습니다. 이것은 내 대학 프로젝트의 작은 부분이지만, 나는 그것이 작동하도록 많은 시간을 할애했지만, 나는 정말로 아이디어가 부족합니다. 당신의 도움에 정말 감사 할 것입니다. 클라이언트에 간단한 문자열 메시지를 보내려고했지만 제대로 작동합니다.피어에 의한 연결 재설정 : 소켓 쓰기 오류 개체 전송 시도 중

서버 코드 :

public class Server { 
static ServerSocket serverSocket; 

public static void main(String args[]) { 
    try { 
    serverSocket = new ServerSocket(7777); 
    Map map = new Map(); 
    while(true) 
    { 
     Socket incoming = serverSocket.accept(); 
     System.out.println(incoming.toString()); 
     Runnable r = new ServerConnection(incoming, map); 
     Thread t = new Thread(r); 
     t.start(); 
    }  
    } 
} 

ServerConnection 코드 :지도가 null 그리고 만약 출력이 아닌 경우 예, 확인

java.net.SocketException: Connection reset by peer: socket write error 
at java.net.SocketOutputStream.socketWrite0(Native Method) 
at java.net.SocketOutputStream.socketWrite(Unknown Source) 
at java.net.SocketOutputStream.write(Unknown Source) 
at java.io.ObjectOutputStream$BlockDataOutputStream.drain(Unknown Source) 
at java.io.ObjectOutputStream$BlockDataOutputStream.setBlockDataMode(Unknown Source)` 
at java.io.ObjectOutputStream.writeFatalException(Unknown Source) 
at java.io.ObjectOutputStream.writeObject(Unknown Source) 
at Server.ServerConnection.sendMap(ServerConnection.java:39) 
at Server.ServerConnection.run(ServerConnection.java:59) 
at java.lang.Thread.run(Unknown Source) 

: 인쇄 스택 트레이스는이 정보를 제공

public class ServerConnection implements Runnable { 
private Socket s; 
private ObjectOutputStream out; 
private Map map; 
public ServerConnection(Socket out, Map map){ 
    this.s = out; 
    this.map = map; 
    System.out.println(map); 
} 

public void sendMap(){ 
    //map.setRotation(rotated); 
    try { 
     out = new ObjectOutputStream(s.getOutputStream()); 
     System.out.println(out); 
     System.out.println(this.map); 
     out.writeObject(this.map); 
    } catch (IOException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 

} 

public void closeSocket(){ 
    try { 
     s.close(); 
    } catch (IOException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 

} 

@Override 
public void run() { 
    //this.connect(); 
    this.sendMap(); 
} 
} 

존재하는 등 나는 무엇이 문제를 유발하는지 모른다.

편집 : Object Map은 직렬화 가능합니다.

클라이언트 콘솔 출력 :

Exception in thread "main" java.lang.NullPointerException 
    at Client.ClientConnection.getMap(ClientConnection.java:37) 
    at Client.Client.main(Client.java:28) 

클라이언트 코드 :

public static void main(String[] args) { 
    ClientConnection c = new ClientConnection(); 
    c.connect(); 
    Map map = c.getMap(); 
    System.out.println(map); 
    c.closeSocket(); 
} 

가 ClientConnection : - serverString 지역 ADRES "127.0.0.1"입니다

public void connect(){ 
     try 
     { 
      Socket s = new Socket(serverString,7777); 
     } catch (UnknownHostException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } catch (IOException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
    } 

    public Map getMap(){ 
    Map map; 
    try { 
     input = new ObjectInputStream(s.getInputStream()); 
     map = (Map)(input.readObject()); 
     return map; 
    } catch (IOException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } catch (ClassNotFoundException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 
    return null; 
    } 
public void closeSocket(){ 
     try { 
      s.close(); 
     } catch (IOException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
    } 
+0

, 당신의'지도'클래스는 *, 직렬화하지 않고 * 피어가 연결을 닫았습니다. 귀하의 질문에'Map' 클래스의 코드와 수신 코드를 게시하십시오. – EJP

답변

1

연결 피어에 의해 재설정을 의미합니다 다른 쪽이 연결을 닫았습니다. 서버 측 프로그램을 보여주기 때문에 클라이언트 측에서는 프로그램을 종료해야합니다. 클라이언트 측 코드와 콘솔 출력을 확인하십시오.

EDIT : 클래스 필드에 s를 지정하지 않으므로 getMap이 호출 될 때 항상 null입니다. 이것에

변경 : 추측에서

Socket s = new Socket(serverString,7777); 
this.s = s; 
+0

와우! 고맙습니다! 이제 제대로 작동합니다. 나는 매우 위대하다. – Dreik

+1

또는'this.s = new Socket (...)' – EJP

관련 문제