C# Socket服务端发送消息给客户端

HAUGHLIZARD 2018-02-09 03:51:32
需求是这样的:C# 实现Socket服务端,将从别的方法得到的字节数组传到客户端,如何实现?
...全文
801 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
xuzuning 2018-02-09
  • 打赏
  • 举报
回复
其实原因很简单,不是技术上不能实现,而是服务端根本不知道客户端在哪里 在 IPv4 世界里,由于 ip 资源稀缺,只能将一群群的设备用路由器限定起来,形成局部网络,网内所有设备共用一个外部网络ip。这样的一层层包装,就造成从外部不能访问到内部具体的设备 而到了空气中每粒灰尘都可以有一个 ip 的 ipv6 时代,情况就大大改观了,没有了路由器的约束(cisco 该倒闭了),你的愿望就能打成了(虽然我还不知道 ipv6 对全双工是如何定义的)
  • 打赏
  • 举报
回复
只要连接上,并且长连接,那么无所谓客户端发起还是服务器发起请求,其实是双向的。 但是一般来说,我们设计信令协议时,可以假设服务器仅仅给客户端 push 一个简单的提醒,剩下的所有请求都是 client 发起而服务器应答的,这其实也已经能够做到即时通讯了。 比如说当服务器发现某个商品仓库缺货了,它可能查找当前正在连接的各个client 中的供应商信息,然后给相关的10个供应商 push 一个预定义的事件消息。然后这10个供应商 client 就会发起一个正式的查询请求来进一步获得到此商品的库存的详细信息(比如说要求的成本范围和采购数量)来开始报价流程。 服务通常主动给客户端推送一个简单的提醒信息就足够了。
  • 打赏
  • 举报
回复
说具体一点,那么 c/s 形式网络都是首先要 client 连上 server,只要连接成功,那么你的通讯信令协议就表示你自己的业务逻辑。 比如说我收到信息
{
  Id : 2834,
  Mode: 0,
  Type: "查询当日的新闻",
  News: {
      Channel: "餐饮",
      Date: "2018/2/9"
  }
}
这里假设 Mode 为 0 代表对方发给我的请求,为 1 表示对方返回给我的结果,那么当我收到为 0 的消息,解析这个消息,返回一个 Id 为 2834 而 Mode 为 1 的消息给都对方。而假设我收到的这个消息的 Mode 为 1,那么我就要按照 2834 这个编号找到我之前注册的回调委托,用这个委托来处理这个消息。 因此,推送请求消息或者处理返回信息,都是普通的发送接收消息操作的升华。主要是你要自己写上几十行代码来实现这关键的引擎逻辑。比如说一个客户端分别按照编号 1、2、3、4、5 的顺序给客户端发送了消息,服务器随后可能以 1、4、3、5、2 的顺序返回结果信息(绝大多数任务处理只要几十毫秒,但是有的任务处理可能要几分钟),中间还时不时地主动推送 Mode 为 2 的 Push 提醒,那么你起码要有这样的功能,才算是一个完整而基本的通讯网关。
xuzuning 2018-02-09
  • 打赏
  • 举报
回复
长连接也需要客户端主动与服务端建立,依然做不到 服务端发送消息给客户端,还是应答
  • 打赏
  • 举报
回复
客户端渔与服务器要建立长连接,比如说网页常用 websocket 方式与服务器长连接,这样就能像QQ、微信一样随时给客户端推送消息了。
xuzuning 2018-02-09
  • 打赏
  • 举报
回复
不可以,只能是客户端发出请求,服务器做出应答
大鱼> 2018-02-09
  • 打赏
  • 举报
回复
试试HPSocket

110,538

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

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