在这个周末刚刚写出来的python桌面应用--网络聊天室,主要通过pyqt5作为桌面应用框架,socket作为网络编程的框架,从而实现包括客户端和服务端的网络聊天室的GUI应用,希望可以一起学习、一起进步!

应用包括服务端server_ui.py、客户端client_ui.py两个python模块实现,并且在pyqt5的使用过程中都使用QThread多线程应用以及基本的UI页面布局。开始之前通过一个动态图来观察一下socket服务端、socket客户端通信的实现效果。

【阅读全文】

  1. socket_ui.py 服务端

1-1. 依赖引用

在socket服务端的实现过程中,除了pyqt5相关的UI界面的引用外,还包括time、threading、sys、socket等辅助模块来一起实现socket服务端的桌面应用程序。

from PyQt5.QtWidgets import *
from PyQt5.QtCore import *
from PyQt5.QtGui import *
import sysfrom QCandyUi import CandyWindow# 导入 socket 通讯模块
import socket
# 导入时间管理模块
import time
# 导入多线程模块
import threading

1-2. 实现过程

在服务端的业务实现上面,我们依然是按照之前的GUI实现方式,采用主线程用来实现页面布局,子线程QThread来实现业务逻辑的方式来进行实现的,socket的服务端通信业务都是在子线程ServerThread中编写的。下面是socket服务端桌面应用实现的全部代码块,copy到自己的ide中即可直接启动使用。

class ServerUI(QWidget):def __init__(self):super(ServerUI, self).__init__()self.init_ui()def init_ui(self):self.setWindowTitle('socket 服务端  公众号:[Python 集中营]')self.setWindowIcon(QIcon('hi.ico'))self.setFixedSize(500, 300)hbox = QHBoxLayout()hbox_v1 = QVBoxLayout()self.brower = QTextBrowser()self.brower.setFont(QFont('宋体', 8))self.brower.setReadOnly(True)self.brower.setPlaceholderText('消息展示区域...')self.brower.ensureCursorVisible()hbox_v1.addWidget(self.brower)hbox_v2 = QVBoxLayout()hbox_v2_f1 = QFormLayout()self.ip_label = QLabel()self.ip_label.setText('ip地址 ')self.ip_txt = QLineEdit()self.ip_txt.setPlaceholderText('0.0.0.0')self.port_label = QLabel()self.port_label.setText('端口 ')self.port_txt = QLineEdit()self.port_txt.setPlaceholderText('4444')self.lis_num_label = QLabel()self.lis_num_label.setText('最大监听个数 ')self.lis_num_txt = QLineEdit()self.lis_num_txt.setPlaceholderText('10')self.close_cli_label = QLabel()self.close_cli_label.setText('客户端关闭指令 ')self.close_cli_txt = QLineEdit()self.close_cli_txt.setPlaceholderText('exit,客户端发送相应指令则关闭')hbox_v2_f1.addRow(self.ip_label, self.ip_txt)hbox_v2_f1.addRow(self.port_label, self.port_txt)hbox_v2_f1.addRow(self.lis_num_label, self.lis_num_txt)hbox_v2_f1.addRow(self.close_cli_label, self.close_cli_txt)self.start_btn = QPushButton()self.start_btn.setText('开启服务端')self.start_btn.clicked.connect(self.start_btn_clk)hbox_v2.addLayout(hbox_v2_f1)hbox_v2.addWidget(self.start_btn)hbox.addLayout(hbox_v1)hbox.addLayout(hbox_v2)self.thread_ = ServerThread(self)self.thread_.message.connect(self.show_message)self.setLayout(hbox)def show_message(self, text):'''槽函数:向文本浏览器中写入内容:param text::return:'''cursor = self.brower.textCursor()cursor.movePosition(QTextCursor.End)self.brower.append(text)self.brower.setTextCursor(cursor)self.brower.ensureCursorVisible()def start_btn_clk(self):self.thread_.start()self.start_btn.setEnabled(False)class ServerThread(QThread):message = pyqtSignal(str)def __init__(self, parent=None):super(ServerThread, self).__init__(parent)self.parent = parentself.working = Truedef __del__(self):self.working = Falseself.wait()def run(self):self.message.emit('准备启动socket服务端...')# 创建服务端 socketsocket_server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)# 绑定服务地址、端口address = (self.parent.ip_txt.text().strip(), int(self.parent.port_txt.text().strip()))socket_server.bind(address)# 设置监听最大等待数socket_server.listen(int(self.parent.lis_num_txt.text().strip()))self.message.emit("服务已经启动,正在等待客户端连接...")while True:# 设置睡眠时间time.sleep(0.1)# 允许客户端连接client, info = socket_server.accept()self.client, self.info = client, info# 启用新线程调用消息处理thread = threading.Thread(target=self.catch_message)# 设置为守护线程thread.setDaemon(True)# 开启线程执行thread.start()def catch_message(self):self.client.send("欢迎来到网络聊天室".encode('utf-8'))self.message.emit("客户端信息:" + str(self.info))close_cli = self.parent.close_cli_txt.text().strip()while True:try:#  接收客户端消息、接收最大长度为 1024,并进行 utf-8 解码message = self.client.recv(1024).decode('utf-8')# 校验是否关闭客户端if not message and close_cli == message:self.client.close()self.message.emit("当前客户端已关闭!")breakself.message.emit("接收到消息:" + message)# 将消息进行 utf-8 编码后发给客户端rcv = "服务端成功接收消息:" + messageself.client.send(rcv.encode('utf-8'))except Exception as e:self.client.send("服务端处理消息异常!".encode('utf-8'))breakif __name__ == '__main__':app = QApplication(sys.argv)w = CandyWindow.createWindow(ServerUI(), theme='blueGreen', title='socket 服务端  公众号:[Python 集中营]',ico_path='hi.ico')w.show()sys.exit(app.exec_())

