成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

基于Python socket實(shí)現(xiàn)簡易網(wǎng)絡(luò)聊天室

89542767 / 611人閱讀

  小編寫這篇文章的主要目的,主要介紹的是關(guān)于Python socket的相關(guān)知識(shí),介紹的內(nèi)容主要是涉及到編程的一些事情,以此用來進(jìn)行搭建簡易的網(wǎng)絡(luò)聊天室,來實(shí)現(xiàn)相關(guān)的遠(yuǎn)程聊天,這其實(shí)就是聊天工具的初始原型,下面就具體的內(nèi)容給大家詳細(xì)解答下。


  在這個(gè)周末剛剛寫出來的python桌面應(yīng)用--網(wǎng)絡(luò)聊天室,主要通過pyqt5作為桌面應(yīng)用框架,socket作為網(wǎng)絡(luò)編程的框架,從而實(shí)現(xiàn)包括客戶端和服務(wù)端的網(wǎng)絡(luò)聊天室的GUI應(yīng)用,希望可以一起學(xué)習(xí)、一起進(jìn)步!


  應(yīng)用包括服務(wù)端server_ui.py、客戶端client_ui.py兩個(gè)python模塊實(shí)現(xiàn),并且在pyqt5的使用過程中都使用QThread多線程應(yīng)用以及基本的UI頁面布局。開始之前通過一個(gè)動(dòng)態(tài)圖來觀察一下socket服務(wù)端、socket客戶端通信的實(shí)現(xiàn)效果。


  1.socket_ui.py服務(wù)端


  1-1.依賴引用


  在socket服務(wù)端的實(shí)現(xiàn)過程中,除了pyqt5相關(guān)的UI界面的引用外,還包括time、threading、sys、socket等輔助模塊來一起實(shí)現(xiàn)socket服務(wù)端的桌面應(yīng)用程序。


  from PyQt5.QtWidgets import*
  from PyQt5.QtCore import*
  from PyQt5.QtGui import*
  import sys
  from QCandyUi import CandyWindow
  #導(dǎo)入socket通訊模塊
  import socket
  #導(dǎo)入時(shí)間管理模塊
  import time
  #導(dǎo)入多線程模塊
  import threading


  1-2.實(shí)現(xiàn)過程


  在服務(wù)端的業(yè)務(wù)實(shí)現(xiàn)上面,我們依然是按照之前的GUI實(shí)現(xiàn)方式,采用主線程用來實(shí)現(xiàn)頁面布局,子線程QThread來實(shí)現(xiàn)業(yè)務(wù)邏輯的方式來進(jìn)行實(shí)現(xiàn)的,socket的服務(wù)端通信業(yè)務(wù)都是在子線程ServerThread中編寫的。下面是socket服務(wù)端桌面應(yīng)用實(shí)現(xiàn)的全部代碼塊,copy到自己的ide中即可直接啟動(dòng)使用。


  class ServerUI(QWidget):
  def __init__(self):
  super(ServerUI,self).__init__()
  self.init_ui()
  def init_ui(self):
  self.setWindowTitle('socket服務(wù)端公眾號(hào):[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('消息展示區(qū)域...')
  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('最大監(jiān)聽個(gè)數(shù)')
  self.lis_num_txt=QLineEdit()
  self.lis_num_txt.setPlaceholderText('10')
  self.close_cli_label=QLabel()
  self.close_cli_label.setText('客戶端關(guān)閉指令')
  self.close_cli_txt=QLineEdit()
  self.close_cli_txt.setPlaceholderText('exit,客戶端發(fā)送相應(yīng)指令則關(guān)閉')
  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('開啟服務(wù)端')
  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):
  '''
  槽函數(shù):向文本瀏覽器中寫入內(nèi)容
  :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=parent
  self.working=True
  def __del__(self):
  self.working=False
  self.wait()
  def run(self):
  self.message.emit('準(zhǔn)備啟動(dòng)socket服務(wù)端...')
  #創(chuàng)建服務(wù)端socket
  socket_server=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
  #綁定服務(wù)地址、端口
  address=(self.parent.ip_txt.text().strip(),int(self.parent.port_txt.text().strip()))
  socket_server.bind(address)
  #設(shè)置監(jiān)聽最大等待數(shù)
  socket_server.listen(int(self.parent.lis_num_txt.text().strip()))
  self.message.emit("服務(wù)已經(jīng)啟動(dòng),正在等待客戶端連接...")
  while True:
  #設(shè)置睡眠時(shí)間
  time.sleep(0.1)
  #允許客戶端連接
  client,info=socket_server.accept()
  self.client,self.info=client,info
  #啟用新線程調(diào)用消息處理
  thread=threading.Thread(target=self.catch_message)
  #設(shè)置為守護(hù)線程
  thread.setDaemon(True)
  #開啟線程執(zhí)行
  thread.start()
  def catch_message(self):
  self.client.send("歡迎來到網(wǎng)絡(luò)聊天室".encode('utf-8'))
  self.message.emit("客戶端信息:"+str(self.info))
  close_cli=self.parent.close_cli_txt.text().strip()
  while True:
  try:
  #接收客戶端消息、接收最大長度為1024,并進(jìn)行utf-8解碼
  message=self.client.recv(1024).decode('utf-8')
  #校驗(yàn)是否關(guān)閉客戶端
  if not message and close_cli==message:
  self.client.close()
  self.message.emit("當(dāng)前客戶端已關(guān)閉!")
  break
  self.message.emit("接收到消息:"+message)
  #將消息進(jìn)行utf-8編碼后發(fā)給客戶端
  rcv="服務(wù)端成功接收消息:"+message
  self.client.send(rcv.encode('utf-8'))
  except Exception as e:
  self.client.send("服務(wù)端處理消息異常!".encode('utf-8'))
  break
  if __name__=='__main__':
  app=QApplication(sys.argv)
  w=CandyWindow.createWindow(ServerUI(),theme='blueGreen',title='socket服務(wù)端公眾號(hào):[Python集中營]',
  ico_path='hi.ico')
  w.show()
  sys.exit(app.exec_())


  1-3.實(shí)現(xiàn)效果

03.png

  2.client_ui.py客戶端


  在socket客戶端的實(shí)現(xiàn)過程中,除了pyqt5相關(guān)的UI界面的引用外,還包括sys、socket等輔助模塊來一起實(shí)現(xiàn)socket服務(wù)端的桌面應(yīng)用程序,相比服務(wù)端來說,客戶端并沒有使用多線程threading模塊。


  from PyQt5.QtWidgets import*
  from PyQt5.QtCore import*
  from PyQt5.QtGui import*
  import sys
  from QCandyUi import CandyWindow
  #導(dǎo)入socket通信模塊
  import socket


  2-2.實(shí)現(xiàn)過程


  客戶端的實(shí)現(xiàn)過程和服務(wù)端server_ui.py實(shí)現(xiàn)是基本相似的,同樣也使用到了pyqt5的QThread的子線程應(yīng)用,唯一不同的是socket客戶端通信方式跟服務(wù)端不大相同,同樣將下面的代碼塊copy到自己的ide中直接使用即可。


  class ClientUI(QWidget):
  def __init__(self):
  super(ClientUI,self).__init__()
  self.init_ui()
  def init_ui(self):
  self.setWindowTitle('socket客戶端公眾號(hào):[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('消息展示區(qū)域...')
  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('發(fā)送消息內(nèi)容...')
  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('發(fā)送消息')
  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):
  '''
  槽函數(shù):向文本瀏覽器中寫入內(nèi)容
  :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=parent
  self.working=True
  self.is_connect=False
  def __del__(self):
  self.working=False
  self.wait()
  def run(self):
  try:
  if self.is_connect is False:
  self.connect_serv()
  #將控制臺(tái)輸入消息進(jìn)行utf-8編碼后發(fā)送
  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("發(fā)送消息異常:"+str(e))
  def connect_serv(self):
  try:
  self.message.emit("正在創(chuàng)建客戶端socket...")
  #創(chuàng)建客戶端socket
  self.socket_client=socket.socket()
  #連接服務(wù)端
  address=(self.parent.ip_txt.text().strip(),int(self.parent.port_txt.text().strip()))
  self.socket_client.connect(address)
  self.message.emit("服務(wù)端連接成功...")
  #接收服務(wù)端消息并進(jìn)行utf-8解碼
  self.message.emit(self.socket_client.recv(1024).decode())
  self.is_connect=True
  except:
  self.is_connect=False
  if __name__=='__main__':
  app=QApplication(sys.argv)
  w=CandyWindow.createWindow(ClientUI(),theme='blueGreen',title='socket客戶端公眾號(hào):[Python集中營]',
  ico_path='hi.ico')
  w.show()
  sys.exit(app.exec_())

       綜上所述,這篇文章就給大家介紹完畢,希望可以給大家?guī)韼椭?/p>

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/128396.html

