day 26 網絡編程基礎

1.軟件開發架構:
開發軟件,必需要開發一套 客戶端 與 服務端。

客戶端與服務端的做用
服務端: 24小時不間斷提供服務
客戶端: 若是想要找服務,就去尋找服務並享受

軟件開發架構分爲兩種:
C/S架構:
Client: 客戶端
Server: 服務端

優勢:
軟件的使用穩定,而且能夠節省網絡資源。

缺點:
1.若用戶想在同一個設備上使用多個軟件,必須下載多個客戶端。
2.軟件的每一次更新,客戶端也必須跟着從新下載更新。

C/S架構的軟件:
例如: 電腦上的QQ、Pycharm等...手機端(移動端)的微信、王者榮耀等...

B/S架構:
Browser: 瀏覽器(客戶端)
Server: 服務端

優勢:
以瀏覽器充當客戶端,無需用戶下載多個軟件,也無需用戶下載更新軟件版本,
直接在瀏覽器上訪問須要使用的軟件。

缺點:
消耗網絡資源過大,當網絡不穩定時,軟件的使用也會不穩定。


B/S架構的軟件:
例如: 在瀏覽器(客戶端)上輸入某個軟件的域名(http://oldboyedu.com/)。


2.後期學習
網絡編程、併發編程、數據庫開發 能夠開發一套C/S架構的軟件(防優酷系統)。
前端html、css、js,web框架(網絡編程、併發編程) 能夠開發一套B/S架構的軟件(bbs系統)。


3.網絡編程

- 網絡編程發展歷史
全部先進的技術都源自於軍事,但願經過遠程獲取數據,因此出現了"網絡編程"。

早期如何實現遠程通訊:
- 打電話 ---> 電話線
- 純平電腦(大屁股電腦) ---> 網線,有線網卡
- 筆記本電腦 ---> 有線網卡、無線網卡

要實現遠程通訊必須具有:
1.物理鏈接介質 ---> 網卡....

2.互聯網協議
- 人與人之間溝通的介質: 中文、英語
- 計算機之間溝通的介質: "互聯網協議"


4.互聯網協議
互聯網協議又稱爲網絡七層協議,OSI七層協議,OSI是一個世界標準組織。

OSI七層協議:
- 應用層
- 表示層
- 會話層
- 傳輸層
- 網絡層
- 數據鏈路層
- 物理鏈接層

學習由下到上:
須要優先了解的協議一共5層:

- 物理鏈接層
基於電信號發送二進制的數據0101010111。
010: 你 you
101: 我 I

- 數據鏈路層
數據鏈路層的 "以太網協議",專門用於處理基於電信號發送二進制的數據。

以太網協議:
1.規定好電信號數據的分組方式。
2.每一臺鏈接網線的電腦都必需要由一塊 "網卡"。
- 網卡由不一樣廠商生產的
- 每塊網卡都會有世界上獨一無二12位的編號 "mac"地址。
- 前6位: 廠商號
- 後6位: 流水號

- 交換機:
可讓多臺電腦鏈接到一塊兒。

基於以太網協議發送數據:
特色:
廣播、單播

弊端:
廣播風暴、不能跨局域網通訊。

- 互聯網:
讓局域網之間進行通訊。

- 網絡層
IP地址: 用於標識惟一的一臺計算機(局域網)的地址。
IP: 點分十進制
最小值: 0.0.0.0
最大值: 255.255.255.255

IPV4(瞭解):
一開始用電腦的人很少,因此出現IPV4的協議版本。

IPV6(瞭解):
括號IP。

本機IP: 迴環地址 127.0.0.1 ---> localhost

- 傳輸層
TCP/UDP協議,他們都是基於端口工做的。

- 端口號: 標識電腦上某個一個軟件。

- 端口號範圍: 0-65535

注意:
1.操做系統中,通常0-1024的端口都被默認使用了(0-1024不要動)
2.儘可能使用8000以後的端口號 8001

開發中經常使用軟件的默認端口號 (默寫) :
mysql: 3306
mongodb: 27017
Django: 8000
Tomcat: 8080
Flask: 5000
Redis: 6379


若想服務端與客戶端進行通訊,必需要創建鏈接,產生雙向通道。
一條是客戶端往服務端發送消息的。
另外一條是服務端往客戶端發送消息的。

- 應用層
http
ftp


總結:
ip:用於惟一標識某一臺計算機的位置。
port: 端口用於確認計算機上的一個應用軟件。

ip + port: 世界上某一臺電腦上的一個應用軟件。

- TCP協議的工做原理:

- TCP是一個流式協議

- 三次握手,四次揮手(*******):
- 三次握手建鏈接:
創建雙向通道,創建好鏈接。
- listen: 監聽
- established: 確認請求創建鏈接

- 發送數據:
write
read
客戶端往服務端發送數據,數據存放在內存中,須要服務端確認收到,數據纔會在內存中釋放掉。

不然,會隔一段時間發送一次,讓服務端返回確認收到。
在一段時間內,若服務端仍是不返回確認收到,則取消發送。並釋放內存中的數據。

- 四次揮手斷鏈接:
- TIME_WAIT: 時間等待



5.Socket:

1.什麼是Socket?
socket是一個模塊,能夠寫一套C/S架構的套接字。

2.爲何要使用Socket?
socket套接字會封裝好各層協議的工做。
好處:
能夠節省開發成本。

3.如何使用
import socket


注意: 客戶端與服務端必須尊循:
一端send,另外一端recv
不一樣兩端同時send或recv

6.初始socket套接字
  1.客戶端
#客戶端
import socket

# 買手機
client = socket.socket()

# 往服務端撥號
# client: 至關於客戶端往服務端挖的管道
client.connect(
    # ip + port: 尋找服務端
    ('127.0.0.1', 9527)
)

# 客戶端向服務端說話

client.send('你好 小賤賤'.encode('utf-8'))
data = client.recv(1024)
print(data)

# 關閉鏈接
client.close()
 
1.客戶端
#服務端
import socket

# 默認指定TCP協議
# 買手機
server = socket.socket()
# 插卡
server.bind(
    # ip + port
    ('127.0.0.1', 9527)
)
# 開機,等待接聽
server.listen(5)  # listen(5) 半鏈接池

# 監聽是否有消息
# conn: 至關於服務端往客戶端挖的管道
conn, addr = server.accept()
print(addr)

# 聽客戶端給我說話
data = conn.recv(1024).decode('utf-8')  # 能夠接收1024字節數據
print(data)

conn.send(b'hello xiao tank')

# 掛電話
conn.close()

# 關機
server.close()
7.循環通訊套接字

  1.客戶端css

import socket
client = socket.socket()
client.connect(
    ('127.0.0.1', 9527)
)


while True:
    send_msg = input('client---> server:')

    # 服務端往客戶端發送的數據
    client.send(send_msg.encode('utf-8'))

    if send_msg == 'q':
        break

    # 服務端返回的數據
    data = client.recv(1024).decode('utf-8')
    print(data)


client.close()
 2.服務端
import socket

server = socket.socket()
server.bind(
    ('127.0.0.1', 9527)
)
server.listen(5)  # listen(5) 半鏈接池

conn, addr = server.accept()
print(addr)

while True:
    # 接收客戶端發送過來的消息
    data = conn.recv(1024).decode('utf-8')  # 能夠接收1024字節數據
    print(data)

    if data == 'q':
        break

    # 讓服務端數據發送給客戶端的消息
    send_msg = input('server--->client: ').encode('utf-8')
    conn.send(send_msg)


conn.close()
 

8.服務端多個客戶端html

  1.客戶端前端

import socket

client = socket.socket()

client.connect(
    ('127.0.0.1', 8888)
)

while True:
    send_msg = input('client---》server:')

    client.send(send_msg.encode('utf-8'))

    if send_msg == 'q':
        break

    data = client.recv(1024).decode('utf-8')
    print(data)

client.close()

 

  2.服務端mysql

import socket
server = socket.socket()
server.bind(
    ('127.0.0.1', 8888)
)
server.listen(5)  # 半鏈接池,能夠「等待5個用戶接受服務」

while True:
    # 等待客戶端鏈接過來
    conn, addr = server.accept()
    print(addr)

    # 循環接收客戶端數據
    while True:
        try:
            data = conn.recv(1024).decode('utf-8')
            print(data)

            # mac和linux系統bug: b''
            if len(data) == 0:
                continue

            if data == 'q':
                break

            conn.send(data.encode('utf-8'))

        except Exception as e:
            print(e)
            break

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