python------Socket網略編程
上節課程回顧:
靜態變量:與類無關,不能訪問類裏的任何屬性和方法。
類方法:只能訪問類變量。
屬性:把一個方法變成靜態屬性,
反射:
__new__:先於__init__執行;
__call__:
1 class Foo(object): 2 def __call__() 3 print "call" #這是什麽??? 4 5 #Foo() #後面跟一個括號是實例化 6 Foo()() #後面跟2個括號是執行call方法
抓住異常:
try
......
except (ValueError,KeyError), e #in 2.7
except (ValueError,KeyError) as e #in 3.x
else: #沒發生異常就執行
finally #無論如何都執行
raise (觸發自己寫的異常)
except Exception as e #放在異常處理最後面,
異常處理:
斷言(assert): 返回為假就不往下執行了。(例如銀行轉賬,要確保正確才能轉賬)
例如:assert type(XXX) is str
本節內容:
一.動態導入模塊
1 import importlib
2
3 __import__(‘import_lib.metaclass‘) # 這是解釋器自己內部用的
4 #importlib.import_module(‘import_lib.metaclass‘) #與上面這句效果一樣,官方建議用這個
#__metaclass__用來定義這個類以怎樣的形式被創建(我們很少用到)
本節課內容:
1.socket :網絡上的數據收發。
tcp/ip send ,recv
udp
family address (地址簇):
AF.INET (ipv4)
AF.INET6
AF.UNIX (local
socket protocol type (協議類型)
sock.SOCK_STREAM (tcp/ip)
sock.SOCK_DGRAM
服務端步驟:
server = socket.socket(AF.INET,sock.SOCK_STREAM)
server.bind(localhost,9999)
server.listen()
while True:
conn, addr = server.accept() #阻塞
while True:
print("new conn", addr)
data = conn.recv(1024) #不應該超過8192(8k)#recv默認是阻塞的
if not data:
break #客戶端已斷開,conn.recv收到的就是空數據,
print(data)
conn.send(data.upper())
客戶端步驟:
client = socket.socket()
client.connect(serverip,9999)
client.send(data)
client.recv(data)
1 import socket
2 import os
3 server = socket.socket()
4 server.bind((‘localhost‘,1111))
5
6 server.listen()
7
8 while True:
9 conn,addr = server.accept()
10 print("new conn:",addr)
11 while True:
12 data = conn.recv(1024)
13 if not data:
14 print("客戶端已斷開")
15 break
16 print("執行指令:", data)
17 cmd_res = os.popen(data.decode()).read() #接收字符串,執行結果也是字符串
18 conn.send(cmd_res.encode("utf-8"))
19
20 server.close()
1 import socket
2 client = socket.socket()
3 client.connect((‘localhost‘,1111))
4
5 while True:
6 cmd = input(">>:").strip() #cmd = input(b">>:").strip()如果前面直接加b,則只能傳英文
7 if len(cmd) == 0 : continue
8 client.send(cmd.encode())
9 cmd_res = client.recv(1024)
10
11 print(cmd_res.decode())
12
13 client.close()
運行結果:
>>:ipconfig
Windows IP 配置
以太網適配器 以太網:
媒體狀態 . . . . . . . . . . . . : 媒體已斷開連接
連接特定的 DNS 後綴 . . . . . . . :
無線局域網適配器 本地連接* 2:
媒體狀態 . . . . . . . . . . . . : 媒體已斷開連接
連接特定的 DNS 後綴 . . . . . . . :
無線局域網適配器 本地連接* 4:
媒體狀態 . . . . . . . . . . . . : 媒體已斷開連接
連接特定的 DNS 後綴 . . . . . . . :
無線局域網適配器 本地連接* 5:
媒體狀態 . . . . . . . . . . . . : 媒體已斷開連接
連接特定的 DNS 後綴 . . . . . . . :
無線局域網適配器 WLAN:
連接特定的 DNS 後綴 . . . . . . . : workgroup
本地鏈接 IPv6 地址. . . . . . . . : fe80::1585:c613:2947:4558%17
IPv4 地址 . . . . . . . . . . . . : 172.25.81.3
子網掩碼 . . . . . . . . . . . . : 255.255.0.0
默認網關. . . . . . . . . . . . . : 172.25.81.1
註:1.服務器與客戶端解碼編碼四次。
2.(1024)傳輸與接收數據大小的問題:
緩沖區:比如一次只能接收1024,發送了2000,省下的900左右會存在緩沖區了,等下次發送,但這樣會亂,怎麽解決?
答:多收幾次。
問:但具體多收幾次呢?
答:服務器自己計算一下自己將要給客戶端多大的數據,幾次能接收完,先把次數發給客戶端。
python------Socket網略編程