2010-04-27 4 views
1

내 서버와 ObjectIOStreams를 사용하여 네트워크 연결을 통해 직렬화 가능한 객체를 보내는 소켓에서 ServerSocket을 사용하고 있습니다. 필자는 본질적으로 독점적 인 재정적 인 버전을 개발하고 있으므로 송/수신되는 패킷을 보내고 확인하는 것이 필요합니다. 내 자신의 패킷 손실 감시자를 구현해야합니까, 아니면 (서버) 소켓을 이미 돌봐 주 었나요?ObjectIOStreams를 사용하는 Java ServerSocket 및 소켓이 패킷을 잃을 수 있습니까?

나는 네트워크 연결이나 기타 등등에서 패킷 손실에 대해 주로 묻습니다. 연결 오류가 아닙니다. 예 : 형제가 라우터와 컴퓨터의 Wi-Fi 어댑터 사이에서 리드 플레이트를 움직입니다.

http://code.google.com/p/inequity/source/browse/#svn/trunk/src/network 코드 네트워크 -> ClientController 및

답변

4

이론적으로 네트워크 -> 서버에서 찾을 수 있습니다 ; 예. 하드웨어 계층에서 전송되는 정보가 수신 측에서 동일한 방식으로 수신된다는 100 % 이론적 보증을 제공 할 방법이 없습니다.

그러나 실제로 TCP (전송 제어 프로토콜)를 사용하면 이러한 문제가 이미 해결되었습니다. 패킷을 잃어 버리지 않습니다. (UDP (User Datagram Protocol)을 사용하고 있다면 다른 이야기입니다. 패킷을 잃어 버리거나 순서가 맞지 않는 경우가 있습니다.

코드를 잠깐 살펴 봤는데 여러 스레드를 사용하고있는 것으로 보입니다. 그렇다면 동기화에 완전히주의해야합니다. 패킷이 삭제 된 것처럼 보일 수도 있지만 프로그램의 경쟁 조건으로 인해 단순히 처리되지는 않습니다. 예를 들어 gui는 자체 스레드에서 실행됩니다.

동기화를 해결하는 가장 좋은 방법은 네트워크 루프를 매우 작은 읽기/큐 루프를 실행하고 다른 스레드가 개입하지 않을 때마다 큐에서 수신 된 패킷을 선택하십시오.

+0

'이론적으로; 예.' 이론적으로는 아니오. 그는 TCP를 의미하는 ServerSocket과 ObjectInputStream 및 ObjectOutputStream을 사용하고 있습니다. 그는 설명 된대로 UDP를 사용할 수 없습니다. 그는 패킷 손실을 경험할 수 없습니다. 그는 코드에 버그가 있습니다. – EJP

+1

알겠습니다. ServerSocket은 TCP를 의미합니다. 나는 그런 생각을하지 않았다. 네가 옳아. 감사. 그러나 수신 된 데이터가 전송 된 데이터와 동일하다는 이론적 보증은 없다고 생각합니다. 하드웨어는 전송의 어딘가에서 비트를 잘못 해석 할 수 있습니다. 대부분의 비트 오류는 패리티 검사에 의해 처리되지만 일부 오류는 물론 눈에 띄지 않을 수 있습니다. 나는 지나치게 형식적이라는 것을 알고있다. (3 년간의 공식적인 대학원 공부 때문에 나쁜 습관이다.) – aioobe

+0

물론 보증이 있습니다. RFC를 참조하십시오. 체크섬에 의해 시행됩니다. – EJP

관련 문제