大一的时候就开始接触C语言的网络编程,socket,bind,listen,accpet,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、rabbitmq、elasticsearch等第三方组件上。
我在大学期间做过以下项目:
- 即时通讯应用程序
-静态Web服务器
-远程桌面控制软件
-网络流量修复软件
-Windows 内核 ARK 工具
虽然每一个都看上去比较粗糙,距离实用还差得很远,但基本的功能已经完成了。而且通过这些东西的开发,不仅让我当时的编程能力提高了不少,在这个过程中,也不断的发现新的技术术语,打下了扎实的基础新花生壳动态域名解析软件,学到了很多课本上没有的东西。
如果你是行业新手,我的建议是,你不仅要读书,还要多做实践。光说不练没用,直接上代码吧!