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