那就用 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()); }
服务器端通过 Accept 接受连接后,可以通过 Send 主动发送消息
如果使用短连接,客户端首先CONNECT服务器端发送请求,服务器端监听创建SOCKET,读取数据,处理,将处理结果返回给客户端,然后关闭当前链接;这是短链接的做法,请问,我可以采取什么样的方式让服务器可以给客户端发送通知或消息,全部或指定的客户端?
//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());
}
如果使用UDP通信消息,而使用TCP作为数据通信,那么,有两个问题:
一、服务器是不是需要同时开TCP和UDP两个端口,这样做有问题吗?
二、NAT打洞问题。如果客户端在内网通过网关连接服务器,服务器收到的地址应该就是客户端所使用的网关地址。那么,服务器向客户端发送消息时,直接向网关地址发送消息时,是不是客户端就可以收到了?
二、你说的做法是不可行的。我上面说过了要穿越防火墙是有点麻烦的,看看 SOCKS5 协议吧