webservice请求如何转发到TCP Server

echolan 2019-04-18 10:21:33
部署一台web服务器、一台TCP服务器(web服务器和TCP服务器交互实现内外网数据交换)
web服务器以WebService方式供外部调用(不提供web页面访问),WebService接口将接收到的数据解析并转发到TCP服务器上,web服务器后端应采用怎样的设计才能连接到TCP Server?连接方式短连接或者长连接都可以,web服务器和TCP服务器是两台独立的服务器。可不可以通过Nginx直接实现http到TCP的转发?

...全文
422 20 打赏 收藏 转发到动态 举报
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
wanghui0380 2019-04-18
  • 打赏
  • 举报
回复
这样吧,tcp部分和设备交互的部分你可以不动 让tcp部分,单独提供restfull接口(如果是net的,用nancy提供) 这样你也不用转发什么,直接restfull访问就行,webserice本身就无状态,只是定时刷。所以你没必要弄tcp长连接。 这样大家都简单,如果按你一开始的设计,弄个长连接其实更麻烦。
echolan 2019-04-18
  • 打赏
  • 举报
回复
确实是这样,大家彼此关注消息队列就可以了,只是目前时间太紧,调整各部分的代码肯定来不及,而且还涉及以前在用的系统,所以只能在webservice这端想办法了
wanghui0380 2019-04-18
  • 打赏
  • 举报
回复
当然这都是传统的做法,现代一点的做法是。agent 都懒得和 proxy直接通讯了。 直接挂上redis,etcd,mq这类玩意。proxy把状态丢redis,etcd里,agent直接把指令丢mq里。然后各管各家,你做你的,我做我的。
echolan 2019-04-18
  • 打赏
  • 举报
回复
引用 15 楼 wanghui0380 的回复:
实时数据交互的也是一样,通常来说他会有一个“前置代理机”,前置代理负责个设备进行长连接和状态维护一类的,他内部缓存状态,同时也有可能执行一些“中转指令” 外部服务并不直接和设备打交道,他只查询“前置代理机”的状态就好 比如你可能容易接触到的“前置代理机”就是-----------snmp的代理服务,这个windows就是有。(当然默认没有安装),如果你安装的snmp代理服务这个代理服务就会实时收集你windows的各种状态,而外部服务并不是直接查询windows,外部服务只直问snmp查询一下就好。
那你把TCP Server理解成前置代理机就可以了,只是他跑的是基于TCP的私有协议,Windows或其他第三方程序不存在这样一个通用的解析器,而目前要做的就是解决http<->TCP私有协议之间的相互解析,经前面各位的建议目前几种方案都可以试下,考虑到快的话还是TCP长连接来做,后期分开到另外的进程处理可能比较合理
wanghui0380 2019-04-18
  • 打赏
  • 举报
回复
实时数据交互的也是一样,通常来说他会有一个“前置代理机”,前置代理负责个设备进行长连接和状态维护一类的,他内部缓存状态,同时也有可能执行一些“中转指令” 外部服务并不直接和设备打交道,他只查询“前置代理机”的状态就好 比如你可能容易接触到的“前置代理机”就是-----------snmp的代理服务,这个windows就是有。(当然默认没有安装),如果你安装的snmp代理服务这个代理服务就会实时收集你windows的各种状态,而外部服务并不是直接查询windows,外部服务只直问snmp查询一下就好。
echolan 2019-04-18
  • 打赏
  • 举报
回复
引用 11 楼 wanghui0380 的回复:
想明白了再弄,别绕。比如A是一台机器有公网ip上面有个网站,B是另一台机器是内网的上面有个数据库 好吧,这有问题么。A接外网请求,连接B执行sql,返回结果,在输出给外网访问者,这有问题么? 你非要来个转发,怎么转发。把一个webapi请求转发给数据库?让数据库给你做web服务器?
转发也好代理也好,我得解决http到TCP的协议转换啊
echolan 2019-04-18
  • 打赏
  • 举报
回复
引用
TCP连接在webservice还没初始化之前就可以创建了 1对1没必要每次都进行tcp连接 只是需要一个自定义的封包格式来处理来自不同客户端的请求以及能正确识别TCP服务器发过来的信息是要返回给哪个客户端 当然如果webservice只是把数据传给tcp服务器,而不需要把tcp的数据返回给调用者,那就更简单
是在Global里创建TCPClient?在调用很频繁的情况下不知道效率怎么样,每次IIS重启应该都会初始化一次
wanghui0380 2019-04-18
  • 打赏
  • 举报
回复
你是代理执行者,不是什么转发者。
wanghui0380 2019-04-18
  • 打赏
  • 举报
回复
想明白了再弄,别绕。比如A是一台机器有公网ip上面有个网站,B是另一台机器是内网的上面有个数据库 好吧,这有问题么。A接外网请求,连接B执行sql,返回结果,在输出给外网访问者,这有问题么? 你非要来个转发,怎么转发。把一个webapi请求转发给数据库?让数据库给你做web服务器?
echolan 2019-04-18
  • 打赏
  • 举报
回复
引用 8 楼 wanghui0380 的回复:
问题压根就不在上面转发的,问题在协议解析。人家的http+Soap,你要转给tcp去解析?那到底是你写webservice,还是人家tcp的写webserice,所以你们别纠结啥转发,这里没有转发。 这里只有分布执行。 就像你webservice 去请求数据库一样,你是解析指令,交个数据库执行,不是吧http soap包丢给数据库
webservice和TCP都是我们写,之所以这么做是外网到内网只能通过webservice,内网的TCPServer不只是访问后台数据库有需要和其他设备实时交互的数据,你也可以理解成经webservice传进来的数据要交到TCPServer去执行
stherix 2019-04-18
  • 打赏
  • 举报
