0

TCP 패킷의 바이트 배열로 변환 할 수 있도록 일부 객체를 직렬화했습니다. 서버 프로그램에서 클라이언트 프로그램으로 개체를 보낼 때 문제가 없으며 제대로 작동합니다. 그러나 서버와 클라이언트 간의 코드가 동일하더라도 클라이언트에서 서버로 객체를 보내려고하면 잘못된 헤더가 생성됩니다.클라이언트에서 서버로의 잘못된 스트림 헤더 434B0005

public static byte[] serialize(Hand c) throws IOException 
    { 
     ByteArrayOutputStream baos = new ByteArrayOutputStream(); 
     ObjectOutputStream oos = new ObjectOutputStream(baos); 
     oos.writeObject(c); 
     return baos.toByteArray(); 
    } 

    public static Hand deserialize(byte[] bytes) throws IOException, ClassNotFoundException 
    { 
     ByteArrayInputStream b = new ByteArrayInputStream(bytes); 
     ObjectInputStream o = new ObjectInputStream(b); 
     return (Hand) o.readObject(); 
    } 

public static byte[] serialize(Card c) throws IOException 
    { 
     ByteArrayOutputStream baos = new ByteArrayOutputStream(); 
     ObjectOutputStream oos = new ObjectOutputStream(baos); 
     oos.writeObject(c); 
     return baos.toByteArray(); 
    } 

    public static Card deserialize(byte[] bytes) throws IOException, ClassNotFoundException 
    { 
     ByteArrayInputStream b = new ByteArrayInputStream(bytes); 
     ObjectInputStream o = new ObjectInputStream(b); 
     return (Card) o.readObject(); 
    } 

사람들이 모두 서버 프로그램에서 촬영하지만, 직렬화 코드가 서버와 사이에 동일됩니다 : 여기

내가 직렬화있어 개체 고객; 나는 Card 클래스와 Hand 클래스를 Server에서 Client로 중요하게 여기는 것이 중요하다.

서버는 카드 또는 핸드를 byte []로 변환하여 DataOutputStream을 통해 클라이언트에 쓸 수 있으며 클라이언트는 DataInputStream을 통해 카드 또는 핸드를 수신하고이를 직렬화 해제하고 문제없이 읽을 수 있습니다 . 나는 클라이언트에서 서버로 카드 또는 손을 보내려고 할 때, 그러나 아주 드물게는 작동하지 않습니다 일반적으로 내가 얻을

Exception in thread "main" java.io.StreamCorruptedException: invalid stream header: 434B0005 
    at java.io.ObjectInputStream.readStreamHeader(Unknown Source) 
    at java.io.ObjectInputStream.<init>(Unknown Source) 
    at Hand.deserialize(Hand.java:29) 
    at KoiKoi_TCP_Server.takeClientTurn(KoiKoi_TCP_Server.java:321) 
    at KoiKoi_TCP_Server.main(KoiKoi_TCP_Server.java:380) 

어디 라인

 ObjectInputStream o = new ObjectInputStream(b); 
에서 Hand.java.29 점 Hand deserialization 메서드에서

헤더가 유효하지 않습니다. 한 방향으로 만 갈아서 코드가 동일하기 때문에이를 고치는 방법을 모르겠습니다. 제안?

한 번에 단독 개체 만 보내므로 여러 개의 ObjectInputStream 등을 초기화하지 않습니다.

답변

1

여러 개의 ObjectOutputStream 등을 초기화하지 않습니다.

예. 모든 객체에 대해 새 ObjectOutputStream을 초기화하면 각 객체를 수신하기 위해 읽어야하는 바이트 수를 알 수있는 추가 문제가 생기며 잘못된 결과가 발생하여 동기화가 해제됩니다. .

이 모든 것을 제거하십시오. 너는 필요 없어. 그냥 문제를 추가하는 것입니다. 단 한 개의 ObjectOutputStream과 ObjectInputStream을 직접 사용하여 소켓 스트림에 직접 생성 된 소켓의 수명을 확인하고 객체를 보낼 때 writeObject()를 호출하고 객체를 읽을 때 readObject()를 호출하면됩니다. 두 줄의 코드. 바이트 배열과 ByteArray/DataInput/OutputStream을 모두 잊어 버리십시오.

+0

제안을 반영하도록 코드를 조정하고 올바르게 작동하는지 확인합니다. 왜 그것이 한 방향으로 만 깨지는 지 명확하게 설명 할 수 있습니까? 당신은 내가 잘못 읽을 필요가있는 바이트 수를 얻고 있다는 것을 지적했는데 그것은 어떻게 든 저를 싱크 밖으로 던지고 있습니다; 내가 게시 한 코드에서 그 정보를 수집 할 수 있다면, 그 원인은 무엇일까요? –

+0

어떻게 든 동기화되지 않는 것이 문제의 유일한 논리적 인 설명입니다. 나는 한 방향으로 나아가는 것이 무엇을 의미하는지 모르지만, 코드가 100 % 실패율을 잘못 가질 필요는 없습니다. – EJP