服务器无响应 翻译,Netty客户端无法读取非netty服务器的响应

我有一个连接到旧主机(52年)的Tcp客户端,它可以发送和接收来自它的请求和响应。

这是我的客户的核心连接部分,public class SimpleConnector {

private String carrier;

private SocketChannel socketChannel;

public static final byte END_OF_MESSAGE_BYTE = (byte) 0x2b;

public SimpleConnector(String carrier, InetSocketAddress inetSocketAddress) throws IOException {

this.carrier = this.carrier;

socketChannel = SocketChannel.open();

socketChannel.socket().connect(inetSocketAddress, 30000);

}

public void shutDown() throws IOException {

this.socketChannel.close();

}

//Send Request

public String sendRequest(String request) throws Exception {

final CharsetEncoder charsetEncoder = Charset.forName("ISO-8859-1").newEncoder();

int requestLength = 12 + request.length() + 1;

ByteBuffer buffer = ByteBuffer.allocate(requestLength);

buffer.order(ByteOrder.BIG_ENDIAN);

buffer.putInt(requestLength);

buffer.put(charsetEncoder.encode(CharBuffer.wrap(carrier)));

buffer.put(charsetEncoder.encode(CharBuffer.wrap(request)));

buffer.put(END_OF_MESSAGE_BYTE);

buffer.flip();

socketChannel.write(buffer);

return readResponse();

}

//Read Response

protected String readResponse() throws Exception {

CharsetDecoder charsetDecoder = Charset.forName("ISO-8859-1").newDecoder();

int responseHeaderLength = 12;

ByteBuffer responseHeaderBuf = ByteBuffer.allocate(responseHeaderLength);

responseHeaderBuf.order(ByteOrder.BIG_ENDIAN);

int bytesRead = 0;

do {

bytesRead = socketChannel.read(responseHeaderBuf);

} while (bytesRead!=-1 && responseHeaderBuf.position()

if (bytesRead==-1) {

throw new IOException(carrier + " : Remote connection closed unexpectedly");

}

responseHeaderBuf.flip();

int lengthField = responseHeaderBuf.getInt();

int responseLength = lengthField - responseHeaderLength;

responseHeaderBuf.clear();

ByteBuffer responseBuf = ByteBuffer.allocate(responseLength);

bytesRead = socketChannel.read(responseBuf);

if (bytesRead>responseBuf.limit() || bytesRead ==-1) {

throw new IOException(carrier + " : Remote connection closed unexpectedly");

}

responseBuf.flip();

if (responseBuf.get(responseBuf.limit()-1)==END_OF_MESSAGE_BYTE) {

responseBuf.limit(responseBuf.limit()-1);

}

responseBuf.clear();

String response = charsetDecoder.decode(responseBuf).toString();

return response;

}

public static void main(String[] args) throws Exception{

SimpleConnector simpleConnector = new SimpleConnector("carrier",new InetSocketAddress("localhost",9999));

String response=simpleConnector.sendRequest("Request");

System.out.println(response);

}

}

我正在尝试使用Netty重写以下内容。 通过使用以下教程作为参考。

我面临的问题是我能够连接到服务器但无法从中读取或写入。 我正在使用ChannelInboundHandlerAdapter来执行读写操作。

这是我的Netty客户端public class NettyClient {

int port;

Channel channel;

EventLoopGroup workGroup = new NioEventLoopGroup();

public NettyClient(int port){

this.port = port;

}

public ChannelFuture connectLoop() throws Exception {

try{

Bootstrap b = new Bootstrap();

b.group(workGroup);

b.channel(NioSocketChannel.class);

b.option(ChannelOption.SO_KEEPALIVE, true);

b.handler(new ChannelInitializer() {

protected void initChannel(SocketChannel socketChannel) throws Exception {

socketChannel.pipeline().addLast(new NettyClientHandler());

}

});

ChannelFuture channelFuture = b.connect("remote-ip", this.port).sync();

this.channel = channelFuture.channel();

return channelFuture;

}finally{

}

}

public void shutdown(){

workGroup.shutdownGracefully();

}

public static void main(String[] args) throws Exception{

try {

NettyClient nettyClient = new NettyClient(12000);

ChannelFuture channelFuture = nettyClient.connectLoop();

System.out.println("Sleep 2sec");

Thread.sleep(2000);

String command ="username";

final Charset charset = Charset.forName("ISO-8859-1");

int length = 13 + command.length();

if (channelFuture.isSuccess()) {

ByteBuf byteBuf = Unpooled.buffer(1024);

byteBuf.writeInt(length);

byteBuf.writeCharSequence("Some Info",charset);

byteBuf.writeCharSequence(command,charset);

channelFuture.channel().writeAndFlush(byteBuf).addListener(new ListenerImpl());

}

}

catch(Exception e){

System.out.println(e.getMessage());

System.out.println("Try Starting Server First !!");

}

finally {

}

}

private static final class ListenerImpl implements ChannelFutureListener{

public void operationComplete(ChannelFuture channelFuture) throws Exception {

if (channelFuture.isSuccess()){

System.out.println("Success"); //I can see success in Listener after write, but couldn't read response

}else {

System.out.println("Failed");

}

}

}

}

处理器public class NettyClientHandler extends ChannelInboundHandlerAdapter {

@Override

public void channelReadComplete(ChannelHandlerContext ctx) throws Exception {

super.channelReadComplete(ctx);

}

@Override

public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {

System.out.println("NettyClientHandler : channelRead" );

ByteBuf byteBuf = (ByteBuf) msg;

String message = byteBuf.toString(Charset.defaultCharset());

System.out.println("Received Message : " + message);

}

@Override

public void channelActive(ChannelHandlerContext ctx) throws Exception {

super.channelActive(ctx);

System.out.println("NettyClientHandler : channelActive" );

}

}

我最初认为netty只适用于netty服务器。但是这个答案清楚地表明了我的疑问

有人可以指导我,我做错了什么?

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值