.net byte转java byte_.Net Core使用Named Pipe和java进行通讯

一:概述

命名管道(Named Pipe)是win32的内核对象之一,是进行单向/双向的进程间通讯的常用方法。

.net framework,是基于windows平台的编程模型,因此对命名管道进行了封装,即位于System.IO.Pipes命名空间内的NamedPipeServerStream与NamedPipeClientStream。该封装实现了全双工,异步工作模式。基本使用方法如下:

服务端:

//建立一个名为testpipe.pipe的命名管道,双向,单实例,字节流传输,异步模式

客户端:

//建立pipe客户端,和服务端位于同一主机
NamedPipeClientStream clientPipe = new NamedPipeClientStream(".",
                                                             "testpipe.pipe",
                                                             PipeDirection.InOut, 
                                                             PipeOptions.Asynchronous);
//连接到Pipe
await clientPipe.ConnectAsync();
try{
    //准备发送内容
    byte[] senddata.....
    //发送
    await clientPipe.WriteAsync(senddata, 0, senddata.Length);
    //准备接收buffer
    byte[] receivedata = new byte[512];
    //读取管道内容
    int readsize = await clientPipe.ReadAsync(receivedata, 0, receivedata.Length);    
}
catch(IOException e){
    Console.WriteLine("错误: {0}", e.Message);
}
finally{
    //释放资源
    clientPipe.Dispose();
}

在.net发展到.net core以后,System.IO.Pipes命名空间和功能得到了保留,因此以上代码依然有效,并且可以正常工作于linux等系统。

下面进入本文的主题,我们来看看java语言开发的程序,如何连接到.net core建立的NamedPipe,即NamedPipeServerStream

二:Windows系统

在Windows平台上,.net core毫无疑问地继续使用win32 namedpipe来实现NamedPipeServerStream。因此在java方面,我们需要连接到创建的pipe,好在windows平台的JVM实现了该功能。使用正确的pipe名称创建FileInputStream/FileOutputStream/RandomAccessFile即可。上述代码创建的本机pipe名称为.pipetestpipe.pipe。代码如下

try

关于PipeDirection和Java对象的对应关系,如下表所示

即:当Pipe以 http://PipeDirection.In / PipeDirection.Out建立时,java客户端,只能使用FileOutputStream/FileInputStream来连接Pipe进行单向读写操作;而当Pipe以PipeDirection.InOut建立时,java客户端,既可以FileOutputStream/FileInputStream连接Pipe进行单向读写操作(当业务只需要单向操作时),也可以使用RandomAccessFile来进行双向操作。但有一点需要注意,和.net core的NamedPipeClientStream不同,RamdomAccessFile,不支持全双工操作,即无法同时读写。读写需要错开执行。

三:Linux系统

由前述可知,System.IO.Pipes本是.net framework对win32管道的封装。属于OS dependent功能。.net Core尽管保留了该功能,但在非Win32系统的实现上,就需要另起炉灶。从以下连接可知,在Linux上的.net pipe,最先是使用FIFO,而现在则使用Unix Domain Sockets来实现。

.net core Named Pipe实现​github.com

因此,在Linux系统中,如果想通过java连接.net Core NamedPipe,则需要连接同名的UDS。这需要使用一些第三方类库,比如netty或junixsocket,unix domain sockets实现的.net Core NamedPipe,在c#端与java端皆支持全双工读取

https://github.com/kohlschutter/junixsocket​github.com

示例代码(使用junixsocket)如下:

//假设c#端建立了名为/etc/testpipe.pipe的namedPipe
File udsFile = new File("/etc/testpipe.pipe");
AFUNIXSocket sock = AFUNIXSocket.newInstance();
try{
    //连接到pipe
    sock.connect(new AFUNIXSocketAddress(udsFile));
    //获取输入输出流
    InputStream iStream = sock.getInputStream();
    OutputStream oStream = sock.getOutputStream();
    //准备发送内容
    byte[] senddata.....
    //发送
    oStream.write(senddata);
    //准备接收buffer
    byte[] receivedata = new byte[512];
    //读取管道内容
    int readsize = iStream.read(receivedata);
    oStream.close();
    iStream.close();
    sock.close();
}
catch(Exception e){
}

文章到此就告一段落了,感谢阅读,欢迎提出意见。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值