1-3. 实现效果

  1. client_ui.py 客户端

2-1. 依赖引用

在socket客户端的实现过程中,除了pyqt5相关的UI界面的引用外,还包括sys、socket等辅助模块来一起实现socket服务端的桌面应用程序,相比服务端来说,客户端并没有使用多线程threading模块。

from PyQt5.QtWidgets import *
from PyQt5.QtCore import *
from PyQt5.QtGui import *
import sysfrom QCandyUi import CandyWindow# 导入socket 通信模块
import socket

2-2. 实现过程

客户端的实现过程和服务端server_ui.py实现是基本相似的,同样也使用到了pyqt5的QThread的子线程应用,唯一不同的是socket客户端通信方式跟服务端不大相同,同样将下面的代码块copy到自己的ide中直接使用即可。

class ClientUI(QWidget):def __init__(self):super(ClientUI, self).__init__()self.init_ui()def init_ui(self):self.setWindowTitle('socket 客户端  公众号:[Python 集中营]')self.setWindowIcon(QIcon('hi.ico'))self.setFixedSize(500, 300)hbox = QHBoxLayout()hbox_v1 = QVBoxLayout()self.brower = QTextBrowser()self.brower.setFont(QFont('宋体', 8))self.brower.setReadOnly(True)self.brower.setPlaceholderText('消息展示区域...')self.brower.ensureCursorVisible()hbox_v1.addWidget(self.brower)hbox_v2 = QVBoxLayout()hbox_v2_g1 = QGridLayout()self.ip_label = QLabel()self.ip_label.setText('ip地址 ')self.ip_txt = QLineEdit()self.ip_txt.setPlaceholderText('0.0.0.0')self.port_label = QLabel()self.port_label.setText('端口 ')self.port_txt = QLineEdit()self.port_txt.setPlaceholderText('4444')self.message = QTextEdit()self.message.setPlaceholderText('发送消息内容...')hbox_v2_g1.addWidget(self.ip_label, 0, 0, 1, 1)hbox_v2_g1.addWidget(self.ip_txt, 0, 1, 1, 1)hbox_v2_g1.addWidget(self.port_label, 1, 0, 1, 1)hbox_v2_g1.addWidget(self.port_txt, 1, 1, 1, 1)hbox_v2_g1.addWidget(self.message, 2, 0, 1, 2)self.start_btn = QPushButton()self.start_btn.setText('发送消息')self.start_btn.clicked.connect(self.start_btn_clk)hbox_v2.addLayout(hbox_v2_g1)hbox_v2.addWidget(self.start_btn)hbox.addLayout(hbox_v1)hbox.addLayout(hbox_v2)self.thread_ = ClientThread(self)self.thread_.message.connect(self.show_message)self.setLayout(hbox)def show_message(self, text):'''槽函数:向文本浏览器中写入内容:param text::return:'''cursor = self.brower.textCursor()cursor.movePosition(QTextCursor.End)self.brower.append(text)self.brower.setTextCursor(cursor)self.brower.ensureCursorVisible()def start_btn_clk(self):self.thread_.start()class ClientThread(QThread):message = pyqtSignal(str)def __init__(self, parent=None):super(ClientThread, self).__init__(parent)self.parent = parentself.working = Trueself.is_connect = Falsedef __del__(self):self.working = Falseself.wait()def run(self):try:if self.is_connect is False:self.connect_serv()# 将控制台输入消息进行 utf-8 编码后发送self.socket_client.send(self.parent.message.toPlainText().strip().encode('utf-8'))self.message.emit(self.socket_client.recv(1024).decode('utf-8'))except Exception as e:self.message.emit("发送消息异常:" + str(e))def connect_serv(self):try:self.message.emit("正在创建客户端socket...")# 创建客户端 socketself.socket_client = socket.socket()# 连接服务端address = (self.parent.ip_txt.text().strip(), int(self.parent.port_txt.text().strip()))self.socket_client.connect(address)self.message.emit("服务端连接成功...")# 接收服务端消息并进行 utf-8 解码self.message.emit(self.socket_client.recv(1024).decode())self.is_connect = Trueexcept:self.is_connect = Falseif __name__ == '__main__':app = QApplication(sys.argv)w = CandyWindow.createWindow(ClientUI(), theme='blueGreen', title='socket 客户端  公众号:[Python 集中营]',ico_path='hi.ico')w.show()sys.exit(app.exec_())

