30.1. 企業級開發進階2.1:TCP程式設計

大牧莫邪發表於2017-05-27

農曆五月初二 宜 抽菸 抽菸有利於提神,增加思維敏捷 晚上加班 晚上是程式設計師精神最好的時候

不宜 上微博 今天的微博充滿負能量 玩FlappyBird 除非你想玩到把手機砸了

座位朝向:面向南方寫程式,BUG 最少。 今日宜飲:果味汽水,運動飲料 女神親近指數:★★★★☆


廢話少說,進入正題,這節課開始我們學習基於TCP協議的網路程式設計

** 本節內容如下** * 什麼是TCP協議 * TCP網路程式設計——服務端程式開發 * TCP網路程式設計——客戶端程式開發

1. 關於TCP協議那點事兒

TCP協議是一種面向連線、保證資料傳輸的高可靠性的,一對一的傳輸層協議

TCP協議保證連線的可靠性是通過它的通訊特徵來確定的:首先保證正確建立可靠的連線,主要通過三次通訊握手來確定;其次保證資料包的數量和順序不會丟失和錯亂,如果發現資料包傳送失敗會重新傳送;第三當連線終止時,連線雙方都需要獨立關閉自己的連線,通過四次揮手確定連線斷開。

建立可靠連線的三次握手

斷開連線的四次揮手操作

從上面的操作過程我們可以發現一個規律,伺服器端總是處於等待狀態,客戶端會主動發起和伺服器的連線,通過三次握手建立可靠的連線並進行資料的傳輸。一直到最後客戶端發起關閉連線請求,經過四次揮手操作斷開和伺服器之間的連線

所以正常情況下, TCP網路程式設計一般是首先開發服務端程式,然後開發客戶端程式。

2. TCP服務端程式設計

python中的網路程式設計,就類似生活中將兩臺PC用網線連線起來一樣,網線表示網路,需要水晶頭將網線連線到電腦上才能正常的操作;python提供了這樣的水晶頭:套接字(socket)

TCP網路程式設計就是這麼回事

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和對應的埠,會發現伺服器給我們傳送了資料 telnet訪問得到伺服器傳送的資料 同時我們執行的服務端也接收到了使用者的請求 服務端接收到客戶端的連線

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程式設計來開發一個簡易的對講機程式,實現服務端和客戶端的資料通訊

相關文章