日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

GUI 应用:socket 网络聊天室

發布時間:2023/12/18 编程问答 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 GUI 应用:socket 网络聊天室 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

在這個周末剛剛寫出來的python桌面應用--網絡聊天室,主要通過pyqt5作為桌面應用框架,socket作為網絡編程的框架,從而實現包括客戶端和服務端的網絡聊天室的GUI應用,希望可以一起學習、一起進步!

應用包括服務端server_ui.py、客戶端client_ui.py兩個python模塊實現,并且在pyqt5的使用過程中都使用QThread多線程應用以及基本的UI頁面布局。開始之前通過一個動態圖來觀察一下socket服務端、socket客戶端通信的實現效果。

【閱讀全文】

  • 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. 實現效果

  • 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 网络聊天室的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。