1. 程式人生 > >python------Socket網略編程

python------Socket網略編程

enc 1.3 .so 16px list strip raise 變量 exceptio

上節課程回顧

靜態變量:與類無關,不能訪問類裏的任何屬性和方法。

類方法:只能訪問類變量。

屬性:把一個方法變成靜態屬性,

反射:

__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網略編程