用python编写程序:按照C/S模型编写两个程序,一个是服务器程序,一个是客户端程序。设计的程序包含以下功能: 1.Windows环境下运行,服务器和客户端有显示界面。 2.服务器端监听端口,有客户请求时就显示客户端IP地址、端口和收到的数据。 3.设计数据包格式(通信协议),至少包括起始字符,特征字符,数据,校验码,结束字符等。 4.客户端连接服务器,连接成功后向服务器发送数据。 5.服务器对收到的数据包进行判断,确定数据包是否合法,如收到合法数据包就显示接收到的数据,并发送响应数据包;如收到不合法数据则显示不合法。 6.服务器能同时接收多个客户请求。
时间: 2024-02-06 20:10:28 浏览: 22
服务器端程序:
```python
import socket
import threading
import tkinter as tk
class ServerGUI:
def __init__(self, root):
self.root = root
self.root.title("服务器")
self.root.geometry("300x200")
self.label1 = tk.Label(self.root, text="客户端IP地址")
self.label1.pack(pady=5)
self.text1 = tk.Text(self.root, height=1)
self.text1.pack(pady=5)
self.label2 = tk.Label(self.root, text="客户端端口")
self.label2.pack(pady=5)
self.text2 = tk.Text(self.root, height=1)
self.text2.pack(pady=5)
self.label3 = tk.Label(self.root, text="收到的数据")
self.label3.pack(pady=5)
self.text3 = tk.Text(self.root, height=5)
self.text3.pack(pady=5)
self.start_button = tk.Button(self.root, text="开始监听", command=self.start_listen)
self.start_button.pack(pady=5)
self.stop_button = tk.Button(self.root, text="停止监听", command=self.stop_listen, state=tk.DISABLED)
self.stop_button.pack(pady=5)
self.status_label = tk.Label(self.root, text="")
self.status_label.pack(pady=5)
self.server_socket = None
self.client_sockets = []
self.is_listening = False
def start_listen(self):
self.server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
self.server_socket.bind(('localhost', 8000))
self.server_socket.listen(5)
self.is_listening = True
self.start_button.config(state=tk.DISABLED)
self.stop_button.config(state=tk.NORMAL)
self.status_label.config(text="正在监听")
while self.is_listening:
client_socket, (client_ip, client_port) = self.server_socket.accept()
self.client_sockets.append(client_socket)
self.text1.delete(1.0, tk.END)
self.text1.insert(tk.END, client_ip)
self.text2.delete(1.0, tk.END)
self.text2.insert(tk.END, client_port)
data = client_socket.recv(1024)
if data:
data_str = data.decode('utf-8')
self.text3.delete(1.0, tk.END)
self.text3.insert(tk.END, data_str)
response_data = self.handle_data(data_str)
client_socket.send(response_data.encode('utf-8'))
self.server_socket.close()
self.status_label.config(text="")
self.start_button.config(state=tk.NORMAL)
self.stop_button.config(state=tk.DISABLED)
def stop_listen(self):
self.is_listening = False
for client_socket in self.client_sockets:
client_socket.close()
def handle_data(self, data_str):
if data_str.startswith("$") and data_str.endswith("#"):
data_list = data_str[1:-1].split(",")
if len(data_list) == 2:
try:
num1 = int(data_list[0])
num2 = int(data_list[1])
result = num1 + num2
return "${}#".format(str(result))
except ValueError:
return "$ERROR#"
else:
return "$ERROR#"
else:
return "$ERROR#"
if __name__ == '__main__':
root = tk.Tk()
server_gui = ServerGUI(root)
root.mainloop()
```
客户端程序:
```python
import socket
import tkinter as tk
class ClientGUI:
def __init__(self, root):
self.root = root
self.root.title("客户端")
self.root.geometry("300x200")
self.label1 = tk.Label(self.root, text="服务器IP地址")
self.label1.pack(pady=5)
self.text1 = tk.Text(self.root, height=1)
self.text1.pack(pady=5)
self.label2 = tk.Label(self.root, text="服务器端口")
self.label2.pack(pady=5)
self.text2 = tk.Text(self.root, height=1)
self.text2.pack(pady=5)
self.label3 = tk.Label(self.root, text="发送的数据")
self.label3.pack(pady=5)
self.text3 = tk.Text(self.root, height=1)
self.text3.pack(pady=5)
self.send_button = tk.Button(self.root, text="发送", command=self.send_data)
self.send_button.pack(pady=5)
self.status_label = tk.Label(self.root, text="")
self.status_label.pack(pady=5)
self.client_socket = None
def send_data(self):
server_ip = self.text1.get(1.0, tk.END).strip()
server_port = int(self.text2.get(1.0, tk.END).strip())
data = self.text3.get(1.0, tk.END).strip()
if server_ip and server_port and data:
self.status_label.config(text="正在发送")
self.client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
self.client_socket.connect((server_ip, server_port))
self.client_socket.send(data.encode('utf-8'))
response_data = self.client_socket.recv(1024)
response_data_str = response_data.decode('utf-8')
if response_data_str == "$ERROR#":
self.status_label.config(text="数据不合法")
else:
self.status_label.config(text="接收到的数据:{}".format(response_data_str))
self.client_socket.close()
self.client_socket = None
if __name__ == '__main__':
root = tk.Tk()
client_gui = ClientGUI(root)
root.mainloop()
```
这个程序实现了一个简单的加法运算服务。客户端连接服务器后,发送两个整数,服务器计算它们的和并返回结果给客户端。通信协议的格式为"$num1,num2#",表示要求计算num1和num2的和,服务器返回"$result#",表示计算结果为result。如果收到的数据不符合协议格式,则返回"$ERROR#"。