Python服務器運維筆記:第二章Linux - 1.2.9 socket編程

前言:本文是學習網易微專業的《python全棧工程師》 中的《服務器運維開發工程師》專題的課程筆記,歡迎學習交流。同時感謝老師們的精彩傳授!

一、課程目標

  • 什麼是socket
  • 服務端開發
  • 客戶端開發

二、詳情解讀

2.1.socket編程

在實際的TCP/IP應用程序甘托克,並不需要去實現細節部分,通常會由系統提供socket接口,這個接口又被稱爲套接字,基於這個接口就可以輕鬆的開發網絡通訊程序。
python標準庫提供的socket模塊,可以實現服務端與客戶端的編程。
在這裏插入圖片描述

2.2.服務端開發

1.服務器端一直運行,直至關閉
2.服務器端口是固定的
3.服務器擁有固定的ip或者主機名
4.服務器運行後,會等待客戶端連接
5.一旦連接成功,就可以相互發送消息

python標準庫中的socket
1.s = socket(套接字類別,SOCK_STREAM)
套接字類別:AF_INET表示IP尋址,AF_UNIX表示文件類型套接字。
返回一個socket對象實例

2.s.bind(("127.0.0.1", 8000))
參數是元組類型,( ip地址,端口號)

3.s.listen(num)
啓動監聽,如果提供了num,表示允許的最多連接數,超過的將被拒絕

4.socket, address = s.accept()
等待連接,如果有連接,返回由客戶端socket對象與address信息組成的元組。

服務端的實現如下:

先下載安裝抓包工具:wireshark。下載鏈接:https://www.wireshark.org/download.html

接着,服務端實現代碼如下:

from socket import socket, AF_INET, SOCK_STREAM

# AF_INET  - IPV4 協議
# SOCK_STREAM - 套接字類型爲面向連接的可靠字節流
# 創建socket對象
s_server = socket(AF_INET, SOCK_STREAM)

# 綁定IP與端口號
s_server.bind(("127.0.0.1", 8000))

# 開始監聽
s_server.listen()

# 等待請求,在沒有請求到來之前,會一直等待(堵塞)
print("waiting...........")
client_sock, client_addr  = s_server.accept()
print(client_sock, client_addr)
print("-"*50)
client_sock.close()
s_server.close()
print("服務器關閉")
2.3.客戶端開發
c = socket(AF_INET, SOCK_STREAM)
C.connect(("127.0.0.1", 8000))
c.close()

客戶端實現如下:

from socket import *

# 創建一個socket對象
c_client = socket(AF_INET, SOCK_STREAM)
c_client.connect(("127.0.0.1", 8000))
c_client.close()

分別運行上面的服務端代碼和客戶端代碼後,用wireshark抓包結果如下:
在這裏插入圖片描述

2.4.消息發送

1.s = socket(AF_INET, SOCK_STREAM)
2.s.send(data) ,其中data表示字節類型
3.s.recv(bufsize),其中bufsize表示讀取多少字節數據

服務端示例代碼如下:

from socket import *

# 創建socket對象
s_server = socket(AF_INET, SOCK_STREAM)

# 綁定IP與端口號
s_server.bind(("127.0.0.1", 8000))

# 開始監聽
s_server.listen()

client_sock, client_addr  = s_server.accept()
print("waiting...........")
print(client_sock, client_addr)
print("-"*50)

# 創建一個永久循環
while True:
    
    message = client_sock.recv(1024)
    # message 是字節,需要解碼
    message = message.decode("utf-8")
    if not message:
        continue
    if message == "quit":
        # 發出關閉信號
        client_sock.close()
        break
    else:
        print("客戶端消息>>>", message)
        client_sock.send(b"continue...")

s_server.close()
print("服務器關閉")

客戶端代碼示例如下:

from socket import *

# 創建一個socket對象
c_client = socket(AF_INET, SOCK_STREAM)
c_client.connect(("127.0.0.1", 8000))

while True:
    message = input("請輸入消息:")
    if not message:
        continue
    c_client.send(bytes(message, encoding="utf-8"))
    
    if message == "quit":
        break
    result = c_client.recv(1024)
    print(result.decode("utf-8"))
c_client.close()

三、課程小結

  • 01 socket模塊
  • 02 服務器端
  • 03 客戶端
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章