python网络编程学习笔记(一)
python网络编程基础,第四版
pycharm实现,python版本2.7.5
第一部分 底层网络
一、笔记
#coding=utf-8
第一章
import socket,sys
port=70
print (len(sys.argv))
for i in range(len(sys.argv)):
print (sys.argv[i])
host=sys.argv[1]
filename=sys.argv[2]
s=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
print ("old s is:",s)
print (host)
s.connect((host,port))
print ("new s is:",s)
s.sendall(filename+"\r\n")
while 1:
buf=s.recv(2048)
if not len(buf):
break
sys.stdout.write(buf)
加入错误处理
import socket,sys
port=70
print (len(sys.argv))
for i in range(len(sys.argv)):
print (sys.argv[i])
host=sys.argv[1]
filename=sys.argv[2]
s=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
print ("old s is:",s)
print (host)
try:
s.connect((host, port))
except socket.gaierror,e:
print ("ERROR connection to server:%s" %e)
sys.exit(1)
s.sendall(filename+"\r\n")
while 1:
buf=s.recv(2048)
if not len(buf):
break
sys.stdout.write(buf)
文件接口类重写
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))
fd=s.makefile('rw',0)
fd.write(filename+"\r\n")
for line in fd.readlines():
sys.stdout.write(line)
基本服务器操作
import socket
host=''
port=80
s=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
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()
高级接口
import gopherlib,sys
host=sys.argv[1]
file=sys.argv[2]
f=gopherlib.send_selector(file,host)
for line in f.readlines():
sys.stdout.write(line)
import urllib,sys
host=sys.argv[1]
file=sys.argv[2]
f=urllib.urlopen('gopher://%s%s'%(host,file))
for line in f.readlines():
sys.stdout.write(line)
import urllib,sys
f=urllib.urlopen(sys.argv[1])
while 1:
buf=f.read(2048)
if not len(buf):
break
sys.stdout.write(buf)
第二章
使用udp
第三章 网络服务器
import socket
solist=[x for x in dir(socket) if x.startswith('SO')]
solist.sort()
for x in solist:
print x
第四章 域名系统
import sys,socket
result=socket.getaddrinfo(sys.argv[1],None)
print result[0][4]
import sys,socket
result=socket.getaddrinfo(sys.argv[1],None)
counter=0
for item in result:
print "%-2d:%s"%(counter,item[4])
counter+=1
P70
import sys,socket
result=socket.getaddrinfo(sys.argv[1],None,0,socket.SOCK_STREAM)
counter=0
for item in result:
print "%-2d:%s"%(counter,item[4])
counter+=1
执行反向查询
import sys,socket
try:
result=socket.gethostbyaddr(sys.argv[1])
print "Primary hostname:"
print " "+result[0]
print "\nAddresses:"
for item in result[2]:
print " "+item
except socket.herror,e:
print "Couldn't look up name:",e
正反向查询
import sys,socket
def getipaddrs(hostname):
result=socket.getaddrinfo(hostname,None,0,socket.SOCK_STREAM)
return [x[4][0] for x in result]
def gethostname(ipaddr):
return socket.gethostbyaddr(ipaddr)[0]
try:
hostname=gethostname(sys.argv[1])
ipaddrs=getipaddrs(hostname)
except socket.herror,e:
print "NO host names available for %s;it may be normal"%sys.argv[1]
sys.exit(0)
except socket.gaierror,e:
print "Got hostname %s,but it could not be forward-resolved:%s"%(hostname,str(e))
sys.exit(1)
if not sys.argv[1] in ipaddrs:
print "GOt hostnae %s,but no forward lookup,"% hostname
print "original IP %s did not appear in IP address list"% sys.argv[1]
sys.exit(1)
print "Validated hostname:",hostname
获得完整域名,gethostname()获得主机名,getfqdn()获得完整信息,getaddrinfo()获得该域名对性的IP地址。
import sys,socket
def getipaddrs(hostname):
result=socket.getaddrinfo(hostname,None,0,socket.SOCK_STREAM)
return [x[4][0] for x in result]
hostname=socket.gethostname()
print "Host name:",hostname
print "Fully-qualified name:",socket.getfqdn(hostname)
try:
print "IP addresses:",",".join(getipaddrs(hostname))
except socket.gaierror,e:
print "Couldn't not get IP addresses:",e
import sys,DNS
query=sys.argv[1]
DNS.DiscoverNameServers()
reqobj=DNS.Request()
answerobj=reqobj.req(name=query,qtrpe=DNS.Type.ANY)
if not len(answerobj.answers):
print "NOT found."
for item in answerobj.answers:
print "%-5s %s"%(item['typename'],item['data'])
import sys,DNS
def hierquery(qstring,qtype):#给出主机名的相应服务器
reqobj=DNS.Request()#建立查询对象实例
try:
answerobj=reqobj.req(name=qstring,qtype=qtype)
answers=[x['data'] for x in answerobj.answers if x['type']==qtype]
except DNS.Base.DNSError:
answers=[]
if len(answers):
return answers
else:
remainder=qstring.split(".",1)
if len(remainder)==1:
return None
else:
return hierquery(remainder[1],qtype)
def findnameservers(hostname):#取得权威名称服务器列表
return hierquery(hostname,DNS.Type.NS)
def getrecordsfromnameserver(qstring,qtype,nslist):#在服务器查询,直到找到答案或者查完该表
for ns in nslist:
reqobj=DNS.Request(server=ns)
try:
answers=reqobj.req(name=qstring,qtype=qtype).answers
if len(answers):
return answers
except DNS.Base.DNSError:
pass
return []
def nslookup(qstring,qtype,verbose=1):
nslist=findnameservers(qstring)
if nslist==None:
raise RuntimeError,"Could not find nameserver to use."
if verbose:
print "using nameserver:",",".join(nslist)
return getrecordsfromnameserver(qstring,qtype,nslist)
if __name__=='__main__':
query=sys.argv[1]
DNS.DiscoverNameServers()
answers=nslookup(query,DNS.Type.ANY)
if not len(answers):
print "not found."
for item in answers:
print "%-5s %s"%(item['typename'],item['data'])
第五章
超时的用法
echoserver.py
import socket,traceback
host = ''
port = 51432
s = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
s.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1)
s.bind((host,port))
s.listen(1)
while True:
try:
clientsock,clientaddr = s.accept()
except KeyboardInterrupt:
raise
except:
traceback.print_exc()
continue
try:
print "Got connection from",clientsock.getpeername()
while True:
data = clientsock.recv(4096)
if not len(data):
break
clientsock.sendall(data)
except (KeyboardInterrupt,SystemExit):
raise
except:
traceback.print_exc()
try:
clientsock.close()
except KeyboardInterrupt:
raise
except:
traceback.print_exc()
import struct,sys
def htones(num):
return struct.pack('!H',num)
def htonl(num):
return struct.pack('!I',num)
def ntohs(data):
return struct.unoack('!H',data)[0]
def ntohl(data):
return struct.unpack('!I',data)[0]
def sendstring(data):
return htonl(len(data))+data
print "Enter a string:"
str=sys.stdin.readline().rstrip()
print repr(sendstring(str))
import socket,sys
host,port = sys.argv[1:]
results = socket.getaddrinfo(host,port,0,socket.SOCK_STREAM)
for result in results:
print "-"*60
if result[0] == socket.AF_INET:
print "Family: AF_INET"
elif result[0] == socket.AF_INET6:
print "Family: AF_INET6"
else:
print "Family:",result[0]
if result[1] == socket.SOCK_STREAM:
print "Socket Type: SOCK_STREAM"
elif result[1] == socket.SOCK_DGRAM:
print "Socket Type: SOCK_DGRAM"
print "Protocol:",result[2]
print "Canonical Name:",result[3]
print "Socket Address:",result[4]
先找ipv4,再找ivp6
Connect Example with ipv6 Awareness ------------- ipv6connect.py
import socket,sys
def getaddrinfo_pref(host,port,socktype,familypreference=socket.AF_INET):#ipv4
results = socket.getaddrinfo(host,port,0,socktype)
for result in results:
if result[0] == familypreference:
return result
return results[0]
host = sys.argv[1]
port = 'http'
c = getaddrinfo_pref(host,port,socket.SOCK_STREAM)
print "Connecting to",c[4]
s = socket.socket(c[0],c[1])
s.connect(c[4])
s.sendall("HEAD / HTTP/1.0\n\n")
while True:
buf = s.recv(40