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

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(4096)

if not len(buf):

break

sys.stdout.write(buf)

Echo Server Bound to Specific Address

bindserver.py

import socket,traceback

host = '127.0.0.1'

port = 51423

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:

clientsock,clientaddr = s.accept()

print "Got connection from",clientsock.getpeername()

while True:

data = clientsock.recv(4096)

if not len(data):

break

clientsock.sendall(data)

clientsock.close()

pull()

import socket,sys,select

port = 51423

host = 'localhost'

spinsize = 10

spinpos = 0

spindir = 1

def spin():

global spinsize,spinpos,spindir

spinstr = '.' * spinpos + '|' + '.'*(spinsize-spinpos-1)

sys.stdout.write('\r'+spinstr+' ')

sys.stdout.flush()

spinpos += spindir

if spinpos < 0:

spindir = 1

spinpos = 1

elif spinpos >= spinsize:

spinpos -= 2

spindir = -1

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

s.connect((host,port))

p = select.poll()

p.register(s.fileno(),select.POLLIN | select.POLLERR | select.POLLHUP)

while True:

results = p.poll(50)

if len(results):

if results[0][1] == select.POLLIN:

data = s.recv(4096)

if not len(data):

print ("\rRemove end closed connection ; exiting.")

break

sys.stdout.write("\rReceived: " + data)

sys.stdout.flush()

else:

print "\rProblem occurred exitng."

sys.exit(0)

spin()

selectclient.py

import socket,sys,select

port = 51423

host = 'localhost'

spinsize = 10

spinpos = 0

spindir = 1

def spin():

global spinsize,spinpos,spindir

spinstr = '.' * spinpos + '|' + '.' *(spinsize - spinpos -1)

sys.stdout.write('\r' + spinstr +' ')

sys.stdout.flush()

spinpos += spindir

if spinpos < 0:

spindir = 1

spinpos = 1

elif spinpos >= spinsize:

spinpos -= 2

spindir = -1

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

s.connect((host,port))

while True:

infds,outfds,errfds = select.select([s],[],[s],0.05)

if len(infds):

data = s.recv(4096)

if not len(data):

print("\rRemote end closed connection; Exiting.")

break

sys.stdout.write("\rReceived: " + data)

sys.stdout.flush()

if len(errfds):

print "\rProblen occurred; exiting."

sys.exit(0)

spin()

二、TCP通信方式

服务端:

#coding=utf-8

from socket import*

#监听套接字的连接和回应

#服务器端

myHost='' #‘’代表主机所有可用端口

myPort=50007

sockobj=socket(AF_INET,SOCK_STREAM)#创建一个TCP scoket 对象

sockobj.bind((myHost,myPort))#绑定服务端口号

sockobj.listen(5)#监听,允许5个挂起连接

while True:#一直监听直到进程被杀死

connection,address=sockobj.accept()#等待下个客户端连接

print('Server connected by:',address)#连接是新的scoket

while True:

data=connection.recv(1024)#读取新的客户端scoket,for 循环接收

if not data:break#发送接收报文给客户端

connection.send(b'Echo get your message:'+data)#直到结束关闭scoket,发送只能是b,bite格式

connection.close()

客户端:

#coding=utf-8

import socket

#客户端

import sys

from socket import *

serverHost='localhost'

serverPort=50007

message=[b'hello network world']

if len(sys.argv)>1:

serverHost=sys.argv[1]

if len(sys.argv)>2:

message=(x.encode()for x in sys.argv[2:])

sockobj=socket(AF_INET,SOCK_STREAM)

sockobj.connect((serverHost,serverPort))

for line in message:

sockobj.send(line)

data=sockobj.recv(1024)#1024字节

print('Client received:',data)

sockobj.close()

三、UDP通信方式

UDP请求端:

#coding=utf-8

import socket,sys

host=sys.argv[1]

textpost=sys.argv[2]

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

try:

port=int(textpost)

except ValueError:

print "输入错入"

port=socket.getservbyname(textpost,'udp')

s.connect((host,port))

print "Enter data to transmit: "

data=sys.stdin.readline().strip()

s.sendall(data)

print "Looking for replies."

while(1):

buf=s.recv(2048)

if not len(buf):

break

sys.stdout.write(buf)

UDP应答端:

#coding=utf-8

import socket,traceback

host=''

port=54132

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

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

s.bind((host,port))

while 1:

try:

message,address=s.recvfrom(8192)

print "Got data from",address

s.sendto(message,address)

except(KeyboardInterrupt,SystemExit):

raise

except:

traceback.print_exc()

UDP查询时间

服务端:

#coding=utf-8

import socket,traceback,time,struct

host=''

port=51432

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

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

s.bind((host,port))

while 1:

try:

message,address=s.recvfrom(8192)

print message,address

secs=int(time.time())

secs-=60*60*24

secs+=220898800

reply=struct.pack("!I",secs)

s.sendto(reply,address)

except(KeyboardInterrupt,SystemExit):

raise

except:

traceback.print_exc()

客户端:

#coding=utf-8

import socket,sys,struct,time

hostname='localhost'

port=51432

host=socket.gethostbyname(hostname)

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

s.sendto('',(host,port))

print "Loking for replies"

buf=s.recvfrom(2048)[0]

if len(buf)!=4:

print "Wrong-size reply %d:%s"%(len(buf),buf)

sys.exit(1)

secs=struct.unpack("!I",buf)[0]

secs-=220898800

print time.ctime(int(secs))

超时:

#coding=utf-8

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()

四、ftp

#coding=utf-8

#自动抓取并打开远程文件文件

import os,sys

from getpass import getpass

from ftplib import FTP

nonpassive=False

filename='monkeys.jpg'

dirname='.'

sitename='ftp.rmi.net'

userinfo=('lutz',getpass('pwd?'))

if len(sys.argv)>1:filename=sys.argv[1]

print('Connection...')

connection=FTP(sitename)

connection.login(*userinfo)

connection.cwd(dirname)

if nonpassive:

connection.set_pasv(False)

print('Downloading...')

localfile=open(filename,'wb')

connection.retrbinary('RETR'+filename,localfile.write,1024)

connection.quit()

localfile.close()

if input('Open file?') in ['Y','y']:

from PP4E.System.Media.playfile import playfile

playfile(filename)

五、广播

接收端:

#coding=utf-8

import socket,traceback

host = ''

port = 51423

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

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

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

s.bind((host,port))

while True:

try:

message,address =s.recvfrom(8192)

print "Got data from ",address

s.sendto("I am here",address)

except (KeyboardInterrupt,SystemExit):

raise

except:

traceback.print_exc()

发送端:

#coding=utf-8

import socket,sys

dest = ('',51423)

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

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

s.sendto("Hello",dest)

print "Looking for replies; press Ctrl-C to stop."

while True:

(buf,address) = s.recvfrom(2048)

if not len(buf):

break

print "Received from %s: %s" % (address,buf)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值