Java 如何将接收到的数据转换为inputstream和outputstream

Java 如何将接收到的数据转换为inputstream和outputstream,java,netty,Java,Netty,我必须为RPC通信创建TCP/IP服务器。我必须使用提供的java库来处理所有“rpc”内容。此库接收包含protobuf数据的HDLC消息。lib本身使用请求和响应处理程序来处理HDLC和protobuf部分。此库可用于串行连接以及网络连接 为此,我们希望使用netty作为TCP服务器。调用这个lib时,它需要在“RPC”方法中使用java.io.inputstream和java.io.outputstream 我有一个简单的阻塞设置,在其中我创建了一个服务器套接字,只需将一个socket.g

我必须为RPC通信创建TCP/IP服务器。我必须使用提供的java库来处理所有“rpc”内容。此库接收包含protobuf数据的HDLC消息。lib本身使用请求和响应处理程序来处理HDLC和protobuf部分。此库可用于串行连接以及网络连接

为此,我们希望使用netty作为TCP服务器。调用这个lib时,它需要在“RPC”方法中使用
java.io.inputstream
java.io.outputstream

我有一个简单的阻塞设置,在其中我创建了一个服务器套接字,只需将一个
socket.getInputStream()
socket.getOutputStream()
传递给RPC方法。接下来,我需要向这个rpc对象注册(一组)rpc处理程序,这样客户端就可以连接并发送数据。对我来说似乎很简单

我还设置了一个netty“echo”服务器,现在我想将这个RPC库与netty一起使用。我正在努力解决的是如何将接收到的数据转换为所需的
InputStream
,以及如何转换RPC库的
OutputStream
,以便将其发送回客户端。我需要解码器/编码器,还是有更简单的方法?如果是这样,我如何将
ByteBuf
转换为
InputStream
,并将
OutputStream
转换回可以通过网络发送的格式?

InputStream 另一个api有一个readpacket()方法 如果您的库具有readPacket方法,则可以将与结合使用,这相对容易实现:

公共类RPCInputHandler扩展了ReplayingDecoder{
RPC上游=。。。。;
受保护的无效解码(ChannelHandlerContext ctx、ByteBuf buf)引发异常{
readPacket(新的ByteBufInputStream(buf));
状态(空);
}
}
远程api使用线程读取流 如果您的上游库使用一个单独的线程来处理传入的消息,那么您将失去Netty的一个主要优点:对于大量连接,线程数较低

公共类RPCInputHandler扩展了SimpleChannelInboundHandler{
RPC上游=。。。。;
管道输入流;
管道输出流;
@重写公共无效channelActive(ChannelHandlerContext ctx)引发异常{
in=新的PipedInputStream();
out=新管道输出流(in);
上游。开始输入(in);
}
@重写公共无效channelInactive(ChannelHandlerContext ctx)引发异常{
out.close();//这会将EOF发送到另一个管道
}
//此方法在5.0中称为messageReceived(ChannelHandlerContext,I)。
public void channelRead0(ChannelHandlerContext ctx,ByteBuf msg)引发异常{
字节[]数据=新字节[msg.readableBytes()];
msg.readBytes(数据);
输出。写入(数据);
}
}
输出流 制作一个将字节写入连接的自定义输出流很简单,大多数方法直接映射到

公共类OutputStreamNetty扩展了OutputStream{
最终通道=。。。;
引导未来;
私有void checkFuture()引发IOException{
if(lastfourture.isDone()){
if(lastFuture.cause()!=null){
抛出新IOException(“下游写入问题”,lastFuture.cause());
}
lastFuture=null;
}
}
专用void addFuture(ChannelFuture f){
if(lastFuture==null){
lastFuture=f;
}
}
public void close()引发IOException{
checkFuture()
addFuture(channel.close());
}
public void flush()引发IOException{
checkFuture()
addFuture(channel.flush());
}
公共无效写入(字节[]b,int off,int len)引发IOException{
checkFuture()
Bytebuf f=channel.alloc().buffer(len);
f、 写入字节(b、off、len);
addFuture(channel.write(f));
}
公共摘要无效写入(int b)引发IOException{
checkFuture()
Bytebuf f=channel.alloc().buffer(1);
f、 写字节(b);
addFuture(channel.write(f));
}
}

Hi。谢谢你的快速回复。RPC库使用线程读取流。因此,我们将失去在这里的净优势。这是否也意味着我们失去了netty althogether的优势,还不如只使用java.io(因此没有nio)。或者仍然有一些理由使用Netty?如果您丢失了Netty的线程部分,您仍然可以使用
EmbeddedChannel
快速单元测试实现,使用
SSLContext将其包装成一个,以实现对协议的SSL支持,使用
AbstractRemoteAddressFilter
包装以支持简单防火墙,或者甚至围绕它创建一个自定义处理程序,以便它可以在HTTP协议上工作,但使用java套接字将提供更高的性能,因为在使用管道流时,数据不需要通过线程边界。为你未来的需要做出明智的选择。