这段时间把以前做的一个linux通信软件——山寨版的QQ,一般这么简单的做一个聊天软件之后都会称之为局域网聊天工具,那么应该也能进行外网访问。一段时间后思考,又不一样的思路。
因为最近公司的项目跟智能家居有关,产品已经可以通过局域网的手机登客户端控制,想到了远程控制,这样智能家居的控制就算完整了。可以在公司就可以操控家里的设备,这样就需要有一个服务器,最好连在外网,申请一个固定IP,不同局域网的客户端的设备可以固定连接IP地址,比较简单。也可以域名化,像百度等一个域名就可以进入了。
局域网内可以通过一个服务器端来完成客户端通信的实现。那么可不可以由一个内网访问到一个外网,然后再由外网访问到内网呢?
首先看一张图,软件在局域网内进行通信的示意图,网上下载:
这样客户端发送消息到服务器,然后服务器把消息转发到指定的客户端,这里客户端和服务器属于同一局域网,因此理解起来没有什么问题。这里需要考虑一下socket,这是进行消息转发的核心。需要注意的是如果这里面的所有客户端都是外网地址的话也是可以进行通信的,因为都是直接相连的。
然后看一下通过外网通信的示意图:
这样内网用户A首先登陆,这样呢就在外网服务器上建立了一个socket连接,然后每次进行通信的时候外网都会通过这个socket来发送消息。就是这样,外网和内网直接进行了通信,其核心也就是socket。
网上问qq的通信是如何进行的,有人回复说通过查找路由表,找到地址,感觉有点道理,也就是相当于服务器的转发了。
至于socket服务器放在内网内,这样就不必申请固定IP地址,对于公司来可以省钱,不必给固定IP的年费。公司经理想这么干,说什么可以公司的IP可以转化一个固定域名,进而可以连接上,虽然讲得有点道理,但也不知道对不对。思考了一段时间,有点小收获,和一个做路由器开发的同学聊了聊,貌似没那么简单。有时间的话写个代码试一试。