相關(guān)文章

  • 基于express和socket.io的簡易天室

    摘要:簡易版聊天室技術(shù)棧功能實(shí)現(xiàn)實(shí)時(shí)聊天創(chuàng)建房間表情包完善私聊效果登錄服務(wù)端判斷之前是否登錄過聊天室,如果是則直接進(jìn)入聊天室,否則跳轉(zhuǎn)到登錄頁面。客戶端發(fā)送創(chuàng)建房間和切換房間的事件給服務(wù)端。 Chat 簡易版聊天室 技術(shù)棧 express socket.io 功能 實(shí)現(xiàn) 實(shí)時(shí)聊天 創(chuàng)建房間 表情包 完善 私聊 效果 登錄 showImg(https://segmentfa...

    dendoink 評(píng)論0 收藏0
  • 利用express+socket.io實(shí)現(xiàn)一個(gè)簡易天室

    摘要:用偽代碼來模擬下長輪詢的過程前端利用下面函數(shù)進(jìn)行請(qǐng)求后端代碼做如下更改利用隨機(jī)數(shù)的大小來模擬是否有新數(shù)據(jù)有新數(shù)據(jù)來了長輪詢的確減少了請(qǐng)求的次數(shù),但是它也有著很大的問題,那就是耗費(fèi)服務(wù)器的資源。 寫在前面 最近由于利用node重構(gòu)某個(gè)項(xiàng)目,項(xiàng)目中有一個(gè)實(shí)時(shí)聊天的功能,于是就研究了一下聊天室,在線demo|源碼,歡迎大家反饋。這個(gè)聊天室的主要利用到了socket.io和express。這個(gè)...

    Chaz 評(píng)論0 收藏0
  • vue+socket.io+express+mongodb 實(shí)現(xiàn)簡易多房間在線群聊

    摘要:項(xiàng)目簡介主要是通過做一個(gè)多人在線多房間群聊的小項(xiàng)目來練手全棧技術(shù)的結(jié)合運(yùn)用。編譯運(yùn)行開啟服務(wù),新建命令行窗口啟動(dòng)服務(wù)端,新建命令行窗口啟動(dòng)前端頁面然后在瀏覽器多個(gè)窗口打開,注冊(cè)不同賬號(hào)并登錄即可進(jìn)行多用戶多房間在線聊天。 項(xiàng)目簡介 主要是通過做一個(gè)多人在線多房間群聊的小項(xiàng)目、來練手全棧技術(shù)的結(jié)合運(yùn)用。 項(xiàng)目源碼:chat-vue-node 主要技術(shù): vue2全家桶 + socket....

    android_c 評(píng)論0 收藏0
  • 基于linux原生異步io創(chuàng)建的簡易聊天程序

    摘要:分為兩個(gè)獨(dú)立的程序編譯前先確定自己服務(wù)器的地址,比如想要在自己的下運(yùn)行,先獲取自己的地址,修改,里面的地址為自己的地址服務(wù)端編譯運(yùn)行客戶端編譯運(yùn)行服務(wù)端先運(yùn)行起來后,再啟動(dòng)客戶端,可以在多態(tài)機(jī)器上啟多個(gè)客戶端,互相聊天 分為兩個(gè)獨(dú)立的程序編譯前先確定自己服務(wù)器的地址,比如想要在自己的ubuntu下運(yùn)行,先ip addr獲取自己的ip地址,修改chat_server.c,chat_cli...

    xcold 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<