1. 導入必要的庫
首先,需要導入Python的`socket`庫,它提供了創建和管理socket連接的功能。
?
```python
import socket
```
?
2. 創建服務器端socket
使用`socket.socket()`函數創建一個服務器端的socket對象,指定協議族(如`socket.AF_INET`表示IPv4)和socket類型(如`socket.SOCK_STREAM`表示TCP協議)。
?
```python
server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
```
3. 綁定地址和端口
將服務器socket綁定到一個特定的IP地址和端口號上,以便客戶端可以連接到這個地址和端口。
?
```python
host = '0.0.0.0' # 監聽所有可用的網絡接口
port = 8000 # 選擇一個未被占用的端口號
server_socket.bind((host, port))
```
?
4. 監聽連接請求
調用`listen()`方法開始監聽傳入的連接請求,參數指定了等待連接隊列的最大長度。
?
```python
server_socket.listen(5) # 允許最多5個客戶端等待連接
```
?
?5. 接受和處理連接
使用`accept()`方法接受客戶端的連接請求,該方法會阻塞,直到有客戶端連接為止。接受連接后,返回一個新的socket對象用于與客戶端通信,以及客戶端的地址信息。
?
```python
client_socket, client_address = server_socket.accept()
print(f"Connected by {client_address}")
```
?
?6. 處理客戶端請求
通過新創建的socket對象與客戶端進行數據交互,可以使用`recv()`方法接收數據,`send()`方法發送數據。
?
```python
data = client_socket.recv(1024) # 接收最多1024字節的數據
print(f"Received: {data.decode()}")
?
response = "Hello, client!" # 準備發送的數據
client_socket.send(response.encode()) # 發送數據給客戶端
```
?
?7. 關閉連接
通信完成后,關閉客戶端socket和服務器socket以釋放資源。
?
```python
client_socket.close()
server_socket.close()
```
?
# 完整示例代碼
?
```python
import socket
?
# 創建服務器socket
server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
?
#綁定地址和端口
host = '0.0.0.0'
port = 8000
server_socket.bind((host, port))
?
# 開始監聽
server_socket.listen(5)
print(f"Server is listening on {host}:{port}")
?
# 接受和處理連接
while True:
? ? client_socket, client_address = server_socket.accept()
? ? print(f"Connected by {client_address}")
? ??
? ? try:
? ? ? ? data = client_socket.recv(1024)
? ? ? ? print(f"Received: {data.decode()}")
?
? ? ? ? response = "Hello, client!"
? ? ? ? client_socket.send(response.encode())
? ? finally:
? ? ? ? client_socket.close() # 確保關閉連接
?
# 關閉服務器socket(通常在程序結束時)
server_socket.close()
```
?
?注意事項
?
- 在實際應用中,服務器通常需要處理多個客戶端的并發連接,可以使用多線程或多進程技術來實現。
- 為了提高服務器的穩定性和安全性,還需要考慮異常處理、數據驗證、加密通信等方面的問題。
- 確保服務器綁定的端口沒有被其他程序占用,并且防火墻設置允許該端口的通信。