第一部分底层网络学习

Python提供了访问底层操作系统Socket接口的全部方法,需要的时候这些接口可以提供灵活而强有力的功能。

(1)基本客户端操作

在《python 网络编程基础》一书中,作者列出了一个简单的Python客户端程序,具体如下:

importsocket,sys

port=70host=sys.argv[1]

filename=sys.argv[2]

s=socket.socket(socket.AF_INET,socket.SOCK_STREAM)

s.connect((host,port))

s.sendall(filename+"\r\n")while1:

buf=s.recv(2048)ifnotlen(buf):breaksys.stdout.write(buf)

该程序实现的是Gopher协议,实现从主机上请求相关文档的功能。(Gopher是Internet上一个非常有名的信息查找系统,它将Internet上的文件组织成某种索引,很方便地将用户从Internet的一处带到另一处。在WWW出现之前,Gopher是Internet上最主要的信息检索工具,Gopher站点也是最主要的站点。但在WWW出现后,Gopher失去了昔日的辉煌。现在它基本很少被使用。)可以加下:python学习交流群:619307290

于是,我按照书上的语句进行了一下测试,在dos下运行python gopherclient.py quux.org。但是系统提示为

Traceback (most recent call last):

File "gopherclient.py", line 5, i

filename=sys.argv[2]

IndexError: list index out of range

看了一下,sys.argv只有两个元素['gopherclient.py', 'quux.org/']所以filename=sys.argv[2]就超出下界了。可是为什么会出现这个原因呢?是书里面写错了吗,因为我也是初学socket,不是很了解,所以我也是没有找到原因,如果哪位大牛知道是什么原因,希望能给讲解一下。

(2)基本服务器操作

《python 网络编程基础》一书中同样给出了一个简单的服务器程序,具体如下:

importsocket

host=''port=51423s=socket.socket(socket.AF_INET,socket.SOCK_STREAM,0)

s.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1)

s.bind((host,port))

s.listen(1)print"Server is running on port %d;press Ctrl-C to terminate."%portwhile1:

clientsock,clientaddr=s.accept()

clientfile=clientsock.makefile('rw',0)

clientfile.write("welcome,"+str(clientaddr)+'\n')

clientfile.write("Please enter a string:")

line=clientfile.readline().strip()

clientfile.write("You entered %d characters.\n"%len(line))

clientfile.close()

clientsock.close()

该程序运行后,提示“Server is running on port 51423:press Ctrl-C to terminate”。此时,通过另一台机器telnet本机器的51423端口,如telnet 127.0.0.1:51423,此时会提示welcome 127.0.0.1 ****,please enter a string:。 然后输入几个字符后,会返回你输入字符的个数。

这里就该程序进行一下分析:

1、首先导入socket模块,给host和port赋值。

2、调用socket.socket()来建立一个socket赋值给s。socket.socket(domain, type, protocol).domain参数的值有AF_UNIX,AF_LOCAL,AF_INET,PF_UNIX,PF_LOCAL,PF_INET。这几个值中AF_UNIX=AF_LOCAL, PF_UNIX=PF_LOCAL, AF_LOCAL=PF_LOCAL, AF_INET=PF_INET。一般来说,AF 表示ADDRESS FAMILY 地址族,PF 表示PROTOCOL FAMILY 协议族,但这两个宏定义是一样的,所以使用哪个都没有关系。参数type指定socket的类型:SOCK_STREAM提供有序、可靠、双向及基于连接的字节流。SOCK_DGRAM支持数据报。SOCK_SEQPACKET提供有序、可靠、双向及基于连接的数据报通信。SOCK_RAW提供对原始网络协议的访问。SOCK_RDM提供可靠的数据报层,但是不保证有序性。protocol一般取0(为什么取0我也没搞清楚,放在以后明白了再写上吧)。

3、s.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1)。setsockopt()函数用于任意类型、任意状态套接口的设置选项值。尽管在不同协议层上存在选项,但本函数仅定义了最高的“套接口”层次上的选项。选项影响套接口的操作,诸如加急数据是否在普通数据流中接收,广播数据是否可以从套接口发送等等。 这个函数中,第一个参数为协议层参数,指明了希望访问一个选项所在的协议栈。通常我们需要使用下面中的一个:

