当前位置: 代码迷 >> C# >> 服务器端如何给客户端群发通知 C# SOCKET TCP
  详细解决方案

服务器端如何给客户端群发通知 C# SOCKET TCP

热度:23   发布时间:2016-05-05 04:13:15.0
服务器端怎么给客户端群发通知 C# SOCKET TCP
如题:
      当前实现了,客户机给服务机发消息,服务器回应消息.
     如何实现服务器给所有客户机发通知消息?
------解决思路----------------------
........既然客户端和服务器已经连接上了 那么服务器端就有了 每个客户端的SOCKET对象 ,把这些对象存起来,循环发送就是!


LZ上你的代码吧 我给你说说
------解决思路----------------------
UDP 广播,当然这需要客户端侦听广播口

网段的最后一个地址就是广播地址,端口自行商定
------解决思路----------------------
客户端通常在 NAT 路由器后边,而且通常在“多层”交换机后边。因此服务器不可能访问客户端。

要推送消息,首先需要客户端连接服务器,然后保持长连接。任何保持长连接的方式都是可以考虑的。实际上 WebSocket 也是长连接的,所以现在即使是网页也是可以随时得到服务器推送消息的(尽管大多数程序员还需要等着别人把技术“喂到嘴边”才采纳)。


------解决思路----------------------
要注意“组播”只是在局域网同一个网段内。所以如果没有特别的说明是要求组播时,不要考虑这些。
------解决思路----------------------
循环就行了....

当你每个客户端执行到BeginAccept的时候  就有一个socket对象.

然后你把这个对象装到集合中..

divt<string,socket>其中string表示ip:port

因为是tcp所以他们一直存在 有100个tcp_client 这个集合就有100个

循环value.send就行了
------解决思路----------------------
客户端关闭tcp之后 服务器会收到信息的..

这个时候还是有一个socket对象..

或者 你服务端在catch里 可以捕获客户端掉线..

那么 你在把dict里面的这个掉线的移除..

保证list中 只是在线的tcp集合就可以了.
------解决思路----------------------
引用:
感谢:代码大致如下.
服务端:
            TcpListener listener=new TcpListerer(本机IP,端口30);
            listener.start();
            listener.BeginAcceptTcpClient(callback);异步等待监听
            回调函数:callback(IAsyncResult handler)
                              TcpClient client = this.EndAcceptTcpClient(handler);// 客户端对象
                               NetworkStream stream = client.GetStream();// 获得流 准备传输数据
                               stream.BeginRead(异步读取回调函数);// 开始异步读取
                               继续异步监听listener.BeginAcceptTcpClient(callback)
             异步读取回调函数:callback()
                                              EndRead();//结束异步读取
                                              stream.BeginRead();// 再次开始异步
大概是这样,怎么给客户机主动发消息?

Quote: 引用:

........既然客户端和服务器已经连接上了 那么服务器端就有了 每个客户端的SOCKET对象 ,把这些对象存起来,循环发送就是!


LZ上你的代码吧 我给你说说


引用:
感谢:代码大致如下.
服务端:
            TcpListener listener=new TcpListerer(本机IP,端口30);
            listener.start();
            listener.BeginAcceptTcpClient(callback);异步等待监听
            回调函数:callback(IAsyncResult handler)
                              TcpClient client = this.EndAcceptTcpClient(handler);// 客户端对象
                               NetworkStream stream = client.GetStream();// 获得流 准备传输数据
                               stream.BeginRead(异步读取回调函数);// 开始异步读取
                               继续异步监听listener.BeginAcceptTcpClient(callback)
             异步读取回调函数:callback()
                                              EndRead();//结束异步读取
                                              stream.BeginRead();// 再次开始异步
大概是这样,怎么给客户机主动发消息?

Quote: 引用:

........既然客户端和服务器已经连接上了 那么服务器端就有了 每个客户端的SOCKET对象 ,把这些对象存起来,循环发送就是!


LZ上你的代码吧 我给你说说



  TcpClient client = this.EndAcceptTcpClient(handler);/
把这个client 存到字典中,然后循环发送就这个字典Dictionary
 服务器端有Send方法 直接把client 循环出来
------解决思路----------------------
引用:
您好..我还是使用的你那个帖子的代码,整个过程依然没完全搞弄,不知道用你那个代码可否实现给客户机群发?


它完成了客户端连接服务器、保持长连接、双向通讯。
  相关解决方案