소켓을 사용한 임의 직렬화 예외

와일드 바마 보이

소켓을 사용하여 두 대의 컴퓨터간에 데이터를주고 받으려고합니다. 데이터는 직렬화 된 패킷 개체의 형태입니다.

내 로컬 네트워크의 다른 컴퓨터에서 프로그램을 테스트 할 때 데이터가 통과하지 않도록 임의의 SerializationException이 발생합니다.

프로그램은 일관되게 다른 데이터를 전송하므로 다시 전송할 때 또 다른 패스를 수행하면 때때로 통과하고 때로는 동일한 SerializationException을 다시 발생시킵니다. 예외를 포착하고 실행 상태로두면 결국 모든 데이터가 통과하지만 몇 번의 시도가 필요합니다.

예외 : "입력 스트림이 유효한 이진 형식이 아닙니다. 시작 내용 (바이트)은 [바이트 데이터]입니다."

내 문제가 어디에 있는지 정확히 모르겠습니다. 내가 보내는 많은 양의 데이터 (최대 100kb)는 항상 통과합니다. 작은 것 (50-70 바이트)은 문제가 있습니다. 여기에 내 직렬화 및 데이터 읽기 / 쓰기와 관련된 모든 것이 있습니다.

소켓은 다음과 같이 정의됩니다.

SocketMain = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);

보내기 및 읽기 방법. 나는 이것이 아마도 그렇게하는 끔찍한 방법이라는 것을 알고 있으며 결국 내 문제가 될 수 있습니다. 제안? :

    public void SendPacket(Packet P)
    {
            using (MemoryStream MS = new MemoryStream())
            {
                BinaryFormatter BF = new BinaryFormatter();
                BF.Serialize(MS, P);
                SocketMain.Send(MS.ToArray());
            }
    }

    public void ReadPacket()
    {
        byte[] BufferArray = new byte[131072];
        int BytesReceived = SocketMain.Receive(BufferArray);

        byte[] ActualData = new byte[BytesReceived];
        Buffer.BlockCopy(BufferArray, 0, ActualData, 0, BytesReceived);

        using (MemoryStream MS = new MemoryStream(ActualData))
        {
            BinaryFormatter BF = new BinaryFormatter();
            HandlePacket((Packet)BF.Deserialize(MS));
        }
    }

예제 패킷 개체. 이것은 내 작은 것 중 하나입니다. 나는 생각 이 문제를 일으키는 하나가 될 수도 있지만, 내가 말할 수있는 방법을 모르겠어요.

[Serializable()]
public class Packet4BlockVerify : Packet, ISerializable
{
    public byte Index;
    public string MD5Hash;

    public Packet4BlockVerify(int Index, string MD5Hash): base(4)
    {
        this.Index = (byte)Index;
        this.MD5Hash = MD5Hash;
    }

    protected Packet4BlockVerify(SerializationInfo info, StreamingContext context)
    {
        this.ID = info.GetByte("ID");
        this.Index = info.GetByte("Index");
        this.MD5Hash = info.GetString("MD5Hash");
    }

    public override void GetObjectData(SerializationInfo info, StreamingContext context)
    {
        info.AddValue("ID", this.ID);
        info.AddValue("Index", this.Index);
        info.AddValue("MD5Hash", this.MD5Hash);
    }
}

누군가 잘못된 것을 본 사람이 있습니까?

Markmnl

보낸 바이트를 모두 읽지 않습니다. 수신 전화 :

int BytesReceived = SocketMain.Receive(BufferArray);

임의의 수의 바이트를 반환합니다. 전송 한 바이트 앞에 남은 바이트 크기를 추가하고이를 읽은 다음 역 직렬화를 시도하기 전에 모든 바이트를 확보 할 때까지 계속 읽어야합니다.

TCP는 연속 바이트 스트림을 전송하므로 수신 호출이 임의 크기의 청크를 읽습니다. 과부하 중 하나는 수신하려는 바이트 수를 지정할 수 있으므로 예상되는 바이트 수를 읽은 후 사용할 수 있습니다. 예 :

// Warning untested! (but you get the idea)

// when sending
var payload = MS.ToArray();
var payloadSize = payload.Length;
mySocket.Send(BitConverter.GetBytes(payloadSize));
mySocket.Send(payload);

// when recieving
mySocket.Recieve(myBuffer, sizeof(int), SocketFlags.None);
var payloadSize = BitConverter.ToInt32(myBuffer, 0);
mySocket.Recieve(myBuffer, payloadSize, SocketFlags.None);
// now myBuffer from index 0 - payloadSize contains the payload you sent

이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.

침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

분류에서Dev

직렬화 / 잭슨을 사용하여 스택 추적하지 않고 예외를 직렬화 복원

분류에서Dev

Jackson을 사용하여 임의의 JSON 역 직렬화

분류에서Dev

소켓의 예외

분류에서Dev

Json.Net을 사용하여 DataSet으로 역 직렬화 할 때 ArgumentOutOfRange 예외

분류에서Dev

openJPA MySQL을 사용한 런타임 최적화에 관한 예외

분류에서Dev

봄 부팅을 사용하여 카프카 큐에서 소비하면서 직렬화 예외를 얻기

분류에서Dev

자체 참조 사전을 사용하여 AsReferenceDefault로 표시된 클래스를 직렬화 할 때 protobuf-net의 Stackoverflow 예외

분류에서Dev

NHibernate 응답을 통한 웹 API 사용자 정의 직렬화

분류에서Dev

