python网络编程学习笔记(一)


Posted in Python onJune 09, 2014

学习用书:《python 网络编程基础》作者John Goerzen

第一部分底层网络学习

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

(1)基本客户端操作

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

import socket,sys
port =70
host=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")
while 1:
    buf=s.recv(2048)
    if not len(buf):
        break
    sys.stdout.write(buf)

该程序实现的是Gopher协议,实现从主机上请求相关文档的功能。(Gopher是Internet上一个非常有名的信息查找系统,它将Internet上的文件组织成某种索引,很方便地将用户从Internet的一处带到另一处。在WWW出现之前,Gopher是Internet上最主要的信息检索工具,Gopher站点也是最主要的站点。但在WWW出现后,Gopher失去了昔日的辉煌。现在它基本很少被使用。)
       于是,我按照书上的语句进行了一下测试,在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 网络编程基础》一书中同样给出了一个简单的服务器程序,具体如下:

import socket
host=''
port=51423
s=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." %port
while 1:
    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
具体的一些组合用法可见:http://wenku.baidu.com/view/23013b7101f69e3143329402.html
第三个参数设为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 相关文章推荐
wxPython定时器wx.Timer简单应用实例
Jun 03 Python
python常用知识梳理(必看篇)
Mar 23 Python
Windows下安装python2和python3多版本教程
Mar 30 Python
Python编程实现两个文件夹里文件的对比功能示例【包含内容的对比】
Jun 20 Python
Python SQLite3数据库日期与时间常见函数用法分析
Aug 14 Python
django 微信网页授权登陆的实现
Jul 30 Python
详解一种用django_cache实现分布式锁的方式
Sep 01 Python
基于python的列表list和集合set操作
Nov 24 Python
基于Python绘制个人足迹地图
Jun 01 Python
python开发入门——列表生成式
Sep 03 Python
Python 必须了解的5种高级特征
Sep 10 Python
如何利用python创作字符画
Jun 25 Python
有关wxpython pyqt内存占用问题分析
Jun 09 #Python
wxpython 最小化到托盘与欢迎图片的实现方法
Jun 09 #Python
Python实例之wxpython中Frame使用方法
Jun 09 #Python
wxpython学习笔记(推荐查看)
Jun 09 #Python
wxPython中文教程入门实例
Jun 09 #Python
python操作xml文件详细介绍
Jun 09 #Python
实例讲解python函数式编程
Jun 09 #Python
You might like
各种战术和打法的原创者
2020/03/04 星际争霸
PHP使用GIFEncoder类生成的GIF动态图片验证码
2014/07/01 PHP
ThinkPHP3.2.2实现持久登录(记住我)功能的方法
2016/05/16 PHP
PHP实现长轮询消息实时推送功能代码实例讲解
2021/02/26 PHP
屏蔽Flash右键信息的js代码
2010/01/17 Javascript
js href的用法
2010/05/13 Javascript
jQuery UI AutoComplete 使用说明
2011/06/20 Javascript
jQuery功能函数详解
2015/02/01 Javascript
JQuery+EasyUI轻松实现步骤条效果
2016/02/22 Javascript
全面了解JavaScript的数据类型转换
2016/07/01 Javascript
bootstrap datepicker限定可选时间范围实现方法
2016/09/28 Javascript
Javascript仿京东放大镜的效果
2017/03/01 Javascript
JS字符串false转boolean的方法(推荐)
2017/03/08 Javascript
浅谈JS中this在各个场景下的指向
2019/08/14 Javascript
vuex根据不同的用户权限展示不同的路由列表功能
2019/09/20 Javascript
Swiper实现导航栏滚动效果
2020/10/16 Javascript
python算法学习之计数排序实例
2013/12/18 Python
决策树的python实现方法
2014/11/18 Python
python中argparse模块用法实例详解
2015/06/03 Python
Python多进程multiprocessing用法实例分析
2017/08/18 Python
windows下安装Python虚拟环境virtualenvwrapper-win
2019/06/14 Python
python查看数据类型的方法
2019/10/12 Python
Python 日期时间datetime 加一天,减一天,加减一小时一分钟,加减一年
2020/04/16 Python
python golang中grpc 使用示例代码详解
2020/06/03 Python
Python操作PostgreSql数据库的方法(基本的增删改查)
2020/12/29 Python
html5实现多图片预览上传及点击可拖拽控件
2018/03/15 HTML / CSS
英国安全产品购物网站:The Safe Shop
2017/03/20 全球购物
美国正宗奢华复古手袋、珠宝及配饰网站:What Goes Around Comes Around
2018/07/21 全球购物
Currentbody西班牙:美容仪专家
2019/09/28 全球购物
东南亚冒险旅行与活动:Adventoro
2019/10/16 全球购物
Linux管理员面试题 Linux admin interview questions
2014/11/01 面试题
英语通知范文
2015/04/22 职场文书
人口与计划生育责任书
2015/05/09 职场文书
党员转正党支部意见
2015/06/02 职场文书
2015年清剿火患专项行动工作总结
2015/07/27 职场文书
修改MySQL的数据库引擎为INNODB的方法
2021/05/26 MySQL