如何学习网络编程?这是我的经验之谈,我从来就没有系统的学习过网络编程(非科班么),学习过程中走了不少弯路。最近在读经典的《Linux程序设计(第3版)》,第十五章讲的是套接字Socket编程,读完之后,产生了一些想法,觉得有必要写下来。

学习网络编程我遇到的主要两个困惑是:  
    第一:计算机网络中的一个个协议都是抽象的,怎么和具体实际结合起来呢?   
    第二:知道了socket编程的一般步骤后,如何能够写成复杂的服务器程序?(如Web服务器)

我的学习过程是这样子的: 
  ●先是利用WinInet函数库写了几个简单的网络应用程序:简易登录、查询新书RSS等;了解了HTTP协议的一些内容。  
  ●后来又看了孙鑫的VC视频教程, ,虽然照着视频能够写出实例代码来,但是仅仅是会用,其中很多原理都不理解,比如说WSA开头的异步函数,Winsock2对socket的一些增强或者改进等。

●后来是一边上《计算机网络》的课,一边读《C++网络编程》。通过计算机网络课我知道了所谓的协议分析是怎么一回事情,通过wireshark抓包分析,“协议”就如同这个词本身意思是一样的,是通信过程中的一种约定,规定了数据包中的每个或每几个字节代表了什么意思;

●至于《C++网络编程》,十分惭愧,我最大的收获不是如何进行网络编程,而是ACE框架的设计原则,通过实际的例子明白了设计模式是怎么一回事情,可以去我的豆瓣书评 看看。  
  
● 再后来,偶然的发现了《计算机网络高级编程技术》,我初略的翻了翻,看到里面的基础、提高、综合训练篇、突然反应过来:socket和操作系统提供的系统调用,基本上都是C语言接口的,协议字段的具体表现,不就是用结构体吗?协议中的几个字节代表什么与C语言基本数据类型就能对应了起来(-_-!这是缺少实践造成的迟钝啊)。

●再后来,了解了下Boost.asio,Java的MINA框架,这些都是异步I/O前摄器模式的实现,当然还有ACE_Proactor

●再后来由于参加比赛的需要,飞快的阅读了《深入理解MySQL核心技术》和Linux程序设计(第3版)》,就这样从把整个知识体系都联系起来,从socket到完整网络服务器程序,我的网络编程才算正式进入了门道。

所以,正常的学习路径应该是:C/C++语言 -->>计算机网络 -->>协议分析 -->>BSD Socket、OS API ( fork()、pthread_create()、select() ) -->>Reactor、Proactor模式

在这个过程我的体会是,最好是从Linux下或者Unix底下学习,比起Windows,Linux的编程接口设计更很简洁,使用的基本上都是标准的数据类型,很多源代码是开放的,而且我比较习惯于看小写的英文单词。。。我发现,如果最一开始能够从整体上了解网络编程的全景,就会知道应该学习什么,下一步该学什么,循序渐进才是好的学习方法。

我所理解的“全景”:

--计算机网络种类有很多种:ATM、X.25、Internet(大大小小的局域网互联而成,以太网、令牌网等等)

---- Internet通信的协议也有很多种,其中最核心的是TCP/IP协议

---- 网络编程接口也有很多种,BSD UNIX提出了socket,是一种通信机制,是管道概念的扩展

-------- socket有三种属性:域(或协议族)、类型、协议

-------- 最常用的协议族有AF_UNIX和AF_INET(对应现在的Internet),AF_INET的类型又有两种:数据流(tcp)和数据报 (udp)

------------ 在<sys/types.h>和<sys/socket.h>定义了socket编程的系统调用:socket()、struct sockaddr、bind()、listen()、accept()、connect()、close()、sendto()、recvfrom()

------------ 其中bind()是用来给创建的socket命名的,如果是AF_UNIX会关联到文件系统的一个路径上,如果是AF_INET则会绑定到IP的端口号上;listen()用来保存未处理的客户请求的队列;accept()等待客户端的连接,会创建新的socket用来处理客户端连接。

------------ 由于历史原因,不同的计算机使用不同的字节序来表示整数,Intel和Motorola的处理器的字节序就不一样,所以要转换为网络序(好像Unicode中的Little-Endian、Big-Endian也是这么个情况。。)

------------ 服务器必然为多客户服务的,为了提高运行效率,高效利用系统资源,就出现多进程、多线程的服务端程序,这就需要用到fork()和pthread_create()了,再往下就是select()、pull()等多路复用和异步I/O机制了。

----------------为了简化网络应用程序的开发,增加代码的复用性、扩展性、可谓性;出现了Reacotr、Preactor等设计模式,出现了ACE、Boost.asio等框架、进一步简化网络开发的难度,出现了WinInet、libcurl这样的面向应用层的函数库。

最后我试着回答最开始的两个问题:

第一:描述协议基本上是C/C++中的结构体、协议中规定的多少字节代表什么,对应中C/C++中的标准数据类型。这是因为操作系统基本上都是用C语言编写的,提供的接口也是C语言的接口。上层的一些协议如HTTP、SOAP、XMPP基本上纯文本的,字符串就能表示。

第二:复杂的服务器程序复杂之处在于对高性能、执行效率的要求,这就需要利用操作系统提供的一些机制,比如多进程、多线程、原生支持的异步I/O机制。针对软件开发的复用性等要求,需要利用面向对象的设计思想,分层的思想、设计模式等。

====================================================================================

ps:说实话,自己不是太懂得怎么学习网络编程的,只是接触过socket套接字,而且不知道怎么与网络协议联系起来,看了这篇文章,大致了解了一些。要学习的话,还是先以linux下的为主,window的东西太多坑。

