zero python.2

1.使用函數 python

2.裝飾器 web

3.異常處理 服務器

4.socket 網絡


wKiom1imhcqyLOXMAABm6i-XhL0154.jpg

1.使用函數
python2.7


  給函數傳遞參數時,能夠靈活傳遞實參數量。形參在定義時,使用到列表、字典。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.裝飾器
socket


  


2.1.嵌套函數
tcp

  

2.2.高階函數ide

  


3.異常處理函數


  


4.socket


  網絡上兩個程序經過一個雙向通訊鏈接實現的數據交換,該鏈接的一端稱爲一個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())
相關文章
相關標籤/搜索