2-3. 实现效果

【往期精彩】

零配置python日志,安装即用!

英语没学好到底能不能做coder,别再纠结了先学起来...

数据清洗工具flashtext,效率直接提升了几十倍数!

一个help函数解决了python的所有文档信息查看...

python 自定义异常/raise关键字抛出异常

GUI 应用:socket 网络聊天室相关推荐

  1. python socket 网络聊天室_Python基于Socket实现简单聊天室

    本文实例为大家分享了Python基于Socket实现简单聊天室,供大家参考,具体内容如下 服务端 #!/usr/bin/env python # -*- coding: utf-8 -*- # @Ti ...

  2. 使用socket实现基于select模型的网络聊天室

    假期闲来无事,便写了个小小的网络聊天室程序.以前一直都是写MFC的有界面的程序,时间长了,便失去了兴趣,感觉有些东西经过MFC的封装,反而失去了意义,让人学不到东西,所以,丢开MFC那层的东西,直接使 ...

  3. 基于Java socket的网络聊天室的设计与实现

    目 录 摘要 I Abstract II 目 录 III 1 引言 1 2 网络聊天室的简介 2 2.1网络聊天室现状和发展 2 3 完成网络聊天室的技术以及环境 4 3.1 Java的介绍 4 3. ...

  4. 【网络聊天室】——基于socket编程的TCP/UDP网络聊天服务器

    早期网络刚刚普及的时候,给人们印象最深的就是上网聊天,虽然作为一名上世纪的尾巴刚刚出生的我没有经历过,但仍从有所耳闻,那个时期是网络聊天室风靡的年代,全国知名聊天室大家都争破头的想要进去,基于如上和一 ...

  5. C语言实现网络聊天室 socket的简单应用

    C语言实现网络聊天室 socket的简单应用 前言:环境是Linux ,使用了 socket和pthread,主要分为服务器端和客户端两部分,服务器端监听端口发来的请求,收到后向客户端发送一个消息,客 ...

  6. linux点对点聊天室的实现与设计心得,基于Socket接口的Linux与Windows网络聊天室设计与实现...

    陈洁 孟晓景 摘要:为了实现Linux与Windows跨平台通信,及时共享信息,构建了一个适用于跨平台的网络聊天室通信程序.先搭建跨平台通信环境,然后使用Socket套接字网络编程接口实现通信.整个系 ...

  7. 基于Socket通信的在线网络聊天室

    文章目录 项目结构 client constans entity util IO server ui other 大致思路 演示 时间:2021/4/20 开发环境: jdk1.8 编译器:idea2 ...

  8. 基于linux网络聊天室的设计,参考基于linux网络聊天室的设计.doc

    参考基于linux网络聊天室的设计 长沙理工大学<高级操作系统>课程设计报告学 院 计算机与通信工程 专 业 计算机科学与技术 班 级 学 号 学生姓名 指导教师 课程成绩 完成日期 课程 ...

  9. python基于udp的网络聊天室再用tkinter显示_Python实现网络聊天室的示例代码(支持多人聊天与私聊)...

    实验名称: 网络聊天室 功能: i. 掌握利用Socket进行编程的技术 ii. 掌握多线程技术,保证双方可以同时发送 iii. 建立聊天工具 iv. 可以和单人聊天 v. 可以和多个人同时进行聊天 ...

  10. windows网络编程 --网络聊天室(2)

    文章目录 IOCP模型 常用IOCP函数 基于IOCP的网络聊天室 服务器端 客户端 IOCP模型 IOCP :输入输出完成端口. 是支持多个同时发生的异步I/O操作的应用程序编程接口,IOCP特别适 ...

