当我还是大一学生的时候,我就开始尝试用 C 语言进行网络编程。你知道的,bind、recv、send 以及所有这些东西。
我拿出从图书馆借来的一本书,按照书上的说明,一行一行地输入到电脑里,成功编写了一个可以发送和接收消息的TCP服务器和客户端。
但是客户端和控制端都是在自己的电脑上运行的,自己发信息太无聊了,于是我把客户端发给了室友,这样我们就可以跨电脑通讯了。
于是我们开始在那个黑色的控制台窗口聊天。虽然他就在我对面,交流只是短信,如此简单,但室友还是夸我厉害,让我很有成就感。原来网络编程这么有趣。
操作成功之后,晚上和室友们玩了几局穿越火线,开心极了~
第二天,我就开始想着把这个客户端发给2公里外的女朋友,这样晚上我们在各自的宿舍里聊天,想想都觉得挺浪漫的。
没想到一下子就被鄙视了,就这点黑乎乎的玩意儿?界面就不能弄得漂亮点吗?
是啊,这玩意儿实在是太不象样了,至少要像QQ一样,有聊天界面,有发送按钮,要是还能发图片就更好了。
于是我又花了一周时间,用 VC++ 做了一个简单的界面。我还从网上找了一个漂亮的皮肤,把它加进去。现在看起来好多了。
我兴奋地把程序发给了女朋友,期待着她欣赏的目光。
但...
她居然在QQ上告诉我:弹出无法连接服务器的窗口!
我的服务器已经开放,但是就是无法连接。
我很快就冷静了下来,老师教过我,可以用ping命令来检查网络是否通畅。
我使用QQ远程控制桌面,并从她的电脑ping我的电脑:
ping 192.168.1.103
哇!我无法 ping 通它!
我胆怯地向有经验的前辈求助,结果又被白眼:能ping通才奇怪啊,这是一个局域网地址啊!
我很困惑。什么是 LAN 地址?为什么我无法 ping 通它?
那时我才刚刚学会C语言,刚刚开始上计算机网络课程,用菜鸟来形容自己一点也不为过。
于是我开始疯狂充电,然后我才知道什么是公网地址和私网地址,还知道了宿舍里的路由器有个功能叫NAT,会偷偷把我们电脑的私网地址改成公网地址,一出宿舍就用公网地址通讯。
NAT的出现缓解了IP地址不足的问题,使得我们宿舍几个人可以共用同一个IP地址上网。
现在看来这是一项简单的技术,但当时我却不知道,因此出了丑。
于是我找到路由器上WLAN口的公网IP地址,替换客户端代码中的服务器地址,重新编译一个包发给了女友。
现在应该没问题了,对吧?
但是,它仍然不起作用!
我想每个看到的人心里都会说:这要是能用才怪呢!
是的,虽然已经改成公网地址了,但是路由器还没有配置转发。
折腾了好久,最后还是学会了一种叫UPnP的东西,需要在路由器上配置端口转发,把公网IP下的端口号映射到局域网下某个地址的端口上,这样有公网IP地址的路由器收到后就会把连接转发到我电脑上的服务器上。
我登录了路由器后端,映射了我的服务器正在监听的端口号,迫不及待地想让我的女朋友再试一次!
终于,这次她告诉我:接通了!
最后我给她发了第一条信息:Hello, World!
心情好,午餐加点肉吧~
使用IP地址来建立连接终究不是一个好主意,因为路由器上的公网IP经常会变,每次变都要重新编译一次客户端,比较麻烦。
不然每次都要我手动输入,可我总不能每次都留一个输入框让女朋友填写IP地址吧,她肯定会问我:我登录QQ的时候怎么没有填写QQ的IP地址呢?
于是又去搜索,发现用域名代替IP可以解决这个问题。
在程序代码中将IP替换为域名,然后动态解析为IP地址,服务器IP地址不再需要硬编码到代码中。
但问题来了,这么没用的东西,为什么要注册域名呢?注册域名不是要花钱吗?
公网IP地址经常变化,难道每次变化都要修改域名映射的IP地址吗?真是麻烦啊!
又研究了一段时间,知道了一个叫DDNS动态域名解析的东西,还有一个叫花生壳的软件,下载了一个客户端,很显然解决了我所有的问题。
不需要自己去注册域名,直接使用花生壳下的子域名就可以,通过客户端可以随时更换域名映射的IP地址,方便快捷。
我再次更改了程序,终于解决了问题。
但很快又出现了一个新问题,我的程序只能允许服务器和客户端之间进行通信,如果第三人或第四人想加入怎么办?
繼續改變!
我们回到今天本文的主题。
经常有人在微信上问我:轩辕,我怎么才能学xxx?我是初学者,还有机会吗?
其实,谁没有从零开始呢?谁在学习的路上没有被人瞧不起、被人出丑呢?俗话说,每个人学习的方式不同,专攻的领域也不同。仅此而已。
从我自己的学习经历来看,如果你想学好技术,仅仅阅读课程和书籍是不够的,你必须亲自动手!
当你真正做一些项目,遇到实际问题的时候,你就会明白各种技术意味着什么,用来解决什么问题,这比你从书本或博客上学到的理解要深刻得多。
工作几年之后发现,大学那几年是我积累最基础知识的时期,工作之后日常工作中和操作系统、计算机网络、数据结构、算法等基础课程知识打交道的机会并不多,更多的时间都花在写API接口,做CRUD,堆砌一堆框架代码块,或者学习如何使用redis,mysql等第三方组件上。
我在大学期间做过以下项目:
-即时通讯应用程序
-静态Web服务器
-远程桌面控制软件
-网络流量修复软件
- 内核ARK工具
虽然每一个都看上去比较粗糙,距离实用还差得很远,但基本的功能已经完成了。而且通过这些东西的开发,不仅让我当时的编程能力提高了不少,在这个过程中,也不断的发现新的技术术语,打下了扎实的基础,学到了很多课本上没有的东西。
如果你是行业新手,我的建议是,你不仅要读书,还要多做实践。光说不练没用,直接上代码吧!
题外话,鸟哥是个喜欢捣鼓的程序员,闲暇时喜欢开发自己的网站、小程序、APP等等,而这些东西都离不开服务器!最近围绕服务器主题建了一个微信群,喜欢玩服务器或者想自己开发一个产品的读者可以进群互相学习!群通知里分享了一套搭建服务器的视频教程给大家,很适合新手学习!不定期还会带大家去领一些服务器相关的优惠券!如果你没兴趣,又不喜欢捣鼓,就没必要进群了!
识别二维码并添加微信后
发送[]获取邀请链接
扫一扫在手机端查看
我们凭借多年的网站建设经验,坚持以“帮助中小企业实现网络营销化”为宗旨,累计为4000多家客户提供品质建站服务,得到了客户的一致好评。如果您有网站建设、网站改版、域名注册、主机空间、手机网站建设、网站备案等方面的需求,请立即点击咨询我们或拨打咨询热线: 13761152229,我们会详细为你一一解答你心中的疑难。