1.使用函数 2.装饰器 3.异常处理 4.socket |
1.使用函数
给函数传递参数时,可以灵活传递实参数量。形参在定义时,使用到列表、字典。
# 定义函数
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.嵌套函数
2.2.高阶函数
网络上两个程序通过一个双向通信连接实现的数据交换,该连接的一端称为一个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) # 仅仅监听了ipv4、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())