浅谈如何学习网络编程相关推荐

  1. 浅谈如何学习深度学习(经验之谈,仅供参考)

    浅谈如何学习深度学习 方向 书籍 视频 方向 首先,要选择一个感兴趣的方向,或者说是将深度学习与自己的专业.学校的优势学科相结合. 计算机视觉(数字图像处理.图像分类.目标检测.图像语义分割.目标跟踪 ...

  2. 手把手教你学习网络编程(1)

    手把手教你学习网络编程(1) 目录: 1) 什么是套接字? 2) Internet 套接字的两种类型 3) 网络理论 4) 结构体 5) 本机转换 6) IP 地址和如何处理它们 7) socket( ...

  3. 小学教育如何利用计算机思维,浅谈如何在中小学编程教学中培养学生的计算思维...

    浅谈如何在中小学编程教学中培养学生的计算思维 伍成伟 四川省 泸县二中城西学校 四川 泸州 646100 摘要:思维是人类所具有的高级认识活动,思维是人对外界输入信息与脑内储存知识经验进行一系列复杂的 ...

  4. 浅谈深度学习:LSTM对股票的收益进行预测(Sequential 序贯模型,Keras实现)

    浅谈深度学习:LSTM对股票的收益进行预测(Sequential 序贯模型,Keras实现) 总包含文章: 一个完整的机器学习模型的流程 浅谈深度学习:了解RNN和构建并预测 浅谈深度学习:基于对LS ...

  5. 浅谈深度学习:基于对LSTM项目`LSTM Neural Network for Time Series Prediction`的理解与回顾

    浅谈深度学习:基于对LSTM项目LSTM Neural Network for Time Series Prediction的理解与回顾#### 总包含文章: 一个完整的机器学习模型的流程 浅谈深度学 ...

  6. 嵌入式AI —— 6. 为糖葫芦加糖,浅谈深度学习中的数据增广

    没有读过本系列前几期文章的朋友,需要先回顾下已发表的文章: 开篇大吉 集成AI模块到系统中 模型的部署 CMSIS-NN介绍 从穿糖葫芦到织深度神经网络 又和大家见面了,上次本程序猿介绍了CMSIS- ...

  7. 浅谈深度学习的基础——神经网络算法(科普)

    浅谈深度学习的基础--神经网络算法(科普) 神经网络算法是一门重要的机器学习技术.它是目前最为火热的研究方向--深度学习的基础.学习神经网络不仅可以让你掌握一门强大的机器学习方法,同时也可以更好地帮助 ...

  8. 将继续深入学习网络编程

    一段时间了,已经可以熟练在Java使用Socket和nio编写服务器应用程序,对一些流行的nio应用框架也有了较深的了解,也自己做了一些实现,并且应用到实践中去. 我想,我需要从三个方面继续深入学习网 ...

  9. shell for循环1到100_浅谈Linux下shell 编程的for循环常用的6种结构

    浅谈Linux下shell 编程的for循环常用的6种结构 1. 常用for循环结构 (1) for 变量 in 值1 值2 值3... do 程序块儿 done (2) for 变量 in `命令` ...

  10. 车载网络与计算机网络有什么不同,浅谈汽车车载网络的应用

    浅谈汽车车载网络的应用 作者:段春艳 出处:论文网 时间:2007-01-10 摘 要:车载网络是现代汽车电子技术发展的必然趋势,本文就车载网络形成的必要性及其应用进行了系统地分析,以便更好地理解新一 ...

最新文章

  1. 改进粒子群优化算法(IWAPSO)的MATLAB源程序
  2. libsvm java api文档_libsvm-javaAPI
  3. LeetCode Valid Parentheses(判断括号是否匹配)
  4. 怎么在坐标上面找outliner的异常检测方法,非监督学习
  5. shortcut icon 修改浏览器标签网站图标
  6. 计算机c盘哪些东西可以清理,细说电脑c盘哪些文件可以删除
  7. OpenCV imread()函数
  8. Access is denied
  9. c#里有遍历目录及子目录以树的形式展现
  10. 电源管理与驱动设计笔记
  11. 使用NHibernate, Oracle Clob/NClob无法插入
  12. 【BZOJ1124】[POI2008]枪战Maf(基环树_构造)
  13. JavaScript实现继承机制(1)—— 构造函数方法对象冒充
  14. 在WINDOWS XP环境下部署基于网络的开源入侵监测平台——snort
  15. 计算机考研除了专业课还要学什么时候,计算机考研专业课什么时候开始看
  16. 华为p4不是鸿蒙吗怎么又改为安卓_鸿蒙系统是不是就是改版的安卓系统?
  17. 苹果邮箱登录入口_LOL手游只有一种登录方式怎么办?只有拳头账号登录入口解决方法...
  18. git上传代码简单方法 简单git上传代码工具
  19. 王者荣耀服务器怎么修改,王者荣耀常用英雄自定义攻略怎么设置 自定义攻略设置方法介绍...
  20. sql中查询最近一条记录

热门文章

  1. 简述 矩阵-DirectX 原理,并详解世界坐标转屏幕坐标,附C++实现。
  2. 【小记】谷歌浏览器安装Axure插件,无需下载
  3. winform直接控制云台_这款达到广播级机器 功能需求的 轻量级云台!真香!
  4. 王兴191条思考:一个顶级创始人的修炼与洞察
  5. java 气象数据_科学网-下载某地历史逐小时环境气象数据的方法-风速风向温湿度-洪晓强的博文...
  6. android字节流保存,android数据存储之文件存储方法
  7. 斐讯手表怎么刷机华为系统_智能手表怎么刷机?
  8. C语言编写贪吃蛇-链表的使用
  9. “快易需求系统”数据库设计心得
  10. Matlab图像分割(U-Net)