SOL_SOCKET来访问套接口层选项

SOL_TCP来访问TCP层选项

第二个参数是与第一个参数相对应的。第一个参数决定了协议层level,第二个参数决定了该协议层下选项组合。SOL_SOCKET的选项组合如下:

协议层 选项名字

SOL_SOCKET SO_REUSEADDR

SOL_SOCKET SO_KKEPALIVE

SOL_SOCKET SO_LINGER

SOL_SOCKET SO_BROADCAST

SOL_SOCKET SO_OOBINLINE

SOL_SOCKET SO_SNDBUF

SOL_SOCKET SO_RCVBUF

SOL_SOCKET SO_TYPE

SOL_SOCKET SO_ERROR

第三个参数设为1,这里我也没很明白其中的意思,我试着把1换成50,结果是一样的。换成0也是可以的,没发现什么区别。希望大牛们给指点一下。

4、s.bind((host,port))绑定主机端口。

5、s.listen(1):listen函数使用主动连接套接口变为被连接套接口,使得一个进程可以接受其它进程的请求,从而成为一个服务器进程。在TCP服务器编程中listen函数把进程变为一个服务器,并指定相应的套接字变为被动连接。这里的参数涉及到一些网络的细节。在进程正理一个一个连接请求的时候,可能还存在其它的连接请求。因为TCP连接是一个过程,所以可能存在一种半连接的状态,有时由于同时尝试连接的用户过多,使得服务器进程无法快速地完成连接请求。如果这个情况出现了,服务器进程希望内核如何处理呢?内核会在自己的进程空间里维护一个队列以跟踪这些完成的连接但服务器进程还没有接手处理或正在进行的连接,这样的一个队列内核不可能让其任意大,所以必须有一个大小的上限。这个backlog告诉内核使用这个数值作为上限。毫无疑问,服务器进程不能随便指定一个数值,内核有一个许可的范围。这个范围是实现相关的。很难有某种统一,一般这个值会小30以内。这里设定为1表示每次最多只有一个等候处理的连接。

6、while循环从accept()函数开始。程序会在连接了一个客户端后关闭socket。当某个客户端连接的时,accept返回两个信息,一个新的连接客户端socket和客户端的ip地址、端口号。如在上面的例子中添加print语句输出clientsock和clientaddr,你会发现clientsock为socket.socketobject,clientaddr=('客户端Ip',端口)。后面的循环中使用了文件类对象,服务器接着显示出一些介绍性信息,从客户端读一个字符串,显示一个应答,最后关闭客户端socket。

怎么样才能学好python学好python你需要一个良好的环境,一个优质的开发交流群,群里都是那种相互帮助的人才是可以的,我有建立一个python学习交流群,在群里我们相互帮助,相互关心,相互分享内容,这样出问题帮助你的人就比较多,群号是304,还有050,最后是799,这样就可以找到大神聚合的群,如果你只愿意别人帮助你,不愿意分享或者帮助别人,那就请不要加了,你把你会的告诉别人这是一种分享。如果你看了觉得还可以的麻烦给我点个赞谢谢

