`
xiaoheliushuiya
  • 浏览: 401721 次
文章分类
社区版块
存档分类
最新评论

浅谈如何学习网络编程

 
阅读更多

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

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

我的学习过程是这样子的:
●先是利用WinInet函数库写了几个简单的网络应用程序:简易登录、查询新书RSS等;了解了HTTP协议的一些内容。
●后来又看了孙鑫的VC视频教程,image ,虽然照着视频能够写出实例代码来,但是仅仅是会用,其中很多原理都不理解,比如说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机制。针对软件开发的复用性等要求,需要利用面向对象的设计思想,分层的思想、设计模式等。

分享到:
评论

相关推荐

    浅谈C#网络编程详解篇

    在现今软件开发中,网络编程是非常重要的一部分,本文简要介绍下网络编程的概念和实践,需要的朋友可以参考下

    浅谈网络多媒体教室软件控制系统开发.doc编程资料

    浅谈网络多媒体教室软件控制系统开发.doc

    浅谈Flash动画在网络广告中的应用.doc编程资料

    浅谈Flash动画在网络广告中的应用.doc

    第8讲 网络编程(1).ppt

    从操作系统方面,浅谈网络编程,分别从通信结构、套接字地址设置、网络通信API函数三个方面进行讲述。适合于初学网络编程原理的童鞋进行学习使用

    VB网络编程实例

    ◆ 176.htm 你也可以YAI--VB5中Winsock控件的使用 ◆ 177.htm 判断一个文件是否在IE的缓存中 ◆ 178.htm 启动拨号网络中的连接 ◆ 179.htm 浅谈HTTP协议(二)--返回值 ◆ 180.htm 浅谈...

    浅谈RxSwift 网络请求

    入坑RxSwift 有段时间了,之前在项目中只是小范围的使用RxSwift,为了更好的使用响应式编程,决定在项目中更广范围的使用RxSwift,然后研究了一下RxSwift的网络请求,现在有关网络请求的案例大多是基于RXSwift(4.0.0...

    浅谈Java内部类的四个应用场景

    如果读者想了解这些,可以在网络上搜索来学习。Java内部类总是躲在它的外部类里,像一个幕后英雄一样。但是幕后英雄也有用武之地,在很多时候,恰当的使用Java内部类能起到让人拍案叫绝的作用。本文试图谈一谈让这个...

    Wininet编程资料及代码

    WinInet编程中如何使用异步 winInet_API浅谈 Wininet详解 WinInet中的几个网络函数 WinInet学习笔记 异步下载类 等等

    Python 核心编程 第二版

    第2部分则提供了各种高级主题来展示可以使用Python做些什么,包括正则表达式、网络编程、网络客户端编程、多线程编程、图形用户界面编程、 Web编程、数据库编程、扩展Python 和一些其他材料。  本书适合Python初学...

    我的编程感悟(中文PDF)(共37M二分卷)分卷二

    《仙剑奇侠传》之父姚壮宪热情推荐,技术作家孟岩高度评价! 云风也是我在中国最佩服的游戏开发者。看了云风的研发历程,我觉得就是一部中国的游戏程序史,...14.4 浅谈网络游戏 381 14.5 小结 382 后记 383 致谢 385

    我的编程感悟(中文PDF)(共37M二分卷)分卷一

    《仙剑奇侠传》之父姚壮宪热情推荐,技术作家孟岩高度评价! 云风也是我在中国最佩服的游戏开发者。看了云风的研发历程,我觉得就是一部中国的游戏程序史,...14.4 浅谈网络游戏 381 14.5 小结 382 后记 383 致谢 385

    游戏之旅--我的编程感悟【有目录】

    2.5 Apple II 上的编程之路.......................................... 39 XIII 第1 章计算机,游戏,我_ 我,云风,从二十年前的计 算机游戏萌芽阶段一路走来。计 算机,并不神秘。程序,也只是 表达计算机控制...

    2021 AI基础软件架构峰会PPT汇总(29份).zip

    AI基础设施软件技术横跨深度学习算法、编程语言、编译器、数据库、分布式系统、高性能网络和AI芯片等多个前沿领域,是当前学术界和产业界共同感到兴奋的新领域。 一、AI芯片及编译器 AI芯片软件栈技术挑战和初探 地...

    -数字化技术在技工院校计算机应用基础课程中的运用.doc.doc

    与此同时,还 可以通过"慕课"、"微课"这种在线IT网络编程免费平台帮助学生提升技能,相互交流学 习方法。另外,在建设好资源开发工作的同时,也要重视对现有教学资源的重组与改造 ,也就是要以数字化技术的基本要求...

    Visual Basic 2008程序设计完全自学教程 2/2

    1.4 浅谈.NETFramework 1.4.1 .NETFramework架构 1.4.2 认识公共语言运行时 1.4.3 何谓WebService 本章重点整理 本章习题 第2章 VisualBasic2008Express开发环境 2.1 VisualBasic语言简介 2.1.1 VisualBasic程序...

    Visual Basic 2008程序设计完全自学教程 1/2

    1.4 浅谈.NETFramework 1.4.1 .NETFramework架构 1.4.2 认识公共语言运行时 1.4.3 何谓WebService 本章重点整理 本章习题 第2章 VisualBasic2008Express开发环境 2.1 VisualBasic语言简介 2.1.1 VisualBasic程序...

    ASP.NET3.5从入门到精通

    第四篇 ASP.NET网络编程 第 11 章用户控件和自定义控件 11.1 用户控件 11.1.1 什么是用户控件 11.1.2 编写一个简单的控件 11.1.3 将Web 窗体转换成用户控件 11.2 自定义控件 11.2.1 实现自定义控件 11.2.2 复合...

    JAVA自学之路

    请记住,学习编程并不是一件很容易的事情,自己首先要重视,要用心才可以。 在开发中,仔细观察出错信息,或者运行不正常的信息,是你要做的第一件事。 读清楚了,才能在以后的步骤中有的放矢,哭了半天,总要...

    积分管理系统java源码-WebAssembly:让C/C++在浏览器中运行

    首先,吐槽一下,第一章漫谈发展史,一谈就是90页,这也太漫了吧,截至今天才看到 17页 -_-b 虽然刚看到17页,出身计算机专业的我感觉内容已经硬核到快啃不动了,好家伙编译原理没学好的连发展史都无法了解的吗? ...

    asp.net知识库

    也谈 ASP.NET 1.1 中 QueryString 的安全获取写法 ASP.NET运行模式:PageHandlerFactory 利用搜索引擎引用来高亮页面关键字 网站首页的自动语言切换 应用系统的多语言支持 (一) 应用系统的多语言支持 (二) 自动...

Global site tag (gtag.js) - Google Analytics