Jackson을 사용한 JSON 파일의 다형성 역 직렬화

분류에서Dev

소켓을 통한 바이너리 직렬화 / 비 직렬화 TargetInvocationException

분류에서Dev

ReadLine 예외를 사용한 Java 처리의 소켓 프로그래밍

분류에서Dev

예외를 직렬화 복원 또는 잭슨 ObjectMapper를 사용하여 모든 유형의 개체를 직렬화 및 취급

분류에서Dev

소켓을 사용하는 클라이언트-서버 : 스레드 "main"java.io.EOFException의 예외

분류에서Dev

위임 처리기의 포맷터에서 역 직렬화 예외 처리

분류에서Dev

대상 유형의 문자열 표현을 사용한 역 직렬화

분류에서Dev

Jersey 기본 구현을 사용한 다형성 유형의 역 직렬화 : MOXy

분류에서Dev

제네릭 형식의 XmlElement 이름을 사용한 XML 직렬화-C #

분류에서Dev

제네릭 형식의 XmlElement 이름을 사용한 XML 직렬화-C #

분류에서Dev

spray-json을 사용한 Scala 케이스 객체의 JSON 역 직렬화

분류에서Dev

Java nio와 이전 소켓 프로그래밍 모델에서 직렬화 사용의 장단점

분류에서Dev

Jackson을 사용한 사용자 지정 JSON 직렬화 / 역 직렬화

분류에서Dev

jackson : 목록을 역 직렬화 할 때 단일 항목에 대한 예외 포착

분류에서Dev

부스트를 사용하여 문자열 배열을 역 직렬화하고 예상보다 큽니다 (cv :: cuda :: GpuMat에서 직렬화 한 후).

분류에서Dev

GSON을 사용하여 객체의 JSON 배열 역 직렬화

분류에서Dev

Play의 json을 사용하여 동적 필드 이름을 직렬화 / 역 직렬화하는 방법

분류에서Dev

Gora MongoDb 예외, Utf8을 직렬화 할 수 없음

분류에서Dev

간단한 부동 숫자 직렬화 예제의 문제

분류에서Dev

Json.NET을 사용하여 ArrayList의 ArrayList를 직렬화 및 역 직렬화하는 방법

분류에서Dev

JSON.Net을 사용하는 사전의 복합 유형에 대한 용도별 직렬화

Related 관련 기사

  1. 1

    직렬화 / 잭슨을 사용하여 스택 추적하지 않고 예외를 직렬화 복원

  2. 2

    Jackson을 사용하여 임의의 JSON 역 직렬화

  3. 3

    소켓의 예외

  4. 4

    Json.Net을 사용하여 DataSet으로 역 직렬화 할 때 ArgumentOutOfRange 예외

  5. 5

    openJPA MySQL을 사용한 런타임 최적화에 관한 예외

  6. 6

    봄 부팅을 사용하여 카프카 큐에서 소비하면서 직렬화 예외를 얻기

  7. 7

    자체 참조 사전을 사용하여 AsReferenceDefault로 표시된 클래스를 직렬화 할 때 protobuf-net의 Stackoverflow 예외

  8. 8

    NHibernate 응답을 통한 웹 API 사용자 정의 직렬화

  9. 9

    Jackson을 사용한 JSON 파일의 다형성 역 직렬화

  10. 10

    소켓을 통한 바이너리 직렬화 / 비 직렬화 TargetInvocationException

  11. 11

    ReadLine 예외를 사용한 Java 처리의 소켓 프로그래밍

  12. 12

    예외를 직렬화 복원 또는 잭슨 ObjectMapper를 사용하여 모든 유형의 개체를 직렬화 및 취급

  13. 13

    소켓을 사용하는 클라이언트-서버 : 스레드 "main"java.io.EOFException의 예외

  14. 14

    위임 처리기의 포맷터에서 역 직렬화 예외 처리

  15. 15

    대상 유형의 문자열 표현을 사용한 역 직렬화

  16. 16

    Jersey 기본 구현을 사용한 다형성 유형의 역 직렬화 : MOXy

  17. 17

    제네릭 형식의 XmlElement 이름을 사용한 XML 직렬화-C #

  18. 18

    제네릭 형식의 XmlElement 이름을 사용한 XML 직렬화-C #

  19. 19

    spray-json을 사용한 Scala 케이스 객체의 JSON 역 직렬화

  20. 20

    Java nio와 이전 소켓 프로그래밍 모델에서 직렬화 사용의 장단점

  21. 21

    Jackson을 사용한 사용자 지정 JSON 직렬화 / 역 직렬화

  22. 22

    jackson : 목록을 역 직렬화 할 때 단일 항목에 대한 예외 포착

  23. 23

    부스트를 사용하여 문자열 배열을 역 직렬화하고 예상보다 큽니다 (cv :: cuda :: GpuMat에서 직렬화 한 후).

  24. 24

    GSON을 사용하여 객체의 JSON 배열 역 직렬화

  25. 25

    Play의 json을 사용하여 동적 필드 이름을 직렬화 / 역 직렬화하는 방법

  26. 26

    Gora MongoDb 예외, Utf8을 직렬화 할 수 없음

  27. 27

    간단한 부동 숫자 직렬화 예제의 문제

  28. 28

    Json.NET을 사용하여 ArrayList의 ArrayList를 직렬화 및 역 직렬화하는 방법

  29. 29

    JSON.Net을 사용하는 사전의 복합 유형에 대한 용도별 직렬화

뜨겁다태그

보관