回复
引用 7 楼 echolan 的回复:
引用
那你webservice直接保持一个tcp长连接就可以了,反正是1对1
没有这样做过,webservice本身是响应外网的调用才发起动作的,外网每调用一次都会初始化一次,要在webservice后台创建一个1对1的和内网TCPServer通信的模块,那该模块的初始化工作应该放在哪里?
TCP连接在webservice还没初始化之前就可以创建了 1对1没必要每次都进行tcp连接 只是需要一个自定义的封包格式来处理来自不同客户端的请求以及能正确识别TCP服务器发过来的信息是要返回给哪个客户端 当然如果webservice只是把数据传给tcp服务器,而不需要把tcp的数据返回给调用者,那就更简单
wanghui0380 2019-04-18
  • 打赏
  • 举报
回复
问题压根就不在上面转发的,问题在协议解析。人家的http+Soap,你要转给tcp去解析?那到底是你写webservice,还是人家tcp的写webserice,所以你们别纠结啥转发,这里没有转发。 这里只有分布执行。 就像你webservice 去请求数据库一样,你是解析指令,交个数据库执行,不是吧http soap包丢给数据库
echolan 2019-04-18
  • 打赏
  • 举报
回复
引用
那你webservice直接保持一个tcp长连接就可以了,反正是1对1
没有这样做过,webservice本身是响应外网的调用才发起动作的,外网每调用一次都会初始化一次,要在webservice后台创建一个1对1的和内网TCPServer通信的模块,那该模块的初始化工作应该放在哪里?
  • 打赏
  • 举报
回复
引用 3 楼 echolan 的回复:
[quote=引用 1 楼 胖叔叔写代码 的回复:]
引用
WebService接口将接收到的数据解析并转发到TCP服务器上,web服务器后端应采用怎样的设计才能连接到TCP Server?
很多种方式,你可以在webservice中直接在接收道消息后直接和tcp服务器通讯,也可以在接收到消息后和进程通讯后进程去和tcp通讯。
引用
可不可以通过Nginx直接实现http到TCP的转发?
不可能,可以直接转tcp但是不能转协议
webserverice收到消息后直接和TCPServer通信就是直接在webservice中开启TCP Client,这种方式似乎不太适合长连接?另外一种方式是写消息队列通信交给另外的进程去处理?[/quote] 你可以创建一个长连接,自己处理好并发和返回。你也可以做个tcp连接池,这看你自己的能力。 另一种方法消息队列、内存交互、线程交互、数据库等等很多方法都可以用。
stherix 2019-04-18
  • 打赏
  • 举报
回复
引用 4 楼 echolan 的回复:
[quote=引用 2 楼 stherix 的回复:] 为什么要用个webservice来转发tcp数据呢 任何现有的工具都不能直接把http转tcp吧,nginx也是如此
因为webservice是对外网的接口,内网数据处理是基于TCPServer的,外网数据传入内网再和TCPServer交互,webservice只是内外网之间的桥梁[/quote] 那你webservice直接保持一个tcp长连接就可以了,反正是1对1
echolan 2019-04-18
  • 打赏
  • 举报
回复
引用 2 楼 stherix 的回复:
为什么要用个webservice来转发tcp数据呢 任何现有的工具都不能直接把http转tcp吧,nginx也是如此
因为webservice是对外网的接口,内网数据处理是基于TCPServer的,外网数据传入内网再和TCPServer交互,webservice只是内外网之间的桥梁
echolan 2019-04-18
  • 打赏
  • 举报
回复
引用 1 楼 胖叔叔写代码 的回复:
引用
WebService接口将接收到的数据解析并转发到TCP服务器上,web服务器后端应采用怎样的设计才能连接到TCP Server?
很多种方式,你可以在webservice中直接在接收道消息后直接和tcp服务器通讯,也可以在接收到消息后和进程通讯后进程去和tcp通讯。
引用
可不可以通过Nginx直接实现http到TCP的转发?
不可能,可以直接转tcp但是不能转协议
webserverice收到消息后直接和TCPServer通信就是直接在webservice中开启TCP Client,这种方式似乎不太适合长连接?另外一种方式是写消息队列通信交给另外的进程去处理?
stherix 2019-04-18
  • 打赏
  • 举报
回复
为什么要用个webservice来转发tcp数据呢 任何现有的工具都不能直接把http转tcp吧,nginx也是如此
  • 打赏
  • 举报
回复
引用
WebService接口将接收到的数据解析并转发到TCP服务器上,web服务器后端应采用怎样的设计才能连接到TCP Server?
很多种方式,你可以在webservice中直接在接收道消息后直接和tcp服务器通讯,也可以在接收到消息后和进程通讯后进程去和tcp通讯。
引用
可不可以通过Nginx直接实现http到TCP的转发?
不可能,可以直接转tcp但是不能转协议
echolan 2019-04-18
  • 打赏
  • 举报
回复
引用 19 楼 wanghui0380 的回复:
这样吧,tcp部分和设备交互的部分你可以不动 让tcp部分,单独提供restfull接口(如果是net的,用nancy提供) 这样你也不用转发什么,直接restfull访问就行,webserice本身就无状态,只是定时刷。所以你没必要弄tcp长连接。 这样大家都简单,如果按你一开始的设计,弄个长连接其实更麻烦。
谢谢,这个可以试下!

13,190

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 分析与设计
社区管理员
  • 分析与设计社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