最新文章

  1. Python之网络图片爬取
  2. 归并排序相关题目(待编辑)
  3. call和ret(f)指令
  4. Java:双向链表反转实现
  5. mypow等于1什么意思c语言,C语言基础练习题总结
  6. 话里话外:明白比智慧更重要
  7. Python爬虫抓取网站模板的完整版实现
  8. Linux下FTP上传下载之续传命令
  9. xss.haozi挑战
  10. java批量打包下载网络图片
  11. 100比例怎么用计算机算,比例尺1:100怎么算
  12. 顺丰终端服务器断网,顺丰手持终端第六代,实现收派件智能化操作
  13. matplotlib刻度值使用科学记数法
  14. java灌水bfs二叉树,二叉树的BFS搜索
  15. 关于野火开发板stm32f103VET(拂晓开发板)DAPCMSIS-DAP下载烧录程序失败的问题及解决
  16. SciPyCon 2018 sklearn 教程(上)
  17. Red Panda DEV-C++更新到6.7.5啦
  18. 2021年11月逆向练习
  19. day-44(2)mysql
  20. 前端面试题总结以及vue在工作中常见的错误

热门文章

  1. matlab 采样点数,信号频率、采样频率、采样点数
  2. 软件测试面试英文自我介绍,软件测试英文面试自我介绍范文
  3. 什么是模拟信号?数字信号?区别是什么?它们又是如何完成转换的?
  4. 初、中、高级程序员的区别有哪些
  5. 解决Jenkins不能在线安装maven持续集成插件(百度云离线下载)
  6. 各种符号的英文读法读音单词
  7. 错误代码:88000, 错误信息:without comment privilege hint: [7oJ0533w689] rid: 630432cd-15944cf6-083e04fc
  8. go开发报 A required privilege is not held by the client 错误
  9. clickhouse优缺点总结
  10. 给排水科学与工程和计算机选哪个,2021中国给排水科学与工程专业大学排名 最好的高校排行榜...