30.2. 企業級開發進階2.2:TCP實戰

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

1. 簡易對講程式的需求

對講機程式,就是雙方互相通話的過程,簡單一點的邏輯就是雙方每次只能說一句話,然後等待對方回答之後繼續說話。

2. 程式設計實現服務端

```

import socket

# 建立服務端套接字物件
service = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

# 繫結主機和埠號
service.bind(("", 8888))

# 啟動監聽
service.listen(1)

# 接收客戶端連線
print("服務端程式啟動成功,等待客戶端接入.....")
conn, addr = service.accept()
print("客戶端已經接入,可以進行通訊" + str(addr) + ";等待客戶端傳送訊息...")

# 傳送歡迎訊息
conn.sendall("天王蓋地虎,寶塔鎮河妖".encode("utf-8"))

# 迴圈讀取訊息
while True:
    # 接收並列印客戶端傳送訊息
    msg = conn.recv(1024)
    msg = msg.decode("utf-8")
    print("客戶端:" + msg)
    # 如果客戶端傳送bye字串,跳出迴圈
    if msg == "bye":
        service.sendall("over!")
        break;
    # 向客戶端傳送訊息
    info = input("請輸入要傳送給客戶端的訊息:")
    info = info.encode("utf-8")
    conn.sendall(info)
# 關閉該客戶端的連線
conn.close()

```

3. 程式設計實現客戶端

```

import socket

# 建立客戶端套接字物件
client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

# 連線伺服器
client.connect(("192.168.10.115", 8888))

# 迴圈處理髮送訊息
while True:
    # 接收伺服器的訊息
    msg = client.recv(1024)
    msg = msg.decode("utf-8")
    print("伺服器:" + msg)
    # 如果一旦接收到over!字串,跳出迴圈
    if msg=="over!":
        print("程式退出")
        break;
    # 給伺服器傳送訊息
    info = input("請輸入要傳送的訊息:")
    info = info.encode("utf-8")
    client.sendall(info)
#關閉客戶端套接字物件
client.close()

```

4. 測試程式

首先執行服務端程式 服務端程式等待中

執行客戶端程式 客戶端程式啟動

開始互相傳送訊息 服務端 服務端控制檯介面

客戶端 客戶端控制檯介面

整體效果如上所述,對於TCP網路程式設計的部分內容都有涉及,大家在獨立完成的基礎上,可以思考一個問題:怎麼退出對話?!

相關文章