Amy Blog

网络库的起源

网络库的起源

本篇介绍一下netsend网络库的起源,这个网络库只是起源于本人觉得好玩,而且很简单的一个需求.

而在后续的开发中,因为不断加入新的需求,从而慢慢变样.

接下来会变成什么样呢?我也不知道,也许等我不再开发了,才会不再改变.

操作系统的变迁

本人因为从事嵌入式的工作,大部分时间都在linux上开发,而且很多嵌入式的固件都是在linux下才能成功编译,要想在windows下编译,只能安装一个虚拟机,在虚拟机里安装一个ubuntu,才能进行开发.

在某天我从梦中醒来,发觉windows与linux的互操作性实在浪费时间,而且虚拟机里的性能实在比不上真机linux,不如把自己的主机也变为linux?

说干就干,把工作电脑操作系统格掉了,只安装一个linux系统.

用了一段时间后,发觉这个主意真是不错,编译速度大大加快,而要在工作中与别人联系,只要安装一个虚拟机,虚拟机里安装一个winxp.里面安装上QQ,微信.

对于别人来说,windows为宿主,linux为辅;

而对于我来说,linux为宿主,windows为辅.

这种主辅的选择,端看你的用途,有的人工作大多为windows为主,为了加快速度,自然以windows为主,linux为辅.

而对于我来说,大部分工作都在linux上,何必以windows为主呢?


随着对linux系统更加深入的了解, 我对家庭内的电脑作了一番评估,其实也可以把操作系统切为linux,唯一让我选择windows的原因,也许只剩下游戏了,而随着电脑硬件速度的增加,现在的虚拟机内跑windows,也能很好地进行游戏玩耍,因为根本就没必要选择windows为主力.

因此,某个周末,我把家里的电脑,笔记本,都切换为linux系统了.

切换后发觉在家里设备的互操作性都大大提高.

原来的NAS是我用archlinux搭建的一个文件共享系统,使用samba给其他windows共享文件. 然而因为学艺不精,对windows不甚了解,发现有些设备可以访问,有些设备则不可访问.

而自从把所有的设备都切换为linux后,根本就用不着samba服务,只要用ssh自带的sftp即可完成分享功能.

网络库初版的目的

NAS里存储了很多电影,某天想投屏到另外一台电脑上观影. 而且,因为家里的电脑都是linux系统,要找的方案都是在Linux下的了.

设备的投屏,一般使用的是DLNA.之前也有从事过DLNA的工作,然而现在DLNA的组织已经解散.

在linux系统里,有一个 gmediarender 项目,使用gstreamer框架来实现投屏播放, 然而这个库好像已经很久没有更新了.

想到现在投屏的场景,除了DLNA外,也没发现有什么其他方案. 是不是可以自己写一个投屏的应用? 而且,感觉也不会需要花多长时间.

结果,花了半个月时间,在工作之余写了一个工作在UDP协议下的投屏应用:

git@github.com:amylao82/simplecast.git

复盘

在此应用程序之前,我接触到的网络应用协议,大多是比较高层的协议,比如视频传输,有rtp/rtcp, rtsp; 网页流直播,使用hls; 网络推流,有rtmp; 因此,对于基本的TCP/UDP编程甚为不喜,认为应该用一些高层库来实现,以加快开发进度.

在这里我要向我的同事道歉,之前我以这样的成见对他大放厥词,后来到由我负责网络部分时,才发现他的观点是正确的. 一般的网络开发,都绕不开TCP/UDP开发.

然而在实际工作中,发现有时候还是要写基于TCP/UDP的应用协议.比如,我在工作时,要从设备里传输一张图片到电脑端,这样上面的流式协议便不适用,如果要引入一个ftp服务,好像又有点小题大作. 这张相片是由摄像头实时生成,如果通过ftp,需要生成文件,才能对外提供下载链接,这就要有写磁盘操作.后期的过期文件清理,也需要做.而如果是自己写TCP协议,则这个图片不必要写磁盘,直接与电脑客户端通信,在内存中即可把图片传输完成.

这个simplecast写完后, 我进一步思考,这样共性的东西是否可以抽出来,形成一个自己使用的网络库,以后在其他类似的程序开发中可以重复利用,也可以减少自己的开发工作量.

在复盘的过程中,发现在工作中经常要用到网络通信,虽然不是什么高深的应用,但是基本的通信功能还是要有.

因此,这个netsend库就这样诞生了.