博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
RPC学习--C#使用Thrift简介,C#客户端和Java服务端相互交互
阅读量:6031 次
发布时间:2019-06-20

本文共 5700 字,大约阅读时间需要 19 分钟。

本文主要介绍两部分内容:

  • C#中使用Thrift简介
  • 用Java创建一个服务端,用C#创建一个客户端通过thrift与其交互。
  • 用纯C#实现Client和Server
  • C#服务端,Java客户端

其中使用到,这篇文章创建的Java服务端。

一、C#中使用Thrift简介

关于rpc的简介,可以参考:

1、下载thrift

1)点击下载:(或者http://thrift.apache.org/download)

2) 

两个都要下载。

 

2、引入thrift.dll

这里将下载好的.gz文件解压后,然后找到lib目录

 

用vs打开后,如下图所示,然后右键--》重新生成---》生成thrift.dll

 

 

 

3、生成cs文件

hello.thrift

service  HelloWorldService {  string sayHello(1:string username)}

使用命令生成cs文件:

thrift-0.9.1.exe -gen csharp hello.thrift

关于的使用方法可以查看命令: thrift-0.9.1.exe -help

 

将生成的HelloWorldService.cs文件拷入项目中。

 

二、C#客户端发送消息到Java生成的服务端,实现跨平台操作

1、启动Java版的服务端

 

 

2、使用vs新建一个winform程序

 

button点击事件:

private void button1_Click(object sender, EventArgs e)        {            if (textBox1.Text != null)            {              new HelloWorldServiceClient().startClient(textBox1.Text.Trim());           }        }

HelloWorldServiceClient.cs

using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Threading.Tasks;using Thrift.Protocol;using Thrift.Transport;using Thrift;namespace thrfitCsharp{    class HelloWorldServiceClient    {        public const string SERVERIP = "localhost";        public static int SERVERPORT = 8090;        public static int TIMEOUT = 3000;        public void startClient(String username)        {            TTransport transport = null;            try            {                transport = new TSocket(SERVERIP, SERVERPORT, TIMEOUT);                //协议要和服务端一致                TProtocol protocol = new TCompactProtocol(transport);                HelloWorldService.Client client = new HelloWorldService.Client(protocol);                transport.Open();                String result = client.sayHello(username);                Console.WriteLine("Thrift client result =: " + result);            }            catch (Exception e)            {                Console.WriteLine(e.StackTrace);            }            finally            {                if (null != transport)                {                    //close                    transport.Close();                }            }        }    }}

 

HelloWroldImpl.cs

using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Threading.Tasks;namespace thrfitCsharp{    class HelloWroldImpl : HelloWorldService.Iface    {        public  string sayHello(string username){            Console.WriteLine("hello"+username);            return "hello" + username;        }    }}

 

效果图:

 

三、纯C#版(C#实现客户端和服务端)

注:下面是改进版的,主要添加了纯C#版的:

 

纯C#版是说用C#实现客户端和服务端,下面是纯c#版的输出:

 

 

四、C#服务端,Java客户端

 

VS 2013终端输出:

num1:1 num2:2 num3:3testCase1  num1+num2 is :3testCase2 ...username : amosliaddress : shanghaitestCase3 ...........2014/9/1 23:59:19testCase4 ...........id:001IpAddress:192.168.0.11Content:topic:topic1 is rpctime:1409587159730id:002IpAddress:192.168.0.12Content:topic:topic2 is rpc too!time:1409587159730

 

Java客户端源码:

生成Java客户端代码:

将生成的Java文件拷到Java项目中:

 

源码:

BlogClient.java

package com.amos.thrift;import java.nio.ByteBuffer;import java.util.ArrayList;import java.util.HashMap;import java.util.Hashtable;import java.util.List;import java.util.Map;import org.apache.thrift.TException;import org.apache.thrift.protocol.TBinaryProtocol;import org.apache.thrift.protocol.TProtocol;import org.apache.thrift.transport.TSocket;import org.apache.thrift.transport.TTransport;import org.apache.thrift.transport.TTransportException;/** * Created by amosli on 14-8-12. */public class BlogClient {    public static final String SERVER_IP = "localhost";    public static final int SERVER_PORT = 7911;    public static final int TIMEOUT = 3000000;    /**     * @param args     */    public static void main(String[] args) {        BlogClient client = new BlogClient();        client.startClient("amosli");    }    /**     * @param userName     */    public void startClient(String userName) {        TTransport transport = null;        try {            transport = new TSocket(SERVER_IP, SERVER_PORT, TIMEOUT);            // 协议要和服务端一致            TProtocol protocol = new TBinaryProtocol(transport);            // TProtocol protocol = new TCompactProtocol(transport);            // TProtocol protocol = new TJSONProtocol(transport);            ThriftCase.Client client = new ThriftCase.Client(protocol);            transport.open();                        //case 1            client.testCase1(1, 2, "3");            //case 2            Map
num1 = new HashMap
(); num1.put("username", "amosli"); num1.put("address", "shanghai"); client.testCase2(num1); //case 3 client.testCase3(); //case 4 List
list = new ArrayList
(); ByteBuffer content = ByteBuffer.allocate(30); content.put("this is content java client".getBytes()); Map
props = new Hashtable
(); props.put("one", "1"); props.put("two", "2"); props.put("three", "3"); list.add(new Blog("topic1 is rpc", content, System.currentTimeMillis(), "001", "192.168.0.11", props)); list.add(new Blog("topic2 is rpc too!", content, System.currentTimeMillis(), "002", "192.168.0.12", props)); client.testCase4(list); System.out.println("blog client stop ...."); } catch (TTransportException e) { e.printStackTrace(); } catch (TException e) { e.printStackTrace(); } finally { if (null != transport) { transport.close(); } } }}
View Code

C#服务端“开户服务”的事件和纯C#版的代码是一样的,如下:

Thread thread = new Thread(new ThreadStart(new ThreadStart(new BlogServer().StartServer)));  thread.Start();//start

 

 

 

本文源码https://github.com/amosli/rpc/tree/thriftCsharp 

纯C#版实现主要参考http://www.cnblogs.com/hanmos/archive/2011/09/15/2177891.html

 

你可能感兴趣的文章
MXNet 作者李沐:用深度学习做图像分类,教程+代码
查看>>
Android RecyclerView (一) 使用完全解析
查看>>
中国电信携手 Orange Business Services 扩大战略合作 为企业提供无缝物联网体验
查看>>
mongodb 2.4升级至3.2
查看>>
[转载]HTML5语音输入(淘宝语音搜索)方法
查看>>
你刚才在淘宝上买了一件东西
查看>>
代码面试之串(转载)
查看>>
java面试-彻底搞懂红黑树
查看>>
fms服务器端呼叫客户端
查看>>
top2
查看>>
使用vRealize Operations for Horizon,做高效的虚拟桌面系统管理员
查看>>
chomperwu
查看>>
流媒体选择Nginx是福还是祸?
查看>>
centos 安装 jenkins
查看>>
CentOS 5/6下搭建Subversion+HTTPS+LDAP
查看>>
用shell批量修改类似的文件名
查看>>
LVM中的PV、VG、LV、PE、LE的关系及简单LVM配置
查看>>
配置rsync源服务器
查看>>
Android******Context******
查看>>
js获取区域坐标
查看>>