go将服务器图片响应给客户端,Go中来自客户端和服务器的RPC

我目前正在使用thrift(thrift4go)来实现服务器->客户端和客户端->服务器RPC功能。默认情况下,thrift仅像net / rpc一样执行客户端->服务器调用。由于还需要服务器与客户机之间的通信,因此我进行了一些研究,发现bidi-thrift。Bidi-thrift解释了如何连接Java服务器+ Java客户端进行双向节俭通信。

比迪蒂节俭是做什么的,它的局限性。

TCP连接具有传入和传出的通信线路(RC和TX)。bidi-thrift的想法是将RS和TX分开,并将它们提供给客户端应用程序和服务器应用程序上的服务器(处理器)和客户端(远程)。我发现在Go中很难做到这一点。同样,这种方式没有“响应”的可能(正在使用响应线)。因此,服务中的所有方法都必须“单向无效”。(开火忘了,打电话没有结果)。

解决方案

我改变了“比迪节约”的概念,使客户端打开了到服务器的两个连接,即A和B。第一个连接(A)用于执行客户端->服务器通信(客户端照常进行呼叫)。第二个连接(B)被“劫持”,并且连接到客户端上的服务器(处理器),而第二个连接(B)连接到服务器上的客户端(远程)。我已经将其与Go服务器和Java客户端一起使用了。效果很好。它既快速又可靠(就像普通的节俭一样)。

一些来源。B连接(服务器->客户端)的设置如下:

转到服务器

// factories

framedTransportFactory := thrift.NewTFramedTransportFactory(thrift.NewTTransportFactory())

protocolFactory := thrift.NewTBinaryProtocolFactoryDefault()

// create socket listener

addr, err := net.ResolveTCPAddr("tcp", "127.0.0.1:9091")

if err != nil {

log.Print("Error resolving address: ", err.Error(), "\n")

return

}

serverTransport, err := thrift.NewTServerSocketAddr(addr)

if err != nil {

log.Print("Error creating server socket: ", err.Error(), "\n")

return

}

// Start the server to listen for connections

log.Print("Starting the server for B communication (server->client) on ", addr, "\n")

err = serverTransport.Listen()

if err != nil {

log.Print("Error during B server: ", err.Error(), "\n")

return //err

}

// Accept new connections and handle those

for {

transport, err := serverTransport.Accept()

if err != nil {

return //err

}

if transport != nil {

// Each transport is handled in a goroutine so the server is availiable again.

go func() {

useTransport := framedTransportFactory.GetTransport(transport)

client := worldclient.NewWorldClientClientFactory(useTransport, protocolFactory)

// Thats it!

// Lets do something with the connction

result, err := client.Hello()

if err != nil {

log.Printf("Errror when calling Hello on client: %s\n", err)

}

// client.CallSomething()

}()

}

}

Java客户端

// preparations for B connection

TTransportFactory transportFactory = new TTransportFactory();

TProtocolFactory protocolFactory = new TBinaryProtocol.Factory();

YourServiceProcessor processor = new YourService.Processor(new YourServiceProcessor(this));

/* Create thrift connection for B calls (server -> client) */

try {

// create the transport

final TTransport transport = new TSocket("127.0.0.1", 9091);

// open the transport

transport.open();

// add framing to the transport layer

final TTransport framedTransport = new TFramedTransport(transportFactory.getTransport(transport));

// connect framed transports to protocols

final TProtocol protocol = protocolFactory.getProtocol(framedTransport);

// let the processor handle the requests in new Thread

new Thread() {

public void run() {

try {

while (processor.process(protocol, protocol)) {}

} catch (TException e) {

e.printStackTrace();

} catch (NullPointerException e) {

e.printStackTrace();

}

}

}.start();

} catch(Exception e) {

e.printStackTrace();

}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/267549.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

hdu 3887 Counting Offspring

题目连接:http://acm.hdu.edu.cn/showproblem.php?pid3887 题意:给出一棵树,对于每一个节点,问他的子孙节点中有多少个节点小于该节点。 思路:首先找出这棵树的DFS序列,每一个节点出现在两个位置&#xff…

搭建vue开发环境的步骤

搭建vue开发环境的步骤 相信很多人在刚开始学习vue这个框架的时候,在最开始搭建开发环境的时候,都会遇到一些大大小小的坑,我之前在学习angular的时候搭建过一次,过了一个月后在搭建第二次的时候,竟然有一些混乱&#…

ccxprocess可以禁用么_提效 | 5G时代网站还需要加速么?

看到标题, 你一定会说都已经 5G 时代了, 还要在网络提速上下功夫么? 答案是: 是的. 如果你是做国际或者全球业务的, 会更有体会, 很多国家和地区的网络是非常差的, 说他们停留在 2G 时代也不过分的.即使是国内良好的网络环境下, 做好网络提速, 也是可以提高用户体验以及缓解服…

springboot ---- sts如何启动两个实例

idea 实现启动两个spring boot工程实例的方法 可以参考这篇博客。 因为使用spring tool suite 学习spring cloud 需要实例化两个spring boot 工程来构成一个小小的集群系统, 可以通过sts ,右击选择run as, 使用run configuration..., 配置jvm参数为 -Dserver.portxx…

java trie实现

http://www.riaos.com/ria/5814

如何利用python在一个wen'dang'li_如何利用Python网络爬虫给自己跟朋友来一份穷游攻略!走到哪里穷到哪里的哦!...

