如题。

解决方案 »

  1.   

    客户端必须主动通过 Connect 发起连接,不然就不叫 CS 模式了
    服务器端通过 Accept 接受连接后,可以通过 Send 主动发送消息
      

  2.   

    感谢!
    如果使用短连接,客户端首先CONNECT服务器端发送请求,服务器端监听创建SOCKET,读取数据,处理,将处理结果返回给客户端,然后关闭当前链接;这是短链接的做法,请问,我可以采取什么样的方式让服务器可以给客户端发送通知或消息,全部或指定的客户端?
      

  3.   

    那就用 UDP 协议吧,只要服务器保留有客户端的 IP,就可以主动发起联系并主动发送数据。但如果客户端在防火墙之后或者是动态 IP,那处理起来就要麻烦多了。参考:
    //Creates an instance of the UdpClient class with a remote host name and a port number.
    try{
         UdpClient udpClient = new UdpClient("www.contoso.com",11000);
    }
    catch (Exception e ) {
               Console.WriteLine(e.ToString());
    }
      

  4.   


    如果使用UDP通信消息,而使用TCP作为数据通信,那么,有两个问题:
    一、服务器是不是需要同时开TCP和UDP两个端口,这样做有问题吗?
    二、NAT打洞问题。如果客户端在内网通过网关连接服务器,服务器收到的地址应该就是客户端所使用的网关地址。那么,服务器向客户端发送消息时,直接向网关地址发送消息时,是不是客户端就可以收到了?
      

  5.   

    一、没有问题,都是这么做的,例如 QQ
    二、你说的做法是不可行的。我上面说过了要穿越防火墙是有点麻烦的,看看 SOCKS5 协议吧