2016-10-26 20 views
0

guyz!소켓과 Netty를 사용하여 "broken pipe"예외가 있습니다. 뭐가 문제 야?

서버에 보낼 protobuf 개체가 있습니다. 서버에서 Netty를 사용합니다.

클라이언트에 Netty의 ProtobufDecoder을 사용할 때 모두 멋지게됩니다.

하지만 바닐라 Java Socket을 통해 protobuf 객체를 보내려고하면 예외가 발생합니다. 하지만 Socket 객체는 연결 상태를 유지하고 다른 객체를 보내고 예외를 다시 얻을 수 있습니다. = (

다음

은 그물코 기반 클라이언트의 파이프 라인 설정이다.

Exception in thread "main" java.net.SocketException: Broken pipe 
at java.net.SocketOutputStream.socketWrite0(Native Method) 
at java.net.SocketOutputStream.socketWrite(SocketOutputStream.java:109) 
at java.net.SocketOutputStream.write(SocketOutputStream.java:141) 
at SocketClientMain.main(SocketClientMain.java:28) 
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
at java.lang.reflect.Method.invoke(Method.java:497) 
at com.intellij.rt.execution.application.AppMain.main(AppMain.java:147) 
:

ChannelPipeline pipeline = channel.pipeline(); 
pipeline.addLast("frameDecoder", new LengthFieldBasedFrameDecoder(134217728, 0, 4, 0, 4)); 
pipeline.addLast("protobufDecoder", new ProtobufDecoder(mSocketListener.getInMessage())); 

내가 어디 maxFrameLength 및 기타 PARAMS을 지정, 모르는 여기

는 오류 로그입니다

무엇이 잘못 되었나요? 손이 부러 질 수 있습니까? 또는 서버 소유자에게 몇 가지 정보를 문의해야합니까?

+0

오류 로그를 제공하는 것이 좋을 것입니다. –

+0

@ Nordenheim, 죄송합니다. – KartoshkaMan

답변

1

java.net.SocketException: Broken pipe은 다른 쪽이 이미 동일한 연결을 닫은 상태에서 연결에 쓰려고하면 발생합니다. 연결을 닫은 사람은 당신이 아니며 다른 예외가 발생했을 것입니다. 연결을 복구 할 수 없으므로 새 연결을 열어야합니다.

예외가 계속 발생하는 경우 응용 프로그램 프로토콜이 잘못 정의되거나 제대로 구현되지 않았 음을 의미합니다.

+0

hm ... so ... 올바른 방법으로 소켓을 정의하는 방법에 대한 정보를 어디서 찾을 수 있는지 알 수 없습니다. 이 코드 부분을 바닐라 소켓 설정으로 변환하는 방법을 모르므로 뭔가 잘못되었다고 생각합니다 :'new LengthFieldBasedFrameDecoder (134217728, 0, 4, 0, 4)' – KartoshkaMan

+0

생성자 자체에 대한 설명이 나와 있습니다. (https://netty.io/4.0/api/io/netty/handler/codec/LengthFieldBasedFrameDecoder.html#LengthFieldBasedFrameDecoder(int,%20int,%20int,%20int,%20int)). Netty와 함께 일한 적이 없기 때문에 나는 Netty를 넘어서서 당신을 정말로 도울 수 없습니다. –

+0

오케이, 시간 내 주셔서 감사합니다. – KartoshkaMan