【一、项目背景】穷游网提供原创实用的出境游旅行指南、攻略,旅行社区和问答交流平台,以及智能的旅行规划解决方案,同时提供签证、保险、机票、酒店预订、租车等在线增值服务。穷游“鼓励和帮助中国旅行者以自己的视角和方式体验世界”。今天…

ubuntu下命令安装与卸载软件方法

2019独角兽企业重金招聘Python工程师标准>>> 刚 刚接触ubuntu就开始一直在安装语言包、升级、常用软件和其它相关依赖等等东西,总的来说,是一个劲儿的装,缺全然不知怎么卸载,现在把安装和卸载写 在一块,一旦…

为什么用线程池

1、创建/销毁线程伴随着系统开销,过于频繁的创建/销毁线程,会很大程度上影响处理效率 2、线程并发数量过多,抢占系统资源从而导致阻塞 3、对线程进行一些简单的管理 延时执行、定时循环执行的策略等 https://www.cnblogs.com/dongguacai/p/60…

delphi7存取配置文件与sqlserver数据库连接_Delphi7存取配置文件与SQLServer数据库连接...

时间:2012-06-28 18:57来源:未知 整理:寂涯网络 点击:2975次引言Delphi7 具有强大的数据库应用程序开发功能 在使用Delphi7 开发 房产管理系统 时,后台数据库采用 SQLServer 数据库管理系统 使用 TADOConnection 组件与数据库建立连接,需要指定 TADOConn…

C 语言和C++语言的 struct对比

C 语言和C语言的 struct对比 author: stonehat 1. C语言将struct当成类来处理的,所以C的struct可以包含C类的所有东西,例如构造函数,析构函数,友元等,C的struct和C类唯一不同就是 struct成员默认的是public&#xff0c…

UOJ.117.欧拉回路

题目链接 这数据。。简直了 有自环和重边,有些点可能没有连边(并查集不好使 就DFS吧) 因为重边自环可能非常多,同一个点可能经过n次,所以必须要重置表头H[x](类似当前弧优化) 另外是找欧拉回路不是欧拉路径,判断不要错 无向图: 所…

c++ linux 线程等待与唤醒_C++并发编程 等待与唤醒

C并发编程 等待与唤醒条件变量条件变量, 包括(std::condition_variable 和 std::condition_variable_any)定义在 condition_variable 头文件中, 它们都需要与互斥量(作为同步工具)一起才能工作.std::condition_variable 允许阻塞一个线程, 直到条件达成.成员函数void wait(std:…

iOS 动画基础总结篇

iOS 动画基础总结篇 动画的大体分类(个人总结可能有误) 分类.png UIView 动画 属性动画 12345678910111213141516171819[UIView beginAnimations:nil context:nil];[UIView setAnimationDelay:1];[UIView setAnimationDuration:2];[UIView setAnimationRepeatCount:100];[UIVie…

最老程序员创业札记:全文检索、数据挖掘、推荐引擎应用41

入局在北京初冬寒风的吹拂下,吴言渐渐清醒了起来,他现在需要做的是赶紧想办法应付下周赵海波要召开的会议,而不是无谓的生气。吴言走在冬日的街头,一边走一边想。下周的事情还真不少,第一件事是赵海波要召开的公司改组…

bootstraptable获得所有行_郎酒领衔,2020“川酒全国行”首站香满花城

12月8日,2020“川酒全国行”首站在广州开启。以“川酒金花醉美珠江”为主题,本次活动由四川省经济和信息化厅指导,四川中国白酒金三角酒业协会主办,四川郎酒股份有限公司承办,五粮液、泸州老窖、剑南春、舍得、水井坊协…

判断DataRow中某列是否为空的方法

DataRow drdt.Rows[0]; if(!dr.IsNull("列名")) { //不为空的操作 }转载于:https://www.cnblogs.com/12go/archive/2011/10/09/2203606.html

centos7根据端口查进程_记录一次CentOs7下Nginx+WSGI部署Django项目(超详细)

记录一次Django部署的文章,不是很熟悉Linux系统,踩了不少坑,本篇文章相当于是一个总结,我会在本文中详细介绍,部署单个Django项目和多个Django的方法,如读者有更好的方法,欢迎留言一起探讨~长话…

淘宝跨域获取Cookie分析

最近在发现使用Taobao的时候的一个小细节,于是便萌发起了写这篇文章。 当我们在 www.taobao.com 中进行登录之后,然后直接切换到 www.tmall.com 域名下,发现www.tmall.com首页的最顶部马上显示成了: 您好, andyfaces。 首先&#…

mqtt 传文件断开连接的原因_MQTT PythonClient断开连接不当

MikeScotty的回答不对。缺少的是启动MQTT网络循环。需要启动循环来处理发送keep-alive包、为QoS 1/2消息进行多段握手以及处理传入的订阅。在如果你只想保持联系或者10秒钟,那么这样的方法就可以了import paho.mqtt.client as mqttimport timeBroker "192.168…

JAVA方法 字符串与unicode的相互转换

unicode编码简而言之就是将每一个字符用16位2进制数标识。但是通常都用4位的16进制数标识。例如&#xff1a;1)中文字符串"你好"的unicode码为&#xff1a;\u<?XML:NAMESPACE PREFIX ST1 />4f60\u597d; 2)英文字符串"ab"的unicode码为&#xff1a;…