计算机通信的一点疑问

2016-04-18 23:53:18 +08:00
 ColorfulNight

服务器有公网 IP ,客户端通过路由器拨号上网,使用静态的 IP 地址,现在客户端要和服务器通信,要求能发送信息到服务器,并且要能接收到服务器发来的信息,用 Socket 怎么实现? 我在网上找到两种说法: 1.客户端先发起 Socket 链接,只要不断开,两边都可以互相通信。 2.需要在客户端链接的路由器进行端口映射,即路由器指定一个端口,只要这个端口收到的信息都发回到指定客户机。 我的问题是: 1.第一种说法是对的么? 2.第二种的 Socket 和第一种有什么区别? 3.还有更简单的么?

2562 次点击
所在节点    Java
6 条回复
hpeng
2016-04-19 00:06:35 +08:00
1 讲道理, socket server 应该放在服务端,是服务端等客户端链接。然后自己解析流。
2 这两个不是一个东西。那个叫 DMZ 。
3 有,用上层的 http 。
ColorfulNight
2016-04-19 00:41:54 +08:00
@hpeng 意思就是两边都有 Socket 嘛,服务器是一直运行着 Socket 等待客户端发来请求,然后就可以一直通信,不需要调试路由器了,我这样理解对嘛?
Marfal
2016-04-19 00:50:57 +08:00
@hpeng 好像不叫 DMZ 吧,叫 UPnP
ColorfulNight
2016-04-19 00:53:28 +08:00
@Marfal 这些技术都有看到,似乎都可以,还有个 NAT ?
pimin
2016-04-19 00:56:26 +08:00
@ColorfulNight
1.是对的
确实不用调试路由了
实际上工作是路由自动完成的
因为这就是路由的基本功能
消息的分发
即便两台都是在 Internet 上暴露的主机,互相发送消息也要经过运营商骨干网的 N 多路由,并不是想象的直连.

2.第二种和第一种在你这个场景里没有区别
如果做了映射,客户端和服务端的角色可以做调换
主要好处是任意一方都可以主动连接另外一方
缺点嘛就是安全

3.最简单的就是把双方用一根网线连起来,不用路由,直连.
Starduster
2016-04-19 02:29:23 +08:00
@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 实际上就是这种东西

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/272114

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX