首页 > 编程语言 >python的tkinter、socket库开发tcp的客户端和服务端

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

时间:2024-07-17 23:29:46浏览次数:19  
标签:tkinter socket python self tcp tk 服务端 客户端

一、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: 弹窗,用来提示用户。

2)socket.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 = None
        self.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)
            # 创建客户端socket
            self.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 socket

import tkinter as tk
from threading import Thread
import tkinter.messagebox


class TcpServerSocket:
    def __init__(self):
        self.conn_socket = None
        self.tcp_server_socket = None
        self.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)

            # 创建服务端socket
            self.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")
            return
        self.msg_test.insert(tk.END, f"客户端:{str(rec_msg)}\n")


if __name__ == '__main__':
    TcpServerSocket()

 

标签:tkinter,socket,python,self,tcp,tk,服务端,客户端
From: https://blog.csdn.net/chenchun0458/article/details/140508069

相关文章

  • Python爬虫(5-10)-编解码、ajax的get请求、ajax的post请求、URLError/HTTPError、微博
    五、编解码(Unicode编码)(1)GET请求所提方法都在urllib.parse.路径下get请求的quote()方法(适用于只提交一两个参数值)url='http://www.baidu.com/baidu?ie=utf-8&wd='#对汉字进行unicode编码name=urllib.parse.quote('白敬亭')url+=nameget请求的urlencode()方法(适用于......
  • Python包管理入门
    包管理器,是现代项目管理的重要组成部分,许多现代编程语言也会推出统一的包管理器以提升开发者体验,如rust的cargo,nodejs的npm,arkts的ohpm等等。Python作为一门很“新”的语言,自然也提供包管理功能。Python包管理的前世今生如果要提到Python的包管理,那么必定绕不开PYPI(Pytho......
  • Python入门基础 2--变量与基本数据类型
    1、程序员必备修养---注释注释=说明文档,说明代码的作用,让别人或者自己看代码的时候可以更好理解相关含义因为注释是给开发人员看的,不会参与程序运行python有两种注释方式:   1.单行注释-->用#符号表示,在#后面的内容都是注释print('第二篇文章')#这是输出语句 ......
  • 我从 Python 潮流周刊提取了 800 个链接,精选文章、开源项目、播客视频集锦
    你好,我是豌豆花下猫。前几天,我重新整理了Python潮流周刊的往期分享,推出了第1季的图文版电子书,受到了很多读者的一致好评。但是,合集和电子书的篇幅很长,阅读起来要花不少时间。所以,为了方便大家阅读,我打算将合集进一步整理,分门别类将原始内容的标题罗列出来。本文总计约800......
  • Python读Excel数据,创建Word文档上下文字典列表,元素为字典(新)
    #读Excel数据,创建Word文档上下文字典列表,元素为每个培训人员的上下文字典defcreate_docx_context_dict_list(_excel_path):"""输入参数::param_excel_path:Excel全路径功能:创建Word文档上下文字典列表,元素为每个培训人员的上下文字典字典的键为......
  • ROS服务通信机制实操Python
    ROS服务通信机制实操Python步骤流程vscode配置服务端客户端编辑配置文件编译并执行优化实现参数的动态提交优化先启动客户端后启动服务端ROS服务通信的理论查阅:ROS服务通信流程理论ROS服务通信的自定义srv数据的准备可以查阅:ROS服务通信自定义srv在模型实现中,ROSm......
  • Python实现基于http通信的protobuf数据传输的案例,包括请求者和接收者
    个人名片......
  • Python回归、聚类、相关分析上海公租房租金满意度影响因素数据可视化
    全文链接:https://tecdat.cn/?p=37013原文出处:拓端数据部落公众号随着城市化进程的加速,住房问题日益成为城市居民关注的焦点。公租房作为政府为解决中低收入家庭住房困难而推出的一种重要住房保障形式,其租金水平、居住条件及租住体验直接关系到广大租户的切身利益和生活质量......
  • Python对商店数据进行lstm和xgboost销售量时间序列建模预测分析|附代码数据
    全文下载链接:http://tecdat.cn/?p=17748最近我们被客户要求撰写关于销售量时间序列建模的研究报告,包括一些图形和统计输出。在本文中,在数据科学学习之旅中,我经常处理日常工作中的时间序列数据集,并据此做出预测我将通过以下步骤:探索性数据分析(EDA)问题定义(我们要解决什么)变量......
  • python环境配置及基础学习
    python环境配置及基础学习Miniconda安装及使用创建环境condacreate-nnamepython=3.10进入环境condaactivatename退出环境condadeactivateVSCode安装安装成功后,在左边“extensions”搜索Chinese语音包点击install,按照提示重启VSCode在左边“拓展”搜索python,安装......