前言:本文是學習網易微專業的《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 客戶端