浅谈如何学习网络编程

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

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

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

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 《深入浅出强化学习编程实战》是一本以深入浅出的方式介绍强化学习编程实践的教材。强化学习是一种机器学习的方法,其通过与环境进行交互,不断试错并根据反馈进行学习,以最大化获取奖励的策略。 这本书从实际应用的角度出发,为读者提供了丰富的强化学习编程实例,并用简洁明了的语言进行讲解。书中首先对强化学习的基本概念进行了介绍,包括马尔科夫决策过程、值函数、策略梯度等核心理论。接着,作者通过具体的案例,如迷宫问题、扫地机器人等,演示了如何应用强化学习算法解决实际问题。 《深入浅出强化学习编程实战》的编写极富教性,每个实例都配有详细的代码解释和算法原理分析,使读者能够更好地理解和掌握强化学习的编程实现。同时,书中还介绍了一些在实践中常用的强化学习库和工具,如OpenAI Gym、TensorFlow等,让读者能够更加便捷地进行实验和应用。 这本书适合对强化学习感兴趣的初者阅读,也适合已有一定编程基础的读者进行进一步的学习和实践。通过读完本书,读者可以了解到强化学习的基本概念和常用算法,并能够运用所知识解决实际问题。 总之,《深入浅出强化学习编程实战》是一本循序渐进、实用性极高的强化学习编程实践指南,帮助读者快速入门和应用强化学习算法。无论是术研究还是工程实践,都能够从中获得丰富的经验和知识。 ### 回答2: 《深入浅出强化学习编程实战》pdf是一本讲解强化学习编程实践的电子书籍。强化学习是一种机器学习的分支,其主要目标是让智能体通过与环境的交互,最大化累积奖励。这本书以深入浅出的方式,向读者解释了强化学习的基本原理和相关算法。 这本书首先介绍了强化学习的基本概念和背景知识,包括马尔可夫决策过程、值函数和策略等重要概念。然后,书中详细介绍了一些经典的强化学习算法,如Q-Learning和Deep Q-Networks等。通过学习这些算法,读者可以了解如何通过强化学习方法来解决实际问题。 此外,该书也提供了一些实际项目案例,帮助读者将理论知识应用到实际场景中。这些案例涵盖了不同领域,如机器人、游戏和金融等,读者可以通过这些实例了解强化学习在不同领域的应用。 为了更好地帮助读者理解和掌握强化学习编程实践,该书还提供了大量的代码示例和实验练习。读者可以通过编写代码并运行实验来巩固所的知识,并且可以在实验中探索不同的参数和算法,以实现更好的性能。 总的来说,《深入浅出强化学习编程实战》pdf以通俗易懂的方式介绍了强化学习的基本理论和算法,并通过实际案例和实验帮助读者深入理解和运用强化学习。这本书适合对强化学习编程实践感兴趣的读者阅读,不仅可以到理论知识,还能够通过实践提升编程和问题解决能力。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值