在上一篇《C#使用命名管道与其他进程间通讯(一)》中展示了如何在两个C#开发的进程直接进行数据传递,本文将展示如何使用Go开发的进程和C#开发的进程间通讯。
一、建立Server端
参照《C#使用命名管道与其他进程间通讯(一)》中使用NamedPipeServerStream构造Server端。本文将直接使用上一节中的Server端,不再赘述。
二、建立Client端
上一节中使用C#构建了一个Client,本文将使用Go构建一个Client从Server读取数据。
1、从Github上下载开源代码
Go使用windows的pipe通道在github上有个开源的库,地址是:https://github.com/natefinch/npipe.git。使用Git Bash下载到本地。
2、创建Client读取数据
在github上的开源库中已经介绍了怎么使用,所以本文参照其使用,本地创建代码如下:
package main import ( "bufio" "fmt" "github.com/npipe" "sync" "time" ) func main() { for { conn, err := npipe.Dial(`\\.\pipe\testpipe`) if err != nil { } for { msg, err := bufio.NewReader(conn).ReadString('\n') if err != nil { break } time.Sleep(1 * time.Second) fmt.Println(msg) } time.Sleep(10 * time.Second) } }
这样就可以与上一节中用C#建立的Server进行数据交互了。
三、注意事项
两个进程直接数据传输需要考虑以下几点:
1、数据传输格式,有两种格式,一种是string字符串,也是本文中代码示例中使用的,一种是byte[],byte[]数组读取的时候也可以一个字节一个字节的读取。
2、管道管理。两个进程间通讯,总会有异常,当有异常时,不管Server还是Client都需要重启的功能,本文的示例中仅仅使用了无限循环来管理,实际项目也可以这样,但是得考虑更多因素,比如重启间隔,连接资源释放等等。尤其是Go通常是使用协程来建立管道,使用不当将会创建额外的协程造成内存泄漏。