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

一、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、接收消息函数receive

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

5、断开连接函数disconnect

 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、客户端
import socket
import tkinter as tk
import tkinter.messagebox
from threading import Thread# 创建tcp客户端
class TcpClientSocket:def __init__(self):self.tcp_client_socket = Noneself.root = tk.Tk()self.root.title('tcp客户端')self.root.geometry('500x350')# 连接self.con_btn = tk.Button(self.root, text="连接服务端", width=10, command=self.connect)self.con_btn.place(x=100, y=20)# 断开连接self.discon_btn = tk.Button(self.root, text="断开连接", width=10, command=self.disconnect)self.discon_btn.place(x=300, y=20)# 文本输入框self.send_entry = tk.Entry(self.root, width=50)self.send_entry.place(x=50, y=80)# 发送消息按钮self.send_btn = tk.Button(self.root, text="发送消息", command=self.send)self.send_btn.place(x=420, y=75)# 消息框self.msg_test = tk.Text(self.root, width=70, height=16)self.msg_test.place(x=2, y=125)self.root.mainloop()# 连接服务端def connect(self):try:if self.tcp_client_socket:tk.messagebox.showinfo('提示', '已是连接状态')# 每次连接服务端就将上一次的记录清除self.msg_test.delete(1.0, tk.END)self.send_entry.delete(0, tk.END)# 创建客户端socketself.tcp_client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)# 连接,端口可以改变self.tcp_client_socket.connect(('127.0.0.1', 8888))self.msg_test.insert(tk.END, "连接到服务端, 请输入信息...\n")except Exception as e:self.msg_test.insert(tk.END, f"连接失败的原因是: {e}")# 发送消息def send(self):# 从输入框获取数据input_data = self.send_entry.get()self.tcp_client_socket.send(input_data.encode(encoding='utf-8'))self.msg_test.insert(tk.END, f"客户端:{str(input_data)}\n")# 使用线程,防止未响应receive_thread = Thread(target=self.receive, daemon=True)receive_thread.start()def receive(self):if self.tcp_client_socket:rec_msg = self.tcp_client_socket.recv(1024).decode(encoding='utf-8')self.msg_test.insert(tk.END, f"服务端:{str(rec_msg)}\n")# 断开连接def disconnect(self):if self.tcp_client_socket:self.send_entry.delete(0, tk.END)self.msg_test.insert(tk.END, "断开连接")self.tcp_client_socket.send('#'.encode(encoding='utf-8'))  # 发送’#‘断开连接self.tcp_client_socket.close()  # 关闭客户端else:tk.messagebox.showinfo('提示', '未连接到服务端')if __name__ == '__main__':TcpClientSocket()
2、服务端
import socketimport tkinter as tk
from threading import Thread
import tkinter.messageboxclass TcpServerSocket:def __init__(self):self.conn_socket = Noneself.tcp_server_socket = Noneself.root = tk.Tk()self.root.title('tcp服务端')self.root.geometry('500x350')# 连接self.con_btn = tk.Button(self.root, text="启动服务端", width=10, command=self.start_server)self.con_btn.place(x=100, y=20)# 接收消息self.status_btn = tk.Button(self.root, text="接收连接", width=10, command=self.status)self.status_btn.place(x=200, y=20)# 接收消息self.rev_btn = tk.Button(self.root, text="接收消息", command=self.receive)self.rev_btn.place(x=300, y=20)# 文本输入框self.send_entry = tk.Entry(self.root, width=50)self.send_entry.place(x=50, y=80)# 发送消息按钮self.send_btn = tk.Button(self.root, text="发送消息", command=self.send)self.send_btn.place(x=420, y=75)# 消息框self.msg_test = tk.Text(self.root, width=70, height=16)self.msg_test.place(x=2, y=125)self.root.mainloop()# 启动tcp服务端def start_server(self):try:# 每次连接服务端就将上一次的记录清除self.send_entry.delete(0, tk.END)self.msg_test.delete(1.0, tk.END)# 创建服务端socketself.tcp_server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)self.tcp_server_socket.bind(('', 8888))  # 绑定self.tcp_server_socket.listen(5)  # 监听的最大连接数self.msg_test.insert(tk.END, f"服务端启动成功!\n")except Exception as e:self.msg_test.insert(tk.END, f"启动失败的原因是: {e}")def status(self):if self.conn_socket is None:self.conn_socket, ip_port = self.tcp_server_socket.accept()elif self.conn_socket:self.msg_test.insert(tk.END, "客户端已连接\n")else:tk.messagebox.showinfo('提示', "客户端未连接")def send(self):try:input_data = self.send_entry.get()self.conn_socket.send(input_data.encode(encoding='utf-8'))self.msg_test.insert(tk.END, f"服务端:{str(input_data)}\n")except Exception as e:self.msg_test.insert(tk.END, f"发送失败的原因: {e}")def receive(self):rec_msg = self.conn_socket.recv(1024).decode(encoding='utf-8')print(rec_msg)# 获取到#断开连接if rec_msg == '#':self.conn_socket.close()self.tcp_server_socket.close()self.msg_test.insert(tk.END, f"客户端断开连接\n")returnself.msg_test.insert(tk.END, f"客户端:{str(rec_msg)}\n")if __name__ == '__main__':TcpServerSocket()

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/47437.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Linux·基本指令(下)

