網絡編程之 網絡知識

一 網絡的原理python

 1 客戶端和服務端都是基於網路運行的。編程

 2 互聯網協議:就是計算機界的英語設計模式

 3 五層協議:應用層,傳輸層,網絡層,數據鏈路層,物理層這五層組成的緩存

  物理層:internet:發送和接收電信號(高低電頻)服務器

  數據鏈路層:ethernet:一組電信號叫作數據幀,也叫數據報,數據報分爲兩個部分:報頭(head)和數據(data)兩部分。網絡

    head包含的有:發送者/源地址:6個字節架構

           接收者/目標地址:6個字節socket

           數據類型:6個字節tcp

   mac地址:每個網卡在生產的時候就會產生一個mac地址。函數

   計算機的通訊就是靠吼,也叫廣播包,只限於局域網的使用。世界上的全部網絡都是有不少的局域網組成的。

  網絡層:ip地址:分爲ipv4和ipv6.

    每個IP地址都是有四個十進制數字組成

     ip協議:規定了網絡的地址協議叫作ip協議,它定義的地址也叫作ip地址。

     子網地址:表示子網絡特徵的一個參數

     網關地址:爲了跨子網的通訊,能和外網之間進行通訊。

      網關與網關之間的通訊就叫作路由協議。

    mac地址:爲了找到局域網絡的位置。

    ip地址:爲了肯定子網的位置

    ARP協議:將局域網內的mac地址轉成網關地址。

    mac地址和ip地址能找到世界上獨一無二的一臺機器。

  傳輸層:tcp協議和udp協議,每啓動一個軟件對應者一個端口。

   端口:肯定軟件在計算機上面的位置。

   ip地址加上端口:能夠肯定世界上一臺計算機上的一個軟件的位置。

  應用層:產生一個數據。

 發數據是一層一層的封包;收數據是一層一層的解包。

 tcp協議:首先發生連接的請求,創建好雙向的連接,而後才能進行客戶端和服務器端的傳輸,接收到數據之後回覆肯定後丟掉原有的數據再關閉連接。稱爲可靠協議。

 udp協議:不會創建鏈接,只有數據一發送出去,就會直接丟掉原有的數據。稱爲不可靠協議

二 socket模塊

 1 socket模塊就是一個接口,也是套接字模塊。

  2 socket抽象層:就是一個編程接口。

   客戶端/服務器架構

          即C/S架構

             在互聯網中到處都是C/S架構,就至關咱們是客戶端,而服務端就是咱們想要在電腦上查詢的內容。

          爲什麼學習socket必定要先學習互聯網協議:

          1.首先:本節課程的目標就是教會你如何基於socket編程,來開發一款本身的C/S架構軟件

          2.其次:C/S架構的軟件(軟件屬於應用層)是基於網絡進行通訊的

          3.而後:網絡的核心即一堆協議,協議即標準,你想開發一款基於網絡通訊的軟件,就必須遵循這些標準。

          4.最後:就讓咱們從這些標準開始研究,開啓咱們的socket編程之旅    

  socket層                     

 3 socket模塊的經常使用方法:

  AF_UNIX:一臺機器直接的通訊

  AF_INET:基於網路的通訊

  socket.socket():獲取套接字對象。

  listen:監聽連接數量

  accept:等待客戶端連接。

  connect:連接服務端

  socket.SOCK_STREAM:tcp協議,也是一個數據流

  send:發送消息

  recv:接收消息

  decode:解碼

  encode:編碼

  SO_REUSEADDR:重用ip和端口

服務器端:

import socket
phone=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
phone.bind(('127.0.0.1',8091))
phone.listen(5)
while True:
    conn,addr=phone.accept()
    while True:
        try:
            print(conn.recv(1024).decode('utf-8'))
            msg=input('>>>:')
            if not msg:continue
            conn.send(msg.encode('utf-8'))
        except Exception:
            break
    conn.close()
phone.close()

 客戶端:

import socket
phone=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
phone.connect(('127.0.0.1',8091))
while True:
    msg=input('>>>')
    phone.send(msg.encode('utf-8'))
    if not msg:continue
    print(phone.recv(1024).decode('utf-8'))
phone.close()

 

服務端套接字函數
s.bind()    綁定(主機,端口號)到套接字
s.listen()  開始TCP監聽
s.accept()  被動接受TCP客戶的鏈接,(阻塞式)等待鏈接的到來

客戶端套接字函數
s.connect()     主動初始化TCP服務器鏈接
s.connect_ex()  connect()函數的擴展版本,出錯時返回出錯碼,而不是拋出異常

公共用途的套接字函數
s.recv()            接收TCP數據
s.send()            發送TCP數據(send在待發送數據量大於己端緩存區剩餘空間時,數據丟失,不會發完)
s.sendall()         發送完整的TCP數據(本質就是循環調用send,sendall在待發送數據量大於己端緩存區剩餘空間時,數據不丟失,循環調用send直到發完)
s.recvfrom()        接收UDP數據
s.sendto()          發送UDP數據
s.getpeername()     鏈接到當前套接字的遠端的地址
s.getsockname()     當前套接字的地址
s.getsockopt()      返回指定套接字的參數
s.setsockopt()      設置指定套接字的參數
s.close()           關閉套接字

面向鎖的套接字方法
s.setblocking()     設置套接字的阻塞與非阻塞模式
s.settimeout()      設置阻塞套接字操做的超時時間
s.gettimeout()      獲得阻塞套接字操做的超時時間

面向文件的套接字的函數
s.fileno()          套接字的文件描述符
s.makefile()        建立一個與該套接字相關的文件

       socket是什麼  

      Socket是應用層與TCP/IP協議族通訊的中間軟件抽象層,它是一組接口。在設計模式中,Socket其實就是一個門面模式,它把複雜的TCP/IP協議族隱藏在

    Socket接口後面,對用戶來講,一組簡單的接口就是所有,讓Socket去組織數據,以符合指定的協議。

      因此,咱們無需深刻理解tcp/udp協議,socket已經爲咱們封裝好了,咱們只須要遵循socket的規定去編程,寫出的程序天然就是遵循tcp/udp標準的。

相關文章
相關標籤/搜索