当前位置:   article > 正文

python的tkinter、socket库开发tcp的客户端和服务端_tkinter socket

tkinter socket
一、tcp通讯流程和开发步骤
1、tcp客户端和服务端通讯流程图

套接字是通讯的利器连接时要经过三次握手建立连接,断开连接要经过四次挥手断开连接。

2、客户端开发流程

1)创建客户端套接字

2)和服务端器端套接字建立连接

3)发送数据

4)接收数据

5)关闭客户端套接字

3、服务端开发流程

1)创建服务端套接字

2)绑定ip和端口号

3)设置监听

4)等待客户端连接

5)接收数据

6)发送数据

7)关闭套接字

二、客户端的实现

使用python的tkinter库实现图形化界面,使用类来实现tcp的客户端和服务端

1、构造方法__init__初始化图形界面

设置了三个按钮

1)连接服务器的按钮: 用来发送请求连接服务端。

2)断开连接按钮:用来关闭连接。

3)发送消息按钮:来向服务端发送消息。

2、连接服务器的函数

1) tk.messagebox.showinfo: 弹窗,用来提示用户。

2socket.socket(socket.AF_INET, socket.SOCK_STREAM):  创建套接字。

参数1:ipv4协议,参数2:表示tcp协议

3)tcp_client_socket.connect(): 连接服务端,参数必须是一个元组。

3、发送消息函数

1)send_entry.get(): 获取输入框的内容。

2)encode():编码。

3)tcp_client_socket.send(): 发送数据。

4)Thread(): 创建线程,防止阻塞。

参数1:target=要执行的函数,参数2:守护主线程。

5) .start(): 开启线程。

4、接收消息函数

recv_data = tcp_client_socket.recv(1024).decode('utf-8'): 接收消息并解码。

5、断开连接函数

 tcp_client_socket.close(): 关闭客户端套接字。

三、服务端的实现
1、构造方法__init__初始化图形界面

设置了四个按钮:

1)启动服务端按钮:用来初始化服务端。

2)接收连接按钮:接收客户端请求的连接。

3)接收消息按钮:接收客户端发来的消息,需要手动接收。

4)发送消息按钮:向客户端发送消息。

2、启动服务端函数

1)tcp_server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM):创建服务器端套接字对象。

2)tcp_server_socket.bind(("", 8888)): 绑定IP地址与端口号,端口可以自行设置,但客户端必须和服务端保持一致。

3)tcp_server_socket.listen(5):监听连接,5表示最大连接数。

3、接收连接函数

 conn_socket, ip_port = tcp_server_socket.accept():等待接收客户端连接请求。

4、发送消息函数

 conn_socket.send(): 发送数据

5、接收消息函数

conn_socket.recv(1024).decode():接收数据并解码

conn_socket.close(): 关闭连接

tcp_server_socket.close():关闭套接字

四、效果图

使用说明:

1、先启动服务端,在启动客户端,再服务端点击接收连接按钮接收客户端发来的连接请求

2、客户端输入消息,点击发送消息

3、服务端点击接收消息,就会在下发文本框显示消息

4、服务端回消息,客户端会自动接收消息并显示在下方的文本框

五、代码
1、客户端
  1. import socket
  2. import tkinter as tk
  3. import tkinter.messagebox
  4. from threading import Thread
  5. # 创建tcp客户端
  6. class TcpClientSocket:
  7. def __init__(self):
  8. self.tcp_client_socket = None
  9. self.root = tk.Tk()
  10. self.root.title('tcp客户端')
  11. self.root.geometry('500x350')
  12. # 连接
  13. self.con_btn = tk.Button(self.root, text="连接服务端", width=10, command=self.connect)
  14. self.con_btn.place(x=100, y=20)
  15. # 断开连接
  16. self.discon_btn = tk.Button(self.root, text="断开连接", width=10, command=self.disconnect)
  17. self.discon_btn.place(x=300, y=20)
  18. # 文本输入框
  19. self.send_entry = tk.Entry(self.root, width=50)
  20. self.send_entry.place(x=50, y=80)
  21. # 发送消息按钮
  22. self.send_btn = tk.Button(self.root, text="发送消息", command=self.send)
  23. self.send_btn.place(x=420, y=75)
  24. # 消息框
  25. self.msg_test = tk.Text(self.root, width=70, height=16)
  26. self.msg_test.place(x=2, y=125)
  27. self.root.mainloop()
  28. # 连接服务端
  29. def connect(self):
  30. try:
  31. if self.tcp_client_socket:
  32. tk.messagebox.showinfo('提示', '已是连接状态')
  33. # 每次连接服务端就将上一次的记录清除
  34. self.msg_test.delete(1.0, tk.END)
  35. self.send_entry.delete(0, tk.END)
  36. # 创建客户端socket
  37. self.tcp_client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
  38. # 连接,端口可以改变
  39. self.tcp_client_socket.connect(('127.0.0.1', 8888))
  40. self.msg_test.insert(tk.END, "连接到服务端, 请输入信息...\n")
  41. except Exception as e:
  42. self.msg_test.insert(tk.END, f"连接失败的原因是: {e}")
  43. # 发送消息
  44. def send(self):
  45. # 从输入框获取数据
  46. input_data = self.send_entry.get()
  47. self.tcp_client_socket.send(input_data.encode(encoding='utf-8'))
  48. self.msg_test.insert(tk.END, f"客户端:{str(input_data)}\n")
  49. # 使用线程,防止未响应
  50. receive_thread = Thread(target=self.receive, daemon=True)
  51. receive_thread.start()
  52. def receive(self):
  53. if self.tcp_client_socket:
  54. rec_msg = self.tcp_client_socket.recv(1024).decode(encoding='utf-8')
  55. self.msg_test.insert(tk.END, f"服务端:{str(rec_msg)}\n")
  56. # 断开连接
  57. def disconnect(self):
  58. if self.tcp_client_socket:
  59. self.send_entry.delete(0, tk.END)
  60. self.msg_test.insert(tk.END, "断开连接")
  61. self.tcp_client_socket.send('#'.encode(encoding='utf-8')) # 发送’#‘断开连接
  62. self.tcp_client_socket.close() # 关闭客户端
  63. else:
  64. tk.messagebox.showinfo('提示', '未连接到服务端')
  65. if __name__ == '__main__':
  66. TcpClientSocket()
