面向對象多繼承(c3算法)、網絡基礎和編寫網絡相關的程序

1、面向對象多繼承(c3算法)python

a、有多個父類先找左,再找右,以下示例:linux

    class A(object):
        pass

    class B(object):
        def f1(self):
            print('B')

    class C(A,B):
        pass

    obj = C()
    obj.f1()
    print(C.__mro__)  # 打印出C類的繼承順序,結果以下一行:
    # (<class '__main__.C'>, <class '__main__.A'>, <class '__main__.B'>, <class 'object'>)
先找左,再找右

b、經典類和新式類算法

  python2(實際上是python2.2之後):windows

         經典類瀏覽器

         新式類:若是本身或本身的前輩只要有人繼承object,那麼此類就是新式類。服務器

  python3:網絡

         新式類架構

 

  經典類和新式類的查找成員的順序不同:socket

         經典類:一條道走到黑(深度優先);ide

         新式類:c3算法實現(python2.3更新時有介紹c3算法);

                Foo + (C,D,F,G) + (G,D,G,W) + (I,G,D,G,W)

                       Foo, I,B,……

                       獲取第一個表頭 和 其餘表尾進行比較:

                              不存在則拿走。

                              若是存在,則放棄,而後獲取第二個表的表頭再次和其餘表的表尾進行比較。

總結:

  經典類:一條道走到黑(深度優先);

  新式類:簡單理解就是留個根,(科學原理是c3算法);

注意事項:super是遵循__mro__的執行順序的。

2、網絡基礎

a、開發模式:

  (開發一個軟件)須要安裝客戶端:CS架構,client  -- >  server

  (開發一個網站)使用瀏覽器訪問:BS架構,browser  -- >  server

b、如何實現相互通訊:

  方式一:編寫兩個軟件,軟件之間相互通訊;

  方式二:兩我的直接鏈接(經過網線);

  方式三:同一個教室中的多臺電腦相互通訊(經過交換機);

                     使用IP地址:ipconfig/ifconfig查看

  方式四:和三亞的女朋友通訊(經過交換機 + n*路由器);

                     三亞女朋友須要 租公網IP

總結:

       1)相互通訊的本質是發送01010101(高低電頻);

       2)交換機的做用(組成一個局域網,並在局域網內發廣播);

       3)經過ipconfig(windows系統)/ifconfig(蘋果系統和linux系統)查看本身的內網IP;

       4)花錢 租公網IP;

 

3、編寫網絡相關的程序

a、基於socket模塊實現網絡通訊,以下代碼示例:

  服務端簡單示例:

import socket #導入模塊                  socket(騷k特)

server = socket.socket() # 建立服務端socket 對象
ip_port = ('192.168.15.57',8001) #建立ip和端口
server.bind(ip_port)#綁定ip和端口            bind(班的)                    
server.listen()#開機                   listen(雷森) 
print('服務端準備開始接收客戶端的鏈接')

# 等待客戶端來鏈接,若是沒人來就傻傻的等待。
# conn 是客戶端和服務端鏈接的對象(傘),服務端之後要經過該對象進行收發數據。
# addr 是客戶端的地址信息。
# #### 阻塞,只有有客戶端進行鏈接,則獲取客戶端鏈接而後開始進行通訊。
print('等待中')
conn,addr = server.accept()#阻塞中          accept(A可賽科特)
print('已經有人鏈接上了,客戶端信息:',conn,addr)

# 經過對象去獲取(客戶端經過傘給我發送的消息)
# 1024表示:服務端經過對象(傘)獲取數據時,一次性最多拿1024字節。
client_smg = conn.recv(1024)
client_smg = client_smg.decode('utf-8')#解碼       decode(抵扣的)解碼
print(client_smg)#看一下客戶端發給我什麼內容

conn.send('你猜'.encode('utf-8'))#給客戶端回覆一個消息 encode(銀扣的)編碼

conn.close()#  與客戶端斷開鏈接(放開那把傘)   close(可樓子)
server.close()#  關閉服務器的服務

客戶端簡單示例:

import socket

client= socket.socket()#建立客戶端socket對象

#客戶端向服務器發起鏈接請求(遞傘)
#阻塞,去鏈接,直到鏈接成功後纔會繼續向下走
server_ip_port = ('192.168.15.57',8001)
client.connect(server_ip_port)#        連接服務端connect(肯奶可特)

#鏈接上服務端後,向服務端發送信息
client.send('約嗎'.encode('utf-8'))

#客戶端等待服務器給他發送消息
from_msg = client.recv(1024)      recv(蕊c無)
from_msg_0 = from_msg.decode('utf-8')#解碼
print(from_msg_0)#消息發送來了

client.close()

  

總結:

  服務端:

              accept,阻塞:等待客戶端來鏈接。

              recv,   阻塞:等待客戶端發來數據。

  客戶端:

              connect,阻塞:一直在鏈接,直到鏈接成功才往下運行其餘代碼。

              recv,    阻塞:等待服務端發來數據。

問題一:爲何要網絡通訊發送的是字節?而不是字符串?

       python3,send/recv 都是字節

       python2,send/recv 都是字符串

b、上述示例運行一次,服務端和客戶端只能鏈接一次,發送和接收一次消息後服務端關閉,沒法再鏈接其餘客戶端,現要實現服務端一旦啓動,服務端和客戶端之間能夠持續發送和接收消息,且與某個客戶端斷開後還能夠繼續等待其餘客戶端來鏈接,以下示例:

加一個while循環

  

 

socket模塊實現網絡通訊UDP

服務端

import socket
#建立一個udp協議下的socket,須要使用參數type
udp_server = socket.socket(type=socket.SOCK_DGRAM) #DGRAM : datagram  數據報
#拿到一個地址,啓動程序的時候,告訴電腦,你給我這個程序分配8001端口.
ip_port = ('192.168.15.113',8001)
#綁定IP地址和端口
udp_server.bind(ip_port)

print('準備接收消息了...')
#接收消息,from_client_msg來自客戶端的消息,client_addr客戶端的地址('192.168.15.113', 8001)
from_client_msg,client_addr = udp_server.recvfrom(1024)  #阻塞住了
#發送消息
udp_server.sendto(b'gunduzi',client_addr)
#關閉udp的socket對象
udp_server.close()

 客戶端

import socket
udp_client = socket.socket(type=socket.SOCK_DGRAM)
server_ip_port = ('192.168.15.113',8001)

udp_client.sendto(b'hello',server_ip_port)      sendto(森頭)

from_server_msg,server_addr = udp_client.recvfrom(1024)  recvfrom(蕊c無服ruang木)
print(from_server_msg)
print(server_addr)  

udp_client.close()
相關文章
相關標籤/搜索