服务器有公网 IP ,客户端通过路由器拨号上网,使用静态的 IP 地址,现在客户端要和服务器通信,要求能发送信息到服务器,并且要能接收到服务器发来的信息,用 Socket 怎么实现? 我在网上找到两种说法: 1.客户端先发起 Socket 链接,只要不断开,两边都可以互相通信。 2.需要在客户端链接的路由器进行端口映射,即路由器指定一个端口,只要这个端口收到的信息都发回到指定客户机。 我的问题是: 1.第一种说法是对的么? 2.第二种的 Socket 和第一种有什么区别? 3.还有更简单的么?
1
hpeng 2016-04-19 00:06:35 +08:00 via iPhone 1
1 讲道理, socket server 应该放在服务端,是服务端等客户端链接。然后自己解析流。
2 这两个不是一个东西。那个叫 DMZ 。 3 有,用上层的 http 。 |
2
ColorfulNight OP @hpeng 意思就是两边都有 Socket 嘛,服务器是一直运行着 Socket 等待客户端发来请求,然后就可以一直通信,不需要调试路由器了,我这样理解对嘛?
|
4
ColorfulNight OP @Marfal 这些技术都有看到,似乎都可以,还有个 NAT ?
|
5
pimin 2016-04-19 00:56:26 +08:00 1
@ColorfulNight
1.是对的 确实不用调试路由了 实际上工作是路由自动完成的 因为这就是路由的基本功能 消息的分发 即便两台都是在 Internet 上暴露的主机,互相发送消息也要经过运营商骨干网的 N 多路由,并不是想象的直连. 2.第二种和第一种在你这个场景里没有区别 如果做了映射,客户端和服务端的角色可以做调换 主要好处是任意一方都可以主动连接另外一方 缺点嘛就是安全 3.最简单的就是把双方用一根网线连起来,不用路由,直连. |
6
Starduster 2016-04-19 02:29:23 +08:00 1
@ColorfulNight
NAT 是网络地址转换,简单的说和 DMZ 也好 UPnP 也好是不同的东西, 举个例子, 本地 192.168.1.102 —(路由器 NAT )— 运营商给你的内网 IP 地址如 10.1.1.100 —(运营商 NAT )—公网出口如 182.138.98.37 。 这个过程叫网络地址转换,运营商使用这个技术主要目的是节省 IPV4 地址,也使得内网设备对外不可见,引起的一个问题是你无法主动连接一个在 NAT 内部的主机,比如 Internet 上的其他人不能穿过路由器直接和你路由器下 192.168.1.102 的主机进行通信,那么 DMZ 或者端口转发这样的技术可以用来解决这个问题,你说的 2 实际上就是这种东西 |