2012-03-22 2 views
1

소켓에서 데이터를 수신하는 데 이상한 문제가 있습니다. 클라이언트에서 공기 소켓을 사용 중입니다. 서버 자바 netty에. 소켓 단순 패킷에 쓰기 : int numPacket, int textLength, utf8String text. 그리고 고객에게 읽어주십시오.소켓. 패킷이 필요할 때 대기열에 머물러 있습니다.

//server 
buffer.writeInt(packetId); 
ChannelBuffer ch = ChannelBuffers.copiedBuffer(text, CharsetUtil.UTF_8); 
buffer.writeInt(text.length()); 
buffer.writeBytes(ch); 

//client 
packetId = socket.readInt() 
packetLen = socket.readInt() 
text = socket.readUtfBytes(packetLen) 

때로는 하나의 packets()이 클라이언트에 수신하지만 서버가 거기에 보내졌으며 tcpdump가 패킷이 전송되었음을 나타냅니다. 서버가 새 패킷을 보내면 클라이언트는 이전 패킷을 읽고 새 패킷을 수신하지 않으며 필요없는 대기열처럼 작동합니다. 나쁜 영어 죄송합니다 p.s -_-

답변

1

클라이언트 어쩌면 프레임의 끝을 알아야 할 바이트 \n, \u 등을 기다리는 것 같은데 후 당신의 버퍼에. 클라이언트는 전송이 끝날 때 null byte을 기다리고 있었기 때문에 플래시와 비슷한 문제가있었습니다.

다음 종류의 encoder을 파이프 라인의 마지막 엔코더로 추가하여 시도해 볼 수 있습니다. 다음은 NUL 바이트를 다루기위한 관련 코드입니다.

ChannelBuffer nulBuffer = ChannelBuffers.wrappedBuffer(new byte[] { 0 }); 
    ChannelBuffer buffer = ChannelBuffers.wrappedBuffer((ChannelBuffer)msg,nulBuffer); 
0

사용해보십시오 플러시() 각 또는 세

+0

tcpdump는 패킷이 올바르게 전송되었음을 보여줍니다. 내게 도움이되지 않는 플러시 – user1081056

관련 문제