2、服务端
  1. import socket
  2. import tkinter as tk
  3. from threading import Thread
  4. import tkinter.messagebox
  5. class TcpServerSocket:
  6. def __init__(self):
  7. self.conn_socket = None
  8. self.tcp_server_socket = None
  9. self.root = tk.Tk()
  10. self.root.title('tcp服务端')
  11. self.root.geometry('500x350')
  12. # 连接
  13. self.con_btn = tk.Button(self.root, text="启动服务端", width=10, command=self.start_server)
  14. self.con_btn.place(x=100, y=20)
  15. # 接收消息
  16. self.status_btn = tk.Button(self.root, text="接收连接", width=10, command=self.status)
  17. self.status_btn.place(x=200, y=20)
  18. # 接收消息
  19. self.rev_btn = tk.Button(self.root, text="接收消息", command=self.receive)
  20. self.rev_btn.place(x=300, y=20)
  21. # 文本输入框
  22. self.send_entry = tk.Entry(self.root, width=50)
  23. self.send_entry.place(x=50, y=80)
  24. # 发送消息按钮
  25. self.send_btn = tk.Button(self.root, text="发送消息", command=self.send)
  26. self.send_btn.place(x=420, y=75)
  27. # 消息框
  28. self.msg_test = tk.Text(self.root, width=70, height=16)
  29. self.msg_test.place(x=2, y=125)
  30. self.root.mainloop()
  31. # 启动tcp服务端
  32. def start_server(self):
  33. try:
  34. # 每次连接服务端就将上一次的记录清除
  35. self.send_entry.delete(0, tk.END)
  36. self.msg_test.delete(1.0, tk.END)
  37. # 创建服务端socket
  38. self.tcp_server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
  39. self.tcp_server_socket.bind(('', 8888)) # 绑定
  40. self.tcp_server_socket.listen(5) # 监听的最大连接数
  41. self.msg_test.insert(tk.END, f"服务端启动成功!\n")
  42. except Exception as e:
  43. self.msg_test.insert(tk.END, f"启动失败的原因是: {e}")
  44. def status(self):
  45. if self.conn_socket is None:
  46. self.conn_socket, ip_port = self.tcp_server_socket.accept()
  47. elif self.conn_socket:
  48. self.msg_test.insert(tk.END, "客户端已连接\n")
  49. else:
  50. tk.messagebox.showinfo('提示', "客户端未连接")
  51. def send(self):
  52. try:
  53. input_data = self.send_entry.get()
  54. self.conn_socket.send(input_data.encode(encoding='utf-8'))
  55. self.msg_test.insert(tk.END, f"服务端:{str(input_data)}\n")
  56. except Exception as e:
  57. self.msg_test.insert(tk.END, f"发送失败的原因: {e}")
  58. def receive(self):
  59. rec_msg = self.conn_socket.recv(1024).decode(encoding='utf-8')
  60. print(rec_msg)
  61. # 获取到#断开连接
  62. if rec_msg == '#':
  63. self.conn_socket.close()
  64. self.tcp_server_socket.close()
  65. self.msg_test.insert(tk.END, f"客户端断开连接\n")
  66. return
  67. self.msg_test.insert(tk.END, f"客户端:{str(rec_msg)}\n")
  68. if __name__ == '__main__':
  69. TcpServerSocket()

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/运维做开发/article/detail/1013327
推荐阅读
相关标签
  

闽ICP备14008679号