day29 網絡基礎之網絡協議和通訊

1、網絡編程的計劃:編程

一、socket 編程緩存

二、併發編程服務器

   多進程網絡

   多線程多線程

   協程架構

   IO模型併發

   socketserversocket

三、MySQL數據tcp

2、內容學習:ide

一、客戶端\服務器架構

  (1)服務端和客戶端之間基於網絡的通訊叫作CS架構

  (2)服務端具有的特色:

      #基於網絡通訊

      #一直對外提供服務

      #服務端應該支持併發

二、互聯網協議是計算機界的標準

  互聯網協議的功能:定義計算機如何接入internet,以及接入internet的計算機通訊的標準。

  計算機(硬件)->os(操做系統)->應用軟件   

三、osi七層協議 

四、tcp\ip五層模型講解

(1)物理層功能:主要是基於電器特性發送高低電壓(電信號),高電壓對應數字1,低電壓對應數字0

(2)數據鏈路層:

  數據鏈路層由來:單純的電信號0和1沒有任何意義,必須規定電信號多少位一組,每組什麼意思

  數據鏈路層的功能:定義了電信號的分組方式

(3)網絡層:

    #IP地址+mac地址標識全世界範圍內獨一無二的機器

 #ip地址+mac地址+端口標識  全世界範圍獨一無二的軟件

  服務器的IP 端口地址是捆綁式固定的,不能改變

  網絡層的ip幫咱們區分子網,以太網層的mac幫咱們找到主機

(4)傳輸層:

  傳輸層功能:創建端口到端口的通訊

  補充:端口範圍0-65535,0-1023爲系統佔用端口

(5)應用層:

  應用層功能:規定應用程序的數據格式。

  #應用軟件產生數據——操做系統(tcp/udp協議封包、IP地址打包、以太網打包)——

   物理層(高低電平)傳輸——接收 拆包。。。。。

五、socket

  Socket是應用層與TCP/IP協議族通訊的中間軟件抽象層,它是一組接口。

ip與port的綁定就標識了互聯網中獨一無二的一個應用程序

六、套接字

七、套接字的工做流程:

八、socket()的模塊函數用法

1 import socket
 2 socket.socket(socket_family,socket_type,protocal=0)
 3 socket_family 能夠是 AF_UNIX 或 AF_INET。socket_type 能夠是 SOCK_STREAM
   或 SOCK_DGRAM。protocol 通常不填,默認值爲 0。
4 5 獲取tcp/ip套接字 6 tcpSock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 7 8 獲取udp/ip套接字 9 udpSock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) 10 11 因爲 socket 模塊中有太多的屬性。咱們在這裏破例使用了'from module import *'語句。
  使用 'from socket import *',咱們就把 socket 模塊裏的全部屬性都帶到咱們的命名空間裏了,
  這樣能 大幅減短咱們的代碼。
12 例如tcpSock = socket(AF_INET, SOCK_STREAM)
服務端套接字函數
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() 建立一個與該套接字相關的文件

 例子:簡單的套字節通訊

import socket
#一、先買手機
phone=socket.socket(socket.AF_INET,socket.SOCK_STREAM) #指的是TCP協議

# 二、綁定電話卡
phone.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1)
phone.bind(("127.0.0.1",8079))  #s.bind()    綁定(主機,端口號)到套接字

#三、開機
phone.listen(5)     #s.listen()  開始TCP監聽

#四、等電話
print("starting....")
conn,addr=phone.accept()  #s.accept()  被動接受TCP客戶的鏈接,(阻塞式)等待鏈接的到來

print(conn)
print(addr)

#五、發收消息
data=conn.recv(1024)    #s.recv()  接收TCP數據
conn.send(data.upper()) #s.send()   發送TCP數據(send在待發送數據量大於己端緩存區剩餘空間時,數據丟失,不會發完)

# 六、掛電話
conn.close()  #s.close()    關閉套接字
# 七、關機
phone.close()
服務端
import socket

#一、先買手機
phone=socket.socket(socket.AF_INET,socket.SOCK_STREAM)

#二、打電話
phone.connect(("127.0.0.1",8079))    #cnnect 主動出示化TCP服務器鏈接

#三、發收消息
phone.send("hello world".encode("utf_8")) #s.send() 發送TCP數據(send在待發送數據量大於己端緩存區剩餘空間時,數據丟失,不會發完)
data=phone.recv(1024)  #接收TCP數據
print(data.decode("utf-8"))

#四、關閉
phone.close()  #s.close()  關閉套接字
客戶端

循環:

import socket
#一、先買手機
phone=socket.socket(socket.AF_INET,socket.SOCK_STREAM) #指的是TCP協議

# 二、綁定電話卡
phone.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1)
phone.bind(("127.0.0.1",8070))  #s.bind()    綁定(主機,端口號)到套接字

#三、開機
phone.listen(5)     #s.listen()  開始TCP監聽

#四、等電話
print("starting....")
conn,addr=phone.accept()
    #五、發收消息
while True:#通訊循環
    data=conn.recv(1024)    #s.recv()  接收TCP數據
    conn.send(data.upper()) #s.send()   發送TCP數據(send在待發送數據量大於己端緩存區剩餘空間時,數據丟失,不會發完)
# 六、掛電話
conn.close()  #s.close()    關閉套接字
# 七、關機
phone.close()
服務端
import socket

#一、先買手機
phone=socket.socket(socket.AF_INET,socket.SOCK_STREAM)

#二、打電話
phone.connect(("127.0.0.1",8070))    #cnnect 主動出示化TCP服務器鏈接

#三、發收消息
while True:
    msg=input(">>: ").strip()
    if not msg:continue
    phone.send(msg.encode("utf_8")) #s.send() 發送TCP數據(send在待發送數據量大於己端緩存區剩餘空間時,數據丟失,不會發完)
    data=phone.recv(1024)  #接收TCP數據
    print(data.decode("utf-8"))

#四、關閉
phone.close()  #s.close()  關閉套接字
客戶端

保持服務器一直對外提供服務

import socket
#一、先買手機
phone=socket.socket(socket.AF_INET,socket.SOCK_STREAM) #指的是TCP協議

# 二、綁定電話卡
phone.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1)
phone.bind(("127.0.0.1",8071))  #s.bind()    綁定(主機,端口號)到套接字

#三、開機
phone.listen(5)     #s.listen()  開始TCP監聽

#四、等電話
print("starting....")
while True:  #連接循環
    conn,addr=phone.accept()  #s.accept()  被動接受TCP客戶的鏈接,(阻塞式)等待鏈接的到來
    print(addr)
    #五、發收消息
    while True:#通訊循環
        try:
            data=conn.recv(1024)    #s.recv()  接收TCP數據
            conn.send(data.upper()) #s.send()   發送TCP數據(send在待發送數據量大於己端緩存區剩餘空間時,數據丟失,不會發完)
        except ConnectionAbortedError:
            break
# 六、掛電話
    conn.close()  #s.close()    關閉套接字
# 七、關機
    phone.close()
保持一直對外提供服務的服務器
相關文章
相關標籤/搜索