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 등을 초기화하지 않습니다.
제안을 반영하도록 코드를 조정하고 올바르게 작동하는지 확인합니다. 왜 그것이 한 방향으로 만 깨지는 지 명확하게 설명 할 수 있습니까? 당신은 내가 잘못 읽을 필요가있는 바이트 수를 얻고 있다는 것을 지적했는데 그것은 어떻게 든 저를 싱크 밖으로 던지고 있습니다; 내가 게시 한 코드에서 그 정보를 수집 할 수 있다면, 그 원인은 무엇일까요? –
어떻게 든 동기화되지 않는 것이 문제의 유일한 논리적 인 설명입니다. 나는 한 방향으로 나아가는 것이 무엇을 의미하는지 모르지만, 코드가 100 % 실패율을 잘못 가질 필요는 없습니다. – EJP