GOLANG TCP发送问题

o0King0o · 2018-01-06 14:35:49 · 1763 次点击 · 大约8小时之前 开始浏览    置顶
这是一个创建于 2018-01-06 14:35:49 的主题,其中的信息可能已经有所发展或是发生改变。

1、如何把net.Conn 保存在redis里? 因为现在我有个tcp服务端,给设备去用的,部署了分布式,所以设置连接服务器 是随机的 可能是A服务器 可能是B服务器 然后我之前是把conn保存在map里的 但是 这样A服务器跟B服务器 map不能相互读到

我的一个流程是 设备通过TCP连接到我的服务器 假设端口为8081 我的App也长连接我的服务器 8081 只是发送的内容不一样,我需要的是当我app发送一条指令 能发给指定设备。

求大神们 帮帮忙 或者有好的方法


有疑问加站长微信联系(非本文作者)

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

1763 次点击  
加入收藏 微博
7 回复  |  直到 2018-01-06 20:40:02
channel
channel · #1 · 7年之前

每个连接建立时,给它分配一个唯一标识,通过这个标识来区分连接

o0King0o
o0King0o · #2 · 7年之前

问题是标识我是可以做 现在就是用map来保存这些连接 tcp句柄的 但是服务器不同 好比我APP端请求服务器要求设备告诉我数据,app发送消息给服务器 ,服务器再发给设备 ,设备收到回应后 返回数据时跑到了另一台服务器

channel
channel · #3 · 7年之前

那你就把标识和服务器映射关系存在 redis 中,然后通过标识可以反查出哪个服务器了

o0King0o
o0King0o · #4 · 7年之前

就不能把net.Conn 这个对象保存在一个公共的地方吗 因为我这边设备是希望不跟我redis链接的

channel
channel · #5 · 7年之前

net.Conn 是一个接口,你存入到当前进程之外,涉及到序列化的问题;你怎么序列化这个接口啊~

kaneg
kaneg · #6 · 7年之前

网络连接是不可序列化的,原因也很简单,网络连接底层是TCP/IP,需要网络两端实时保持连接状态,一旦状态发送变化,连接就断开了。你只能把这些连接保存在连接所在服务器的内存中,然后还得注意保存心跳,放在连接失效断开。然后在需要的时候拿出来继续使用,当然该连接如果还活着的话。

marlonche
marlonche · #7 · 7年之前
o0King0oo0King0o #4 回复

就不能把net.Conn 这个对象保存在一个公共的地方吗 因为我这边设备是希望不跟我redis链接的

像channel说的,将设备ID和连接的服务器地址关联起来存到所有服务器都能访问到的Redis里面,当某台服务器收到某个app连接发来的请求时,先看请求里面的设备ID在不在本进程的设备ID和Conn对象关联的map里面,不在的话查Redis获取设备ID对应的服务器地址,然后将请求转发给该服务器处理,HTTP,grpc都可以

添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传