初学者怎么自学python编程_学习python网络编程怎么入门相关推荐

  1. python最佳编程_学习 Python 的最佳方式

    原标题:学习 Python 的最佳方式 Python 是世界上功能最多且最强大的编程语言之一.使用 Python,你可以编写自己的应用程序,创建游戏.设计算法.甚至编程一个机器人.学习 Python ...

  2. 学python编程_学习Python编程,我们应该如何学?学习内容包括哪些?

    点击蓝字"python教程"关注我们,一起学习成长哟! 我想可能很多网友和我有着相似的学习背景,学习Python会有以下的问题: 从零开始,不知道如何下手开始学? 被基本的数据结构 ...

  3. python小型编程_学习Python编程的11个资源

    用 Python 写代码并不难,事实上,它一直以来都是被声称为最容易学习的编程语言.如果你正打算学习 web 开发,Python 是一个不错的选择,甚至你想学游戏开发也可 以从 Python 开始,因 ...

  4. python困境_学习 Python 编程的三种困境

    之前我写过两篇关于测试人员要不要学编程的文章,有很多朋友留言给我说,我也很想学呀,可是我办不到呀. 前两篇文章链接如下,没看过的可以尽快回顾下: <做软件测试到底要不要学编程?> < ...

  5. 学python要不要先自学c语言_学习Python之前是否需要学习C语言

    首先,学习Python之前并不需要学习C语言,Python本身是比较适合作为入门编程语言来学习的,一方面Python的语法结构比较简单清晰,实验也相对比较容易完成,这会逐渐增强初学者的学习信心,另一方 ...

  6. python作品_学习 Python 有些枯燥?那是你学错方法了,看这里

    有没有觉得学习Python有些无聊乏味?觉得Python很没意思?如果是的话,那是你没找到好的学习方法! Python编程中的Turtle(海龟绘图).Pygame非常利于初学者的学习,你可以使用它们 ...

  7. python网络平台_python学习(九) 网络编程学习--简易网站服务器

    python `网络编程`和其他语言都是一样的,服务器这块步骤为: `1. 创建套接字` `2. 绑定地址` `3. 监听该描述符的所有请求` `4. 有新的请求到了调用accept处理请求` Pyt ...

  8. macbookpro可以自学python吗_学习python,office等,是否推荐购买macbookpro?

    其实你写下这个问题的时候你心里已经有答案了吧 先说结论 荷包够大 上mac 不然就上windows 对于初学者来说 入门你用哪个平台都可以 先来看一下macbookpro 能给你带来什么 首先对于py ...

  9. python忠告_学习Python一段时间,老司机给上路新手的3点忠告!

    在你学习编程的过程中,是否有过以下经历,或正在面临类似的局面:网上找了很多资料,不知道从哪里看起 买了本书,过了很久也没有看完第一章 开始还能跟着写几行代码,后来突然就看不懂了 也看了些教程和视频,似 ...

最新文章

  1. QSignalMapper的使用
  2. 上海理工大学eduroam登陆
  3. 经典SQL语句大全、50个常用的sql语句
  4. Windows系统文件详解【大全】
  5. 什么是java?为什么大家都学习java技术?
  6. B. 重载技术(overloading)
  7. s5pv210——串口通信的基础概念
  8. iOS加入百度地图的几个问题
  9. 虚拟主机选择php版本,虚拟主机的php版本如何选择
  10. 大数据预测实战-随机森林预测实战(一)-数据预处理
  11. JAVA8两个流变量相等_Java8:Stream在同一个流中映射两个属性
  12. Python_目录的简单操作(新建/查看/删除)
  13. leetcode [209]长度最小的子数组/Minimum Size Subarray Sum 【暴力解法】【滑动窗口解法】
  14. CCIE学习笔记 2---BGP选路(属性值)
  15. 【SequoiaDB|巨杉数据库】巨杉数据库快速入门
  16. 计算机时代汉字书写有了新的方式,网络时代的汉字书写
  17. TypeScript散文
  18. 给五子棋加个功能叫悔棋
  19. uiautomator2+ tesseract 智能识别文字实现手游辅助外挂,打怪刷装备快人一步
  20. 寒湿重的表现 ,舌苔发白

热门文章

  1. 自动驾驶采标系列三:基于图像的目标检测技术
  2. 统计文件单词数 C语言纯逻辑版 (对标Word)
  3. Android OpenGLES2.0(三)——等腰直角三角形和彩色的三角形
  4. 读研攻略(5)-文献汇报、实验汇报怎么做?理论加实操
  5. 8.python之列表与字典
  6. 【文件包含漏洞-02】文件包含漏洞分类与原理及其空字符安全绕过实验
  7. 【干货】数据安全工具建设实践
  8. OpenCV学习笔记(一):生成随机矩阵
  9. Vue学习之props属性的使用
  10. 【巴比伦周报】2019第5周