30.1. 企業級開發進階2.1:TCP程式設計
農曆五月初二 宜 抽菸 抽菸有利於提神,增加思維敏捷 晚上加班 晚上是程式設計師精神最好的時候
不宜 上微博 今天的微博充滿負能量 玩FlappyBird 除非你想玩到把手機砸了
座位朝向:面向南方寫程式,BUG 最少。 今日宜飲:果味汽水,運動飲料 女神親近指數:★★★★☆
廢話少說,進入正題,這節課開始我們學習基於TCP協議的網路程式設計
** 本節內容如下** * 什麼是TCP協議 * TCP網路程式設計——服務端程式開發 * TCP網路程式設計——客戶端程式開發
1. 關於TCP協議那點事兒
TCP協議是一種面向連線、保證資料傳輸的高可靠性的,一對一的傳輸層協議
TCP協議保證連線的可靠性是通過它的通訊特徵來確定的:首先保證正確建立可靠的連線,主要通過三次通訊握手來確定;其次保證資料包的數量和順序不會丟失和錯亂,如果發現資料包傳送失敗會重新傳送;第三當連線終止時,連線雙方都需要獨立關閉自己的連線,通過四次揮手確定連線斷開。
從上面的操作過程我們可以發現一個規律,伺服器端總是處於等待狀態,客戶端會主動發起和伺服器的連線,通過三次握手建立可靠的連線並進行資料的傳輸。一直到最後客戶端發起關閉連線請求,經過四次揮手操作斷開和伺服器之間的連線
所以正常情況下, TCP網路程式設計一般是首先開發服務端程式,然後開發客戶端程式。
2. TCP服務端程式設計
python中的網路程式設計,就類似生活中將兩臺PC用網線連線起來一樣,網線表示網路,需要水晶頭將網線連線到電腦上才能正常的操作;python提供了這樣的水晶頭:套接字(socket)
2.1 API解析
- socket模組:TCP網路程式設計,需要引入這個模組
- socket():socket模組中的socket()物件,可以用於建立套接字:socket(family, type)
- 引數family:連線的IP地址型別,socket.AF_INET表示的是IPv4的地址,socket.AF_INET6表示的是IPv6的地址
- 引數type:連線資料傳輸型別,使用socket.SOCK_STREAM表示使用流協議(TCP)
- 返回值:一旦建立成功,返回一個套接字物件,姑且命名為sc
- bind():用於將套接字和主機IP以及埠號Port進行繫結,就是上面例圖中將網線插到電腦上 bind()是socket物件的方法,可以直接通過socket物件呼叫 bind()方法只接受一個元組型別的引數,將ip地址和埠填寫進去即可 sc.bind(("192.168.1.1", 8080))
- listener(count):監聽連線的方法,一般在服務端程式設計中使用,呼叫socket物件的listener()方法,就會讓伺服器程式處於等待客戶端連線
- 引數count:一個整數資料,表示允許最大的連線數量
- accept():接收客戶端的連線,這是一個阻塞方法,一旦程式執行到accept()方法,就會處於等待狀態不繼續執行,一直到有客戶端連線進來才會繼續執行程式
- recv():用於接收遠端套接字物件傳送的資料
- 返回值:遠端套接字傳送的資料
sendall(data):用於向遠端主機傳送資料
* 引數data:用於傳送的資料
close():套接字的關閉方法,通訊完畢之後,一定要記得關閉和伺服器之間的TCP連線,釋放資源。
2.2 TCP服務端程式編寫
服務端程式開發,首先建立服務端程式的套接字物件,將套接字物件跟伺服器IP地址和埠進行繫結;其次開始設定啟動監聽,等待客戶端的連線;如果客戶端一旦連線進來,就可以和客戶端之間進行資料的收發操作;最後執行完成,關閉套接字
service.py程式碼如下: ```
import socket
# 建立服務端套接字
sc = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 繫結服務端IP地址和埠
sc.bind(("192.168.10.115", 8888))
# 開始監聽
sc.listen(10)
# 等待連線
print("服務端程式啟動完成,等待連線中...")
conn, addr = sc.accept()
print("客戶端%s連線成功" % str(addr))
# 向客戶端傳送訊息
conn.sendall("你好,客戶端,我是伺服器".encode("utf-8"))
# 關閉和這個客戶端的套接字
conn.close()
```
執行上面的程式,我們會看到如下的等待介面:
此時,我們通過telnet來訪問以下這個ip和對應的埠,會發現伺服器給我們傳送了資料 同時我們執行的服務端也接收到了使用者的請求
2.3 TCP客戶端程式編寫
相對於服務端程式設計,客戶端程式設計就變得比較簡單了,我們通過 建立客戶端套接字物件,通過呼叫套接字物件的connect(ip, port)方法連線指定ip和埠port的伺服器,然後和伺服器之間進行資料通訊,通訊完畢關閉客戶端套接字。
client.py程式碼如下: ```
import socket
sc = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sc.connect(("192.168.10.115", 8888))
msg = sc.recv(1024)
print("接收到伺服器的歡迎訊息:" + msg.decode("utf-8"))
sc.sendall("你好伺服器".encode("utf-8"))
sc.close()
```
執行前面開發的伺服器端程式
執行客戶端程式,接收到伺服器的資料:
以上,就是我們在進行TCP網路程式設計時的服務端程式設計和客戶端程式設計的方式,下一節中我們使用TCP程式設計來開發一個簡易的對講機程式,實現服務端和客戶端的資料通訊
相關文章
- 30.企業級開發進階2:網路程式設計程式設計
- 30.2. 企業級開發進階2.2:TCP實戰TCP
- 33.企業級開發進階6:資料庫操作資料庫
- 32.企業級開發進階4:正規表示式
- 30.4. 企業級開發進階2.4:服務端快捷開發服務端
- 31.2企業級開發進階3.2:接收電子郵件
- 併發程式設計進階程式設計
- 從需求出發:專業程式設計師進階之路程式設計師
- 【Go進階—併發程式設計】MutexGo程式設計Mutex
- 企業級應用建設之道:高程式碼+低程式碼開發
- 29.企業級開發進階1:檔案輸入輸出流[IO操作]
- 【Go進階—併發程式設計】ContextGo程式設計Context
- 【Go進階—併發程式設計】WaitGroupGo程式設計AI
- shell程式設計進階程式設計
- 企業級開發框架----------Django框架Django
- 探索企業安全建設進階路徑
- Linux企業級開發技術(1)——epoll企業級開發之簡介Linux
- Linux企業級開發技術(2)——epoll企業級開發之epoll介面Linux
- Linux企業級開發技術(3)——epoll企業級開發之epoll模型Linux模型
- Linux企業級開發技術(4)——epoll企業級開發之epoll例程Linux
- 低程式碼開發平臺,快速開發企業級系統
- 企業級軟體開發新模式:低程式碼模式
- [.net 物件導向程式設計進階] (1) 開篇物件程式設計
- 程式設計師職業發展之路思考:工程師的等級階梯程式設計師工程師
- 程式設計師的進階之路程式設計師
- 安全可控的企業級低程式碼開發平臺
- Linux企業級開發技術(6)——libevent企業級開發之記憶體管理Linux記憶體
- Java進階之路——從初級程式設計師到架構師Java程式設計師架構
- 淺談企業級產品設計
- 企業級 Web 開發的挑戰Web
- 13.程式程式設計進階:函式程式設計函式
- Linux企業級開發技術(7)——libevent企業級開發之鎖和執行緒Linux執行緒
- TCP程式設計(七)TCP程式設計
- iOS進階課程-Newsstand程式設計iOS程式設計
- Go進階之網路程式設計Go程式設計
- shell程式設計,實戰高階進階教學程式設計
- 關於PHP在企業級開發領域的訪談——企業級開發,PHP準備好了嗎?PHP
- 簡單設計企業級JOB平臺