2014-11-12 3 views
-1

보내기가 작동하지만 서버 측에서 데이터 입력 스트림으로 전송 된 객체를받지 못합니다. 클래스는 직렬화되어 전송할 때 작동하지만 서버에서 왜 수신되지 않는지 잘 모르겠습니다. 모든 while 루프와 tryJava의 소켓 서버에서 objectOutputStream을 통해 전송 된 객체를 읽는 방법

Server.ois = new ObjectInputStream(client.getInputStream()); 
while(Server.ois.available() != 0) { 
    try { 
     TriangleSend ts = (TriangleSend)Server.ois.readObject(); 
     send(ts); 
     Server.ois.close(); 
    } catch (Exception e) { 
     continue; 
    } 
} 

:

여기 내 코드입니다. 또한 수신시 예외를 생성합니다.

센드는 (TriangleSend) 방법은 다음과 같습니다

public static void send(TriangleSend coords) { 
    for (Socket client : Server.clients) { 
     try { 
      if (client != null) { 
       try { 
        ObjectOutputStream oos = new ObjectOutputStream(client.getOutputStream()); 
        oos.writeObject(coords); 
        oos.flush(); 
       } catch (Exception e) {} 
      } 
     } catch (NullPointerException e) { 
      continue; 
     } 
    } 
} 

편집 : 소스 코드 예외 : http://pastebin.com/rYzqduer

을 heres 예외 :

java.io.StreamCorruptedException: invalid stream header: 73720027 
    at java.io.ObjectInputStream.readStreamHeader(ObjectInputStream.java:804) 
    at java.io.ObjectInputStream.<init>(ObjectInputStream.java:299) 
    at com.gopro2027.lwjgl.server.ServerThread$1$1.run(ServerThread.java:88) 
    at java.lang.Thread.run(Thread.java:745) 
Could not send data Timeout: 0 
+2

"수신 된 경우에도 예외가 발생합니다. 예외가 throw 될 때마다 –

+0

스택 추적을 게시하십시오. 이제 [StreamCorruptedException : 잘못된 유형 코드 AC] (http : // stackoverflow. com/questions/2393179/streamcorruptedexception-invalid-type-code-ac/2395269 # 2395269). – EJP

+0

덕분에 ejp가 해결되었습니다 –

답변

0

타일러 - 고객의 출력을 포장 ObjectOutputStream를 구축하기 전에 BufferedOutputStream로 스트림합니다. 반대로, c 전에 BufferedInputStream를 실행합니다. 서버 측의 ObjectInputStream의 온상입니다. 그것은 읽기/쓰기 프로세스에 도움이됩니다.

서버 측 :

Server.ois = new ObjectInputStream(new BufferedInputStream(client.getInputStream())); 
while(Server.ois.available() != 0) { 
    try { 
     TriangleSend ts = (TriangleSend)Server.ois.readObject(); 
     send(ts); 
     Server.ois.close(); 
    } catch (Exception e) { 
     e.printStackTrace(); 
     continue; 
    } 
} 

이 삼각형 보내기 :

public static void send(TriangleSend coords) { 
    for (Socket client : Server.clients) { 
     if (client != null) { 
      try { 
       ObjectOutputStream oos = new ObjectOutputStream(new BufferedOutputStream(client.getOutputStream())); 
       oos.writeObject(coords); 
       oos.flush(); 
      } catch (Exception e) { 
       e.printStackTrace(); 
      } 
     } 
    } 
} 

제거 편집

+0

입력 및 출력 스트림을 으로 변경했습니다. BufferedOutputStream bis = new BufferedOutputStream (client.getOutputStream()); \t \t \t \t \t \t ObjectOutputStream oos = new ObjectOutputStream (bis); \t \t \t \t \t \t 그것은 시간의 양이 그것이 –

+1

당신이 스택 추적을 게시 할 수 수정 didnt는하지만 오류가 발생 변경? –

+0

그것은 예외를 생성하지 않습니다 ... 그것은 예외를 만들지 만, 어디서 또는 그냥 추적 스택을 생성하지 않는 경우 찾을 수 –

0
while(Server.ois.available() != 0) { 

available() 스트림의 마지막에 대한 유효한 시험이 아니다. Javadoc을 보라. 루프를 while (true)으로 변경하고 EOFException을 붙잡을 때 중단해야합니다.

+0

죄송합니다. 언급하는 것을 잊어 버렸습니다. 나는 그것을 가지고 있었고 while 루프와 새로운 스레드에 둘러싸여있었습니다. 나는 이미 거기에 그것을 가지고 있었다. (나는 당신도 나를 필요로한다면 pastebin에 전체 코드를 게시 할 수있다.) –

+0

우리가 필요로하는 것은 불가사의 한 예외이며 *와 * 실제 코드이다. – EJP