1、java通过jni调用dll库实现与后台C(C++)通信的代码实现还是有些麻烦。
2、Golang的出现,使得一些对C代码不是很熟的程序员看见的希望,虽然说当前对于Golang就还有很多质疑的声音,
但是个人认为对于一般下后台业务,Golang是完全可以胜任的。
3、还有一个好处就是java对Golang后台业务的调用时很方便,下面以一个例子进行说明。
4、Golang服务端代码如下(rpcserver.go):
package main
// first we create a simple golang rpc server based on socket
import (
"fmt"
"net"
"net/rpc"
"net/rpc/jsonrpc"
)
type Counter struct {
Sum int
}
func (this *Counter) Add(i int, r *int) error {
this.Sum += i
*r = this.Sum
fmt.Printf("i: %v", i)
return nil
}
func main() {
rpc.Register(new(Counter))
l, err := net.Listen("tcp", ":3333")
if err != nil {
fmt.Printf("Listener tcp err: %s", err)
return
}
for {
fmt.Println("wating...")
conn, err := l.Accept()
if err != nil {
fmt.Sprintf("accept connection err: %s\n", conn)
}
go jsonrpc.ServeConn(conn)
}
}
5、java实现的客户端代码如下
package com.test;
import com.googlecode.jsonrpc4j.JsonRpcClient;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.*;
public class helloworld {
public static void main(String[] args) {
try {
Socket socket = new Socket("192.168.110.157", 3333);
JsonRpcClient client = new JsonRpcClient();
InputStream ips = socket.getInputStream();
OutputStream ops = socket.getOutputStream();
int reply = client.invokeAndReadResponse("Counter.Add", new Object[]{1001}, int.class, ops, ips);
System.out.println("reply: " + reply);
} catch (IOException e) {
e.printStackTrace();
} catch (Throwable throwable) {
throwable.printStackTrace();
}
}
}
6、编译Golang服务器代码并启动服务端
1)go build rpcserver.go
2) ./rpcserver
[email protected]:/home/docker/xu/go-pro/java-go# ./rpcserver
wating...
wating...
wating...
i: 1001wating...
i: 1001
7、运行java客户端程序,执行结果如下:
reply: 2002
实验需要的jar请访问链接:http://download.csdn.net/detail/xuguokun1986/9749486