1.使用函数 python 2.装饰器 web 3.异常处理 服务器 4.socket 网络 |
给函数传递参数时,能够灵活传递实参数量。形参在定义时,使用到列表、字典。ssh
# 定义函数 def f (hostip, port='52161'): print('host is %s' %hostip) print('port is %s' %port) # 调用函数 f('127.0.0.1') f('localhost' , '3303') f(port='123', hostip='129')
# 定义函数f def f (*args): print('f', args) # 调用函数f f(1,3,5,7,9,1100) f('1', '3', '5', '7', '9', '1100') args = ['hongkong', 'qingtao', 'tokey'] f(args) f(*args) # 定义函数f2 def f2(**args): print('f2', args) # 调用函数f2 f2(**{'hostname':'task', 'port':'52161'}) args={'hostname':'localhost', 'port':'52161', 'value':True} f2(**args)
2.1.嵌套函数tcp
2.2.高阶函数ide
网络上两个程序经过一个双向通讯链接实现的数据交换,该链接的一端称为一个socket。一个socket是对tcp信息、ip信息的封装后用来为应用层服务的,是一个通信的句柄。
4.1.python2.7
模拟一个114问询台(2.7版本的程序实例):
# 服务器端 #!/usr/bin/env python # coding:utf-8 # Version:2.7 import socket HOST = '10.10.14.9' # Symbolic name meaning all available interfaces PORT = 50007 # Arbitrary non-privileged port s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) s.bind((HOST, PORT)) s.listen(1) print 'Listening...' conn, addr = s.accept() print 'connected...' while True: data = conn.recv(1024) if data == "bye": conn.close() print 'client: Thanks.' break print "Client: " + data data = raw_input('server: ') conn.sendall(data)
# 客户端 #!/usr/bin/env python # coding:utf-8 # Version:2.7 import socket HOST = '10.10.14.9' # The remote host PORT = 50007 # The same port as used by the server s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) s.connect((HOST, PORT)) while True: client = raw_input('client: ') if client == 'bye': s.sendall(client) s.close() print 'server: Welcome' break s.sendall(client) data = s.recv(1024) print 'server: ' + data
4.2.python3.5
这里讨论的socket网络层仅使用INET,传输层使用TCP。
4.2.1.web访问
建立socket,当咱们浏览网页http://donatello.cc/时,就等于建立一个“客户端socket”。
cs = socket.socket(socket.AF_INET, socket.SOCK_STREAM) cs.connect(('localhost', 8080)) cs.send(b'hello') data = cs.recv(4096)
这里建立的套接字s,既是用于发送请求、同时也接受响应。客户端套接字一般存活于一个交换周期,就自动销毁。
服务端的socket稍微复杂点
ss = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # 仅仅监听了ipv四、tcp,使用()空白表示全都监听 ss.bind(('localhost', 8080)) #监听了本地的8080端口,‘’表示监听全部本地接口 ss.listen(15) # 15个之外的连接会被拒绝 while True: (clientsocket, address) = ss.accept() print('new connection: ', address) print('clientsocket.recv(): ', clientsocket.recv(4096)) clientsocket.send(b'ack')
使用socket通信时,客户端仅仅使用了client-socket,服务端同时使用了server-socket、client-socket。一般由客户端的套接字来发起一个请求,从而在客户端、与服务端创建起一个对等的会话。会话创建后,就开始处理send、recv。当recv返回0字节时,说明另一端已经关闭、或者正在关闭。
服务端控制台:
C:\Python36\python3.exe C:/Users/Administrator/PycharmProjects/专题:socket/createServerSocket.py new connection: ('127.0.0.1', 4681) clientsocket.recv(): b'hello' new connection: ('127.0.0.1', 4682) clientsocket.recv(): b'hello'
4.2.2.ssh访问
server端
server = socket.socket() server.bind(('localhost', 221)) server.listen(10) while True: conn, addr = server.accept() while True: data = conn.recv(1024) if not data: print('client is lost.') break print('cmd executing.') com_res = os.popen(data.decode()).read() conn.send(com_res.encode())
client端
client = socket.socket() client.connect(('localhost', 221)) while True: cmd = input('# ').strip() if 0 == len(cmd): continue client.send(cmd.encode('utf-8')) cmd_result = client.recv(1024) print(cmd_result.decode())