1. mv 指令 (move) 语法:mv[选项] 源文件或目录 目标文件或目录 功能:将源文件或目录剪贴到一个新位置,或给源文件或目录改名但不会改变其内容 常用选项: -f :force 强制,如果目标文件已经存在,…

HCIE-AI大模型直通车火热报名中

第一阶段:HCIA-AI Solution Architect(直播,39课时) 该阶段详细介绍 AI 大模型所需基础技术栈,包含深度学习基础、计算机视觉技术、自然语言处理技术、华为开源深度学习框架 MindSpore、注意力制、Transformer 架构&am…

Spock单元测试框架使用介绍和实践

背景 单元测试是保证我们写的代码是我们想要的结果的最有效的办法。根据下面的数据图统计,单元测试从长期来看也有很大的收益。 单元测试收益: 它是最容易保证代码覆盖率达到100%的测试。可以⼤幅降低上线时的紧张指数。单元测试能更快地发现问题。单元测试的性…

【spring boot】初学者项目快速练手

一小时带你从0到1实现一个SpringBoot项目开发_哔哩哔哩_bilibili 一、简介 二、项目结构 三、代码结构 1.生成框架 Spring Initializr 快速生成一个初始的项目代码,会生成一个demo文件 打开intellj idea,导入demo文件 2.目录结构 源码都放在src-ma…

“论软件维护方法及其应用”精选范文,软考高级论文,系统架构设计师论文

论文真题 软件维护是指在软件交付使用后,直至软件被淘汰的整个时间范围内,为了改正错误或满足 新的需求而修改软件的活动。在软件系统运行过程中,软件需要维护的原因是多种多样的, 根据维护的原因不同,可以将软件维护…

Lua基础知识入门

1 基础知识 标识符:标识符的定义和 C语言相同:字母和下划线_ 开头, 下划线_ 大写字母一般是lua保留字, 如_VERSION 全局变量:默认情况下,变量总是认为是全局的,不需要申明,给一个变…

电脑压缩视频文件 电脑压缩视频大小的方法

在数字化时代,视频已成为我们记录生活、分享快乐的重要工具。然而,大尺寸的视频文件常常让分享和存储变得棘手。如何在保持视频画质的前提下,轻松减小视频文件大小?今天,就让我们一起探索苹果电脑上的几种高效视频压缩…

HP Superdome2小型机监控指标解读

监控易是一款专注于IT基础设施监控的软件,能够实时监控服务器的各项性能指标,确保服务器的稳定运行。针对HP Superdome2小型机,监控易通过IPMI和网页抓取数据的方式,监测包括服务器温度、风扇及电压等在内的关键指标,为…

Postfix+Dovecot+Roundcube开源邮件系统搭建系列1-2:系统搭建目标+MariaDB数据库配置(MySQL)

1. 系统搭建目标 通过本系列文章,最终可以部署一套提供如下服务的邮件系统: SMTP服务:由Postfix提供,监听25、465、587端口。POP3服务:由Dovecot提供,监听110、995端口。IMAP服务:由Dovecot提…

Java基础笔记(面试题)

一、Tomcat中为什么要使用自定义类加载器 Tomcat中可以放多个Java项目的jar文件,如果每个jar文件中都有一个User的类,那么User类在没有自定义类加载器的情况下是只能加载一次;想要加载多次,只能自定义类加载器 二、JDK、JRE、JVM…

项目管理进阶之RACI矩阵

前言 项目管理进阶系列续新篇。 RACI?这个是什么矩阵,有什么用途? 在项目管理过程中,如Team规模超5以上时,则有必要采用科学的管理方式,满足工作需要。否则可能事倍功半。 Q:什么是RACI矩阵 …

【简单介绍Gitea】

🎥博主:程序员不想YY啊 💫CSDN优质创作者,CSDN实力新星,CSDN博客专家 🤗点赞🎈收藏⭐再看💫养成习惯 ✨希望本文对您有所裨益,如有不足之处,欢迎在评论区提出…

吴恩达大模型系列课程《Prompt Compression and Query Optimization》中文学习打开方式

Prompt Compression and Query Optimization GPT-4o详细中文注释的Colab观看视频1 浏览器下载插件2 打开官方视频 GPT-4o详细中文注释的Colab 中文注释链接:https://github.com/Czi24/Awesome-MLLM-LLM-Colab/tree/master/Courses/Prompt-Compression-and-Query-Op…

防溺水预警系统引领水域安全新篇章

一、系统概述 随着人们对水域活动的需求增加,溺水事故频发,给人们的生命安全带来了严重威胁。然而,如今,一项创新科技正在以强大的功能和无限的潜力引领着水域安全的新篇章。智能防溺水预警系统,作为一种集成了智能感知…

乐鑫ESP-IoT-Bridge方案简化设备智能联网通信,启明云端乐鑫代理商

随着物联网技术的快速发展,设备联网已成为实现智能化的关键一步。然而,不同设备之间的通信协议、接口等差异,使得设备联网变得复杂且困难。 乐鑫推出的ESP-IoT-Bridge联网方案,正是为了解决这一难题,为物联网场景下的…

抖音短视频seo矩阵系统源码(搭建技术开发分享)

#抖音矩阵系统源码开发 #短视频矩阵系统源码开发 #短视频seo源码开发 一、 抖音短视频seo矩阵系统源码开发,需要掌握以下技术: 网络编程:能够使用Python、Java或其他编程语言进行网络编程,比如使用爬虫技术从抖音平台获取数据。…

服务器的80和443端口关闭也能申请SSL证书

一、简介 在服务器的80和443端口关闭的情况下,确实可以申请SSL证书,但申请过程和方法会根据证书类型和验证方式的不同而有所差异。 通常如果是网站域名申请SSL证书,哪怕服务器的80、443端口都打不开,也可以通过DNS解析的方式来验…

设计模式-领域逻辑模式-领域模型(Domain Model)

例子 合并了行为和数据的领域的对象模型,如下图所示。 建立收入确认类 建立收入计算策略类 对象的传递过程

EasyExcel 学习之 导出 “WPS 表格在试图打开文件时遇到错误”

目录 1. 版本2. 现象2.1. Postman 文件下载成功且 WPS 可以正常打开2.2. VUE 下载成功但 WPS 无法打开 3. 原因:前端未指定 responseType4. 常见问题4.1. NoSuchMethodError4.1.1. org.apache.logging.log4j.LogBuilder org.apache.logging.log4j.Logger.atTrace()4.1.2. Could…

Jmeter关联

案例脚本实现:选择商品加入购物车 客户端发送一个登录的HTTP请求,服务端返回一个带着token的响应,后续发出一个带token信息的加入购物车的HTTP请求,返回响应。 关联:当请求直接由依赖关系的时候,比如一个请…