2012-07-09 6 views
0

서버에서 클라이언트로 연속적으로 전송되는 여러 메시지가 동일한 순서로 클라이언트에서 받아 들여지고 여러 개의 메시지가 다른 메시지에 흩어지지 않습니다. ?TCP : 연속 된 여러 메시지

답변

1

TCP는 순차 바이트 스트림 전달 서비스을 제공합니다. 바이트는 다른 순서로 도착하지 않지만 쓰기 수는 읽기 수와 같을 필요는 없습니다.

  • 당신은 그들이
  • 당신은 "메시지"에는 가정을 만들 수 있습니다 보내진하는 것보다 다른 순서로 바이트를 읽어 본 적이 있습니다. TCP는 메시지에 대해서 알지 못하며 바이트 만 (상기 참조). 송신자와 수신자 모두 유착 및 예 : "메시지"를 분할 할 수 있습니다
+0

우리 게임에서 느린 Wi-Fi 연결을 사용하는 3 명의 플레이어 중 2 명은 서버가 크기가 75000 바이트 인 두 개의 메시지를 연속적으로 전송할 때 초기화를 진행할 수 없습니다. 각 바이트는 서로 섞였습니다. 다른 모든 시간 서버는 각 클라이언트의 메시지에 아주 작은 메시지 (~ 100 바이트)를 보냅니다. 클라이언트의 요청 후 "뚱뚱한"메시지를 보내면 문제가 해결되었지만 왜 그런 일이 일어날 지 알고 싶습니까? – Slav

0

TCP는 데이터의 각 바이트를 식별하는 시퀀스 번호를 사용합니다. 시퀀스 번호는 각 컴퓨터에서 보낸 바이트 순서를 식별하므로 전송 중에 발생할 수있는 조각화, 혼란 또는 패킷 손실에 관계없이 데이터를 순서대로 재구성 할 수 있습니다.

0

나는 @cnicutar에 동의합니다.

개체를 어떻게 직렬화하지 않습니까? 나는 그 문제가 거기에 있다고 생각한다. 메시지가

ABCD 같은 경우 예를 들어

PQR 200 MS 나중에 따랐다. R 하였다 PQ 하였다 CD 뒤에 이어

  • ABC
  • PQR하거나 ABCDPQR
  • 또는 AB : 그것이 나타나는.

기본적으로 데이터 수신 시간을 기준으로 가정을 할 수 없습니다.

deserialization 논리는 바이트 스트림 내에서 객체 경계를 알아야합니다. 이 정보는 직렬화 논리에 의해 스트림으로 인코딩되어야합니다.

Java를 사용하는 경우 serialzation 문제에 대해 신경 쓰지 않아도됩니다. Java를 사용하는 경우 & ObjectOutputStream을 사용할 수 있습니다.

J2ME Polish은 다른 플랫폼에 매우 쉽게 이식 할 수있는 우수한 직렬화 유틸리티를 제공합니다. 나는 그것을 라이브 환경에서 사용했다.

+0

메시지의 길이를 나타내는 정수 값을 각 메시지 앞에 붙이고이를 받아들이고 완전히 받아 들일 때만 버퍼에서 제거합니다. – Slav

+0

"APBCQRD"와 같이 소켓에서 허용하는 ABCD 및 PQR 메시지와 비슷합니다. – Slav

+0

그건 이상합니다. 여러 스레드가 동시에 소켓에 ​​쓰고 있습니까? – Dojo

관련 문제