天天看点

golang与java间的json-rpc跨语言调用

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