Python之網絡編程(二)Socket套接字

socket套接字

  1. 爲什麼學習socket必定要先學習互聯網協議?python

    • 首先C/S架構是基於網絡通訊的編程

      而後網絡的核心即一堆網絡協議,也就是協議標準。若是你想開發一款基於網絡通訊的軟件,就必須遵循這些標準設計模式

  2. socket層:socket處於應用層與傳輸層之間,提供了一些簡單的接口. 避免與操做系統之間對接,省去了至關繁瑣複雜的操做.socket在python中屬於一個模塊.爲咱們提供了這些簡單的功能.網絡

  1. socket是什麼?架構

    • socket是應用層與TCP/IP協議通訊的中間軟件抽象層,它是一組接口。在設計模式中,Socket其實就是一個門面模式,它把複雜的TCP/IP協議族隱藏在Socket接口後面,對用戶來講,一組簡單的接口就是所有,讓Socket去組織數據,以符合指定的協議。socket

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

  2. 基於TCP協議的socket函數

    • 套接字的分類:
      • 基於文件類型的套接字家族:AF_UNIX(在Unix系統上,一切皆文件,基於文件的套接字調用的就是底層的文件系統來取數據,兩個套接字進程同時運行在同一機器,能夠經過訪問同一個文件系統間接完成通訊)
      • 基於網絡類型的套接字家族:AF_INET (python支持不少種地址家族,可是因爲咱們只關心網絡編程,因此大部分時候咱們只使用AF_INET)
    • 套接字的工做流程:
      • 例子:若是你要給你的一個朋友打電話,先撥號,朋友聽到電話鈴聲後提起電話,這時你和你的朋友就創建起了鏈接,就能夠講話了。等交流結束,掛斷電話結束這次交談。 生活中的場景就解釋了這工做原理。
  3. 套接字函數學習

    • 服務端套接字函數:操作系統

      import socket
       phone = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
       # 1.服務端套接字函數
       phone.bind('主機ip地址',端口號)  #綁定到(主機,端口號)套接字
       phone.listen() #開始TCP監聽
       phone.accept() #被動接受TCP客戶的鏈接,等待鏈接的到來
    • 客戶端套接字函數:

      import socket
       phone = socket.socket(socket.AF_INET,socket.SOCK_STREAM)#買手機
       phone.connect()  #主動鏈接服務端的ip和端口
       phone.connect_ex()  #connect()函數的擴展版本,出錯的時候返回錯碼,而不是拋出異常
    • 服務端和客戶端的公共用途的嵌套字函數:

      phone.recv() #接受TCP數據
       phone.send() #發送TCP數據
       phone.recvfrom() #接受UDP數據
       phone.sendto() #發送UDP數據
       phone.getpeername() #接收到當前套接字遠端的地址
       phone.getsockname() #返回指定套接字的參數
       phone.setsockopt() #設置指定套接字的參數
       phone.close() #關閉套接字
    • server:

      import socket
      
      # 買電話
      phone = socket.socket(socket.AF_INET,socket.SOCK_STREAM)  # 默認基於TCP協議的socket
      
      # 綁定電話卡
      phone.bind(('192.168.14.198',8848))  # 綁定IP地址和端口
      
      # 開機監聽
      phone.listen(5)
      print(111)
      
      # 等待鏈接
      conn, addr = phone.accept() # 阻塞
      print(conn,addr)
      
      from_client_data = conn.recv(1024)  # 至多接受1024個字節  阻塞
      print(f'來自客戶端{addr[0]}的消息:{from_client_data.decode("utf-8")}')
      
      to_client_data = input('>>>')
      conn.send(to_client_data.encode('utf-8'))
      conn.close()
      phone.close()
    • client

      import socket
      
      # 買電話
      phone = socket.socket(socket.AF_INET,socket.SOCK_STREAM)  # 默認基於TCP協議的socket
      
      # 撥號打電話
      phone.connect(('127.0.0.1',8848))
      data = input('請輸入>>>')
      
      phone.send(data.encode('utf-8'))
      from_server_data = phone.recv(1024)
      print(f'來自服務端的消息:{from_server_data}')
      
      
      # 關閉電話
      phone.close()
相關文章
相關標籤/搜索