2016-07-01 4 views
1

우리는 HTTP 통신을 위해 포트 5545에서 수신 대기중인 java 서버 응용 프로그램을 가지고 있습니다.C# 클라이언트 Java 서버 HTTP 응답 없음

반대쪽에는 서버에 요청을 보내는 C# 클라이언트 응용 프로그램이 있습니다.

프록시에 문제가 발생하기 전에는 TCP/IP를 기반으로 한 통신이 이루어졌습니다.

이제 우리는 http를 통한 통신으로 전환하려고하지만 C# 측에서 이상한 동작을 경험했습니다.

문제는 봄과의 Netty 4 프레임 워크를 사용하는 PostAsync Method

우리의 자바 서버를 기반으로합니다. C# 클라이언트가 데이터를 게시하면 Netty 로그의 모든 내용을 볼 수 있습니다. 자바 서버가 응답을 되돌려 보내는 부분에서, C# 메소드는 교착 상태 (deadlock)처럼 될 것입니다. 응답을 보내는

내 자바 방법은 내가 마지막으로 쓴 후 자바 측에서 ctx.channel().writeAndFlush(Unpooled.EMPTY_BUFFER).addListener(ChannelFutureListener.CLOSE); 을 추가 할 때 C# 클라이언트 코드가

HttpClientHandler httpClientHandler = new HttpClientHandler(); 
client = new System.Net.Http.HttpClient(httpClientHandler) { BaseAddress = uri }; 

byte[] bytes = ... 
ByteArrayContent byteContent = new ByteArrayContent(bytes); 
var response = await client.PostAsync(uri, byteContent, tokenSource.Token); 

입니다

private boolean writeResponse(boolean isSuccessful, String message, ChannelHandlerContext ctx) { 
    boolean keepAlive = HttpHeaders.isKeepAlive(_httpRequest); 
    FullHttpResponse response = new DefaultFullHttpResponse(HttpVersion.HTTP_1_1, 
    isSuccessful ? HttpResponseStatus.OK : HttpResponseStatus.BAD_REQUEST, 
    Unpooled.copiedBuffer(message, CharsetUtil.UTF_8)); 
    response.headers().set(HttpHeaders.Names.ACCEPT_ENCODING, HttpHeaders.Values.GZIP); 
    response.headers().set(HttpHeaders.Names.CONTENT_TYPE, "application/octet-stream; charset=UTF-8"); 
    if (keepAlive) { 
    response.headers().set(HttpHeaders.Names.CONTENT_LENGTH, message.length()); 
    response.headers().set(HttpHeaders.Names.CONNECTION, HttpHeaders.Values.KEEP_ALIVE); 
    } 
    ctx.write(response); 
    return keepAlive; 
} 

입니다. PostAsync 메서드는 응답을받습니다. 그렇지 않으면 Java 서버가 응답을 이미 보냈지 만 PostAsync 메서드는 막혔습니다.

제 질문은 정상적인 행동입니까, 아니면 누군가가 나를 설명 할 수 있습니까?

+0

'HttpClient'에게 빈 (쓸모없는)'HttpClientHandler'를주지 않도록하십시오. – nverinaud

답변

1

keepAlive가 true 일 때뿐만 아니라 매회 CONTENT_LENGTH를 설정해야합니다.

[편집] 그렇지 않으면 클라이언트는 응답 내용이 완전히 수신되고 사후 방법이 반환되지 않는지 여부를 알 수 없습니다.

+0

이것은 건설적인 대답이 아닙니다. –