• python 网络编程基础


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

     

    转载请注明:@小五义  http://www.cnblogs.com/xiaowuyi


    学习用书:《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。

     
    标签: pythonsocket

    python学习笔记

     
    摘要: 转载请注明:@小五义 http://www.cnblogs.com/xiaowuyi学习用书:《python 网络编程基础》作者John Goerzen第一部分底层网络学习 Python提供了访问底层操作系统Socket接口的全部方法,需要的时候这些接口可以提供灵活而强有力的功能。(1)基本客户端操作 在《python 网络编程基础》一书中,作者列出了一个简单的Python客户端程序,具体如下:import socket,sysport =70host=sys.argv[1]filename=sys.argv[2]s=socket.socket(socket.AF_INET,socke...阅读全文
    posted @ 2012-07-31 13:50 小五义 阅读(347) | 评论 (1) 编辑
     
    摘要: 转载请注明:@小五义 http://www.cnblogs.com/xiaowuyi 学了这么长时间的Pygame,一直想写个游戏实战一下。看起来很简单的游戏,写其来怎么这么难。最初想写个俄罗斯方块,想了很长时间如何实现,想来想去,也没写出来,于是干脆下载别人的代码来读。后来,要想写一个帮助记忆的挖宝箱的游戏,结果也没完成。唯一完成了就是下面这个小人接金币的游戏,超级简单,通过左右键控制小人移动去接空中下来的金币,接住金币得5分,接不住游戏结束,金币速度会随着level的关数而越来越快。完成这段代码后,我依然觉得这段代码写得很差,确实也是自己对pygame只是掌握了皮毛,对surface、..阅读全文
    posted @ 2012-07-09 16:11 小五义 阅读(177) | 评论 (0) 编辑
     
    摘要: 转载请注明:@小五义 http://www.cnblogs.com/xiaowuyi据说在任天堂FC时代,精灵的作用相当巨大,可是那时候只知道怎么玩超级玛丽、魂斗罗,却对精灵一点也不知。pygame.sprite.Sprite就是Pygame里面用来实现精灵的一个类,使用时,并不需要对它实例化,只需要继承他,然后按需写出自己的类就好了,因此非常简单实用。一、什么是精灵精灵可以认为成是一个个小图片,一种可以在屏幕上移动的图形对象,并且可以与其他图形对象交互。精灵图像可以是使用pygame绘制函数绘制的图像,也可以是原来就有的图像文件。二、sprite中主要且常用的变量有以下几个:更多详细的见ht阅读全文
    posted @ 2012-06-26 17:02 小五义 阅读(829) | 评论 (0) 编辑
     
    摘要: 转载请注明:@小五义 http://www.cnblogs.com/xiaowuyipygame.mixer是一个用来处理声音的模块,其含义为“混音器”。游戏中对声音的处理一般包括制造声音和播放声音两部分,这里仅学习了播放声音部分。1、pygame.mixer启动与初始化pygame.mixer.init():mixer的初始化。程序中,使用时,一般放在最前面的几句代码中:import pygamepygame.init()pygame.mixer.init()2、播放声音片段wav文件播放声音片段wav文件时,pygame.mixer使用Sound对象,格式为:soundwav=pygame阅读全文
    posted @ 2012-06-15 10:52 小五义 阅读(1239) | 评论 (2) 编辑
     
    摘要: 转载请注明:@小五义 http://www.cnblogs.com/xiaowuyi1、运动速率 上节中,实现了一辆汽车在马路上由下到上行驶,并使用了pygame.time.delay(200)来进行时间延迟。看了很多参考材料,基本每个材料都会谈到不同配置机器下运动速率的问题,有的是通过设定频率解决,有的是通过设定速度解决,自己本身水平有限,看了几篇,觉得还是《Beginning Game Development with Python and Pygame》这里面提到一个方法比较好。代码如下,代码里更改的地方主要是main里的代码,其中利用clock=pygame.time.Clock()来阅读全文
    posted @ 2012-06-11 17:20 小五义 阅读(791) | 评论 (0) 编辑
     
    摘要: 转载请注明:@小五义http://www.cnblogs.com/xiaowuyi1、单个像素(画点)利用pygame画点主要有三种方法:方法一:画长宽为1个像素的正方形#@小五义 http://www.cnblogs.com/xiaowuyiimport pygame,syspygame.init()screen=pygame.display.set_caption('hello world!')screen=pygame.display.set_mode([640,480])screen.fill([255,255,255])pygame.draw.rect(screen,阅读全文
    posted @ 2012-06-08 17:10 小五义 阅读(894) | 评论 (1) 编辑
     
    摘要: pygame是一个设计用来开发游戏的python模块,其实说白了和time、os、sys都是一样的东东。今天开始正式学习pygame,下载地址:www.pygame.org。下载后安装完成即可,在pygame的学习中,我使用了spe编辑器,感觉还不错。1、pygame窗口 pygame绘制图形前,首先需要建立一个窗口,说来很简单,请看下面的代码,怎么样,是不是很简单。import pygame #这句不用注释了吧,呵呵pygame.init() #模块初始化,任何pygame程序均需要执行此句screencaption=pygame.display.set_caption('he...阅读全文
    posted @ 2012-06-06 22:50 小五义 阅读(309) | 评论 (1) 编辑
     
    摘要: 闲来蛋痛,在金山快盘自动签到程序的基础上,新增了小木虫论坛自动领红包程序,v1.01。下载地址:http://www.kuaipan.com.cn/file/id_749007936687868.htm解压后直接运行自动签到.exe,如果不能运行,请先安装vs2008运行包,该包下载地址:http://www.kuaipan.cn/file/id_749007936687869.htm阅读全文
    posted @ 2012-06-01 16:48 小五义 阅读(145) | 评论 (1) 编辑
     
    摘要: base64模块是用来作base64编码解码的。这种编码方式在电子邮件中是很常见的。它可以把不能作为文本显示的二进制数据编码为可显示的文本信息。编码后的文本大小会增大1/3。这里主要介绍一下base64的8个方法(encode, decode, encodestring, decodestring, b64encode,b64decode, urlsafe_b64decode,urlsafe_b64encode): 1、encode,decode:用来编码和 解码文件的,也可以对StringIO里的数据做编解码 2、encodestring,decodestring:用来编码和解码字符串 3.阅读全文
    posted @ 2012-05-31 15:53 小五义 阅读(222) | 评论 (0) 编辑
     
    摘要: 首先感谢龙昌在http://www.oschina.net/code/snippet_93572_10721发布的金山快盘自动签到程序代码,本人在此基础上,利用wxpython做了一个程序,具体代码如下:# -*- coding: cp936 -*-#'@小五义 http://www.cnblogs.com'#'金山快盘签到程序'import urllibimport urllib2import cookielibimport jsonimport reimport wxdef create(parent): return Frame1(parent)[wxID阅读全文
    posted @ 2012-05-24 11:01 小五义 阅读(300) | 评论 (0) 编辑
     
    摘要: 利用cookielib和urllib2模块模拟登陆163的例子有很多,近期看了《python模拟登陆163邮箱并获取通讯录》一文,受到启发,试着对收件箱、发件箱等进行了分析,并列出了所有邮件列表及状态,包括发件人、收件人、主题、发信时间、已读未读等状态。1、参考代码:http://hi.baidu.com/fc_lamp/blog/item/2466d1096fcc532de8248839.html%EF%BB%BF#-*- coding:UTF-8 -*-import urllib,urllib2,cookielibimport xml.etree.ElementTree as etr...阅读全文
    posted @ 2012-05-21 11:54 小五义 阅读(384) | 评论 (6) 编辑
     
    摘要: 学习记录,超简单的计时器,简单的代码学会了如何在程序中进行计时处理。import time,syswhile True: s=time.ctime() length=len(s) print s time.sleep(30) #每30秒执行一次阅读全文
    posted @ 2012-05-04 15:55 小五义 阅读(49) | 评论 (0) 编辑
     
    摘要: 删除一个非空文件夹竟然如此简单,真是强啊!import shutilshutil.rmtree('c:\\test')print 'ok'阅读全文
    posted @ 2012-05-04 08:51 小五义 阅读(65) | 评论 (0) 编辑
     
    摘要: 通过百度搜索知道,xp下修改MAC地址的方法主要有两个,一种是通过配置本地链接属性来实现,这种方法不适合用程序来完成,另一种是通过修改注册表来完成,本程序主要是利用了这种方法。 具体方法:Windows 2000/XP中,打开注册表编辑器:HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Class\4D36E972-E325-11CE-BFC1-08002BE10318 中的0000,0001,0002等子键,如果在某一子键下找到DriverDesc值 ,该值与你要改的网卡一致,那么就在该键下添加一个字符串变量,命名为“Network..阅读全文
    posted @ 2012-04-11 18:15 小五义 阅读(175) | 评论 (0) 编辑
     
    摘要: 处理eml文件,一般windows下会启用默认的outlook来阅读,实际上python的email模块可以很简单的实现对eml文件的阅读,闲来木事,利用wxpython制作了一个eml文件阅读器,实现了对eml文件正文的阅读和附件的阅读,但由于制作时,在信头读取部分使用了label,在格式处理时未处理好,当信件有多个收件人时,会出现格式混乱。另外,附件如果有多个,只会显示最后一个。哪位感兴趣或者有时间可以自己改一下。 一、email模块对eml文件的读取 首先先来看一个邮件的源文件:Received: from 192.168.208.56 ( 192.168.208.56 [192.1..阅读全文
    posted @ 2012-04-05 13:57 小五义 阅读(253) | 评论 (0) 编辑
     
    摘要: 今天就为了把一个字符串里的多个换行去掉,竟然忙活了一个下午,真是让大牛们笑话了。 事出有因,一个字符串如下 ==========================XXX手机:1XXXXXX邮箱:XXX@XXXX.comQ Q:XXXXX===========================目的是要把其中的空行去掉,显得更加美观,最先想到用字符串,定义a为以上内容,用replace方法,可是由于不确定每行间有几个换行\n,所以也无法直接用\n替换。于是想到用正则表达式,但是试着写了几个办法,如re.sub('\n+','\n',a),但也没成功,没有一行替换成功,不阅读全文
    posted @ 2012-03-30 16:43 小五义 阅读(266) | 评论 (4) 编辑
     
    摘要: python中email模块使得处理邮件变得比较简单,今天着重学习了一下发送邮件的具体做法,这里写写自己的的心得,也请高手给些指点。 一、相关模块介绍发送邮件主要用到了smtplib和email两个模块,这里首先就两个模块进行一下简单的介绍: 1、smtplib模块 smtplib.SMTP([host[, port[, local_hostname[, timeout]]]]) SMTP类构造函数,表示与SMTP服务器之间的连接,通过这个连接可以向smtp服务器发送指令,执行相关操作(如:登陆、发送邮件)。所有参数都是可选的。host:smtp服务器主机名port:smtp服务的端口,默..阅读全文
    posted @ 2012-03-17 22:12 小五义 阅读(524) | 评论 (0) 编辑
     
    摘要: pyhooks下载:http://sourceforge.net/projects/pyhook/files/pyhook/1.5.1/API手册:http://pyhook.sourceforge.net/doc_1.5.0/ 以上网站上提供了个使用的例子,另外安装pyhooks后,也会有一个例子的文件。于是拿来学习了一下,第一次运行时,提示没有pythoncom模块,就安装了pywin32,安装后,可以正常运行,但是会导致机器发卡,特别是中断程序运行后,鼠标会出现一段时间的自由晃动,找了半天原因,感觉主要是事件频率过高,程序会经常卡在pythoncom.PumpMessages()。...阅读全文
    posted @ 2012-03-15 20:44 小五义 阅读(252) | 评论 (0) 编辑
     
    摘要: # -*- coding: cp936 -*- import PILfrom PIL import Image,ImageGrabimport os im = ImageGrab.grab() # or call im.show() to view the image directly im.save("c:/screenshot.png")#保存图片 #os.execvp( "mspaint",('mspaint','c:/screenshot.png'))#调用画图程序打开截屏图片im1=Image.open(&quo阅读全文
    posted @ 2012-03-09 17:31 小五义 阅读(40) | 评论 (0) 编辑
     
    摘要: 一直在学习系统托盘的实现,于是自己写了一个简单的系统托盘实例,右键包括演示、最大化、最小化、退出和关于。在python2.6下测试通过。# -*- coding: cp936 -*-import wxclass TaskBarIcon(wx.TaskBarIcon): ID_Play = wx.NewId() ID_About = wx.NewId() ID_Minshow=wx.NewId() ID_Maxshow=wx.NewId() ID_Closeshow=wx.NewId() def __init__(self, frame): ...阅读全文
    posted @ 2012-03-09 15:59 小五义 阅读(234) | 评论 (0) 编辑
     
    摘要: chardet 用来实现字符串/文件编码检测模板1、chardet下载与安装下载地址:http://pypi.python.org/pypi/chardet下载chardet后,解压chardet压缩包,直接将chardet文件夹放在应用程序目录下,就可以使用import chardet开始使用chardet了,也可以将chardet拷贝到Python系统目录下,这样你所有的python程序只要用import chardet就可以了。python setup.py install2、实例使用中,chardet.detect()返回字典,其中confidence是检测精确度,encoding是编阅读全文
    posted @ 2012-03-09 10:41 小五义 阅读(114) | 评论 (0) 编辑
     
    摘要: 利用codes编写:# coding=UTF-8import stringimport codecsdef changecode(): tt=codecs.open('c:\\111.txt','rb','utf-16') #111.txt为unicode编码文件,以unicode编码打开,utf-16=unicode mm=open('c:\\123.txt','wb') ff=tt.readlines() for i in ff: print i mm.write(i.encode('UTF-8'阅读全文
    posted @ 2012-03-08 21:57 小五义 阅读(119) | 评论 (0) 编辑
     
    摘要: 遍历指定目录的文件及文件夹初次编写:import osdef searchdir(arg,dirname,names): for filespath in names: open ('c:\\test.txt','a').write('%s\r\n'%(os.path.join(dirname,filespath))) if __name__=="__main__": paths="g:\\" os.path.walk(paths,searchdir,()) 做了修改,添加了文件属性# -*- coding阅读全文
    posted @ 2012-03-08 21:50 小五义 阅读(24) | 评论 (0) 编辑
     
    摘要: 根据核心编程里的代码,自己改编的socket聊天工具####client####from socket import *HOST='localhost'PORT=21567BUFSIZ=1024ADDR=(HOST,PORT)while True: tcpCliSock=socket(AF_INET,SOCK_STREAM) tcpCliSock.connect(ADDR) data=raw_input('input your words:') if not data: break tcpCliSock.send('%s\r\n' %data) 阅读全文
    posted @ 2012-03-08 21:46 小五义 阅读(25) | 评论 (0) 编辑
     
    摘要: 利用xlrd,将excel中某列数据中,含有指定字符串的记录取出,并生成用这个字符串命名的txt文件import osimport xlrd,sys # input the excel fileFilename=raw_input('input the file name&path:')if not os.path.isfile(Filename): raise NameError,"%s is not a valid filename"%Filename #open the excel filebk=xlrd.open_workbook(Filen阅读全文
    posted @ 2012-03-08 21:36 小五义 阅读(53) | 评论 (0) 编辑
     
    摘要: 方法一:用encode和decode如: 1 import os.path 2 import xlrd,sys 3 4 Filename='/home/tom/Desktop/1234.xls' 5 if not os.path.isfile(Filename): 6 raise NameError,"%s is not a valid filename"%Filename 7 8 bk=xlrd.open_workbook(Filename) 9 shxrange=range(bk.nsheets)10 print shxrange11 12 for x 阅读全文
    posted @ 2012-03-08 21:33 小五义 阅读(27) | 评论 (0) 编辑
     
    摘要: #!/usr/bin/env python#coding=utf-8import os,shutil,stringdir = '/home/tt-ava/test' #这里如果是windows系统,请按windows的目录形式写,如c:\\textfor i in os.listdir(dir): newfile = i.replace('.','_') #用_替代.,规则可以自己写。 oldname = dir +'/'+str(i) ne...阅读全文
    posted @ 2012-03-08 21:31 小五义 阅读(31) | 评论 (0) 编辑
     
    摘要: 模块学习步骤一:手册介绍shutil -- High-level file operations 是一种高层次的文件操作工具类似于高级API,而且主要强大之处在于其对文件的复制与删除操作更是比较支持好。相关API介绍copyfile(src, dst)从源src复制到dst中去。当然前提是目标地址是具备可写权限。抛出的异常信息为IOException. 如果当前的dst已存在的话就会被覆盖掉。注意:Special files such as character or block devices and pipes cannot be copied with this function. 不明白阅读全文
    posted @ 2012-03-08 21:11 小五义 阅读(213) | 评论 (0) 编辑
  • 相关阅读:
    js数组中indesOf方法的使用
    js之数组排序
    大神的博客地址liferay
    CRM项目总结-封装PortletURLUtil
    有待整理
    摘要JSR168 PORLET标准手册汉化整理
    蓝色表格 -- 材料
    node 项目材料 集合
    一个浮动 css3效果
    代码 工具
  • 原文地址:https://www.cnblogs.com/Leo_wl/p/2617061.html
Copyright © 2020-2023  润新知