在您的伺服器和客戶端程式中,設定配置檔案可以幫助您更輕鬆地管理變數和參數,例如IP位址、埠號、檔案路徑等。以下是一個簡單的示例,展示如何使用配置檔案來管理這些設定:
您可以使用 JSON 格式或 INI 格式來存儲配置設定。以下是使用 JSON 格式的範例。
config.json
{
"server": {
"port": 37020,
"broadcast_port": 8500
},
"client": {
"report_interval": 5,
"file_save_path": "received_files"
}
}
在您的 Python 程式中,您可以使用 json 模組來讀取這個配置檔案。
伺服器端程式示例
import json
# 讀取配置檔案
def load_config():
with open('config.json', 'r') as file:
return json.load(file)
# 在 Server 類中使用配置
class Server:
def __init__(self, root):
self.config = load_config()
self.server_port = self.config['server']['port']
# 其他初始化...
客戶端程式示例
import json
# 讀取配置檔案
def load_config():
with open('config.json', 'r') as file:
return json.load(file)
# 在客戶端中使用配置
def send_report():
config = load_config()
report_interval = config['client']['report_interval']
# 其他報告邏輯...
確保在伺服器和客戶端中適當地引用配置檔中的參數,這樣當您需要更改設定時,只需修改配置檔,而無需編輯程式碼。
在讀取配置檔時,您應該考慮增加錯誤處理,以防配置檔不存在或格式不正確。
def load_config():
try:
with open('config.json', 'r') as file:
return json.load(file)
except FileNotFoundError:
print("配置檔案不存在,請檢查檔案路徑。")
return {}
except json.JSONDecodeError:
print("配置檔案格式錯誤。")
return {}
修正重複代碼的主要目的是提高程式的可讀性和可維護性。以下是一些常見的做法,您可以依據情況選擇適合的方法:
如果您在伺服器端和客戶端中有重複的邏輯,考慮將這些邏輯抽取到一個共用函式中。
例子:檔案接收和處理的邏輯
假設伺服器和客戶端都有接收檔案的邏輯,您可以將該邏輯抽取成一個共用的函式:
def receive_file(socket, file_path):
with open(file_path, 'wb') as f:
while True:
data = socket.recv(1024)
if not data:
break
f.write(data)
然後在伺服器和客戶端中呼叫這個函式:
# 伺服器端
receive_file(server_socket, 'server_received_file.txt')
# 客戶端
receive_file(client_socket, 'client_received_file.txt')
如果您的伺服器和客戶端具有相似的屬性和行為,考慮將它們封裝到一個基礎類別中,然後繼承它。
例子:建立一個基礎類別
class BaseSocketHandler:
def __init__(self, socket):
self.socket = socket
def receive_file(self, file_path):
with open(file_path, 'wb') as f:
while True:
data = self.socket.recv(1024)
if not data:
break
f.write(data)
class ServerHandler(BaseSocketHandler):
def handle_request(self):
self.receive_file('server_received_file.txt')
class ClientHandler(BaseSocketHandler):
def send_request(self):
self.receive_file('client_received_file.txt')
如果某些邏輯依賴於配置參數,您可以將這些參數抽取到一個配置管理模組中,然後在需要的地方引用它們。
例子:共用的配置管理
class Config:
def __init__(self):
self.config = load_config()
def get_server_port(self):
return self.config['server']['port']
def get_report_interval(self):
return self.config['client']['report_interval']
如果有一些重複的驗證邏輯,可以考慮使用裝飾器來包裝相應的函式。
例子:簡單的裝飾器
def validate_socket(func):
def wrapper(socket, *args, **kwargs):
if not socket:
print("無效的 socket")
return
return func(socket, *args, **kwargs)
return wrapper
@validate_socket
def send_data(socket, data):
socket.send(data)
透過這些方法,您可以有效地減少重複代碼,提高程式的可讀性和可維護性。選擇適合您具體情況的方法,並逐步進行重構。