久久99久久人婷婷精品综合_超碰aⅴ人人做人人爽欧美_亚洲电影第三页_日韩欧美一中文字暮专区_波多野结衣的一区二区三区_婷婷在线播放_人人视频精品_国产精品日韩精品欧美精品_亚洲免费黄色_欧美性猛交xxxxxxxx

使用Python怎么實現(xiàn)一個網(wǎng)絡(luò)聊天室功能-創(chuàng)新互聯(lián)

使用Python怎么實現(xiàn)一個網(wǎng)絡(luò)聊天室功能?針對這個問題,這篇文章詳細(xì)介紹了相對應(yīng)的分析和解答,希望可以幫助更多想解決這個問題的小伙伴找到更簡單易行的方法。

創(chuàng)新互聯(lián)主營定南網(wǎng)站建設(shè)的網(wǎng)絡(luò)公司,主營網(wǎng)站建設(shè)方案,成都APP應(yīng)用開發(fā),定南h5成都微信小程序搭建,定南網(wǎng)站營銷推廣歡迎定南等地區(qū)企業(yè)咨詢

功能:

i. 掌握利用Socket進(jìn)行編程的技術(shù)
ii. 掌握多線程技術(shù),保證雙方可以同時發(fā)送
iii. 建立聊天工具
iv. 可以和單人聊天
v. 可以和多個人同時進(jìn)行聊天
vi. 使用圖形界面,顯示雙方的語錄
vii. 程序可以在一定程度上進(jìn)行錯誤識別

概述

實驗通過聊天室可以完成單人或多人之間的聊天通信,功能的實現(xiàn)主要是通過Socket通信來實現(xiàn)。本次實驗采用客戶端/服務(wù)器(C/S)架構(gòu)模式,通過Python語言來編寫服務(wù)器端與客戶端的程序。運(yùn)用多線程可完成多點對多點的聊天。
服務(wù)器端程序主要用于接收用戶信息,消息接收與轉(zhuǎn)發(fā)。
客戶端程序?qū)崿F(xiàn)用戶注冊登錄,聊天信息顯示與信息輸入。

代碼解釋

統(tǒng)計當(dāng)前在線人數(shù),并且將新用戶加到用戶列表中。
Serve.py


使用Python怎么實現(xiàn)一個網(wǎng)絡(luò)聊天室功能


這是服務(wù)器對于聊天服務(wù)的實現(xiàn)。


使用Python怎么實現(xiàn)一個網(wǎng)絡(luò)聊天室功能


通過繼承threading.Thread類而實現(xiàn)多線程,重寫run函數(shù)。

使用Python怎么實現(xiàn)一個網(wǎng)絡(luò)聊天室功能


接受來自客戶端的用戶名,如果用戶名為空,使用用戶的IP與端口作為用戶名。如果用戶名出現(xiàn)重復(fù),則在出現(xiàn)的用戶名依此加上后綴“2”、“3”、“4”……


使用Python怎么實現(xiàn)一個網(wǎng)絡(luò)聊天室功能


在獲取用戶名后便會不斷地接受用戶端發(fā)來的消息(即聊天內(nèi)容),結(jié)束后關(guān)閉連接。

使用Python怎么實現(xiàn)一個網(wǎng)絡(luò)聊天室功能


如果用戶斷開連接,將該用戶從用戶列表中刪除,然后更新用戶列表。

使用Python怎么實現(xiàn)一個網(wǎng)絡(luò)聊天室功能


將地址與數(shù)據(jù)(需發(fā)送給客戶端)存入messages隊列。

使用Python怎么實現(xiàn)一個網(wǎng)絡(luò)聊天室功能


服務(wù)端在接受到數(shù)據(jù)后,會對其進(jìn)行一些處理然后發(fā)送給客戶端,如下圖,對于聊天內(nèi)容,服務(wù)端直接發(fā)送給客戶端,而對于用戶列表,便由json.dumps處理后發(fā)送。

使用Python怎么實現(xiàn)一個網(wǎng)絡(luò)聊天室功能


Client.py
建立連接,發(fā)送用戶名及判斷是否為私聊消息,私聊用~識別

使用Python怎么實現(xiàn)一個網(wǎng)絡(luò)聊天室功能


接受來自服務(wù)器發(fā)送的消息


使用Python怎么實現(xiàn)一個網(wǎng)絡(luò)聊天室功能


對接收到的消息進(jìn)行判斷,如果是在線用戶列表(用json.dumps處理過),便清空在線用戶列表框,并將此列表輸出在在線用戶列表框中。

使用Python怎么實現(xiàn)一個網(wǎng)絡(luò)聊天室功能


如果是聊天內(nèi)容,便將其輸出在聊天內(nèi)容顯示框中。


使用Python怎么實現(xiàn)一個網(wǎng)絡(luò)聊天室功能


設(shè)置登錄窗口

使用Python怎么實現(xiàn)一個網(wǎng)絡(luò)聊天室功能


設(shè)置消息界面

使用Python怎么實現(xiàn)一個網(wǎng)絡(luò)聊天室功能


設(shè)置在線用戶列表。


使用Python怎么實現(xiàn)一個網(wǎng)絡(luò)聊天室功能


完整代碼:
Serve.py

import socket
import threading
import queue
import json # json.dumps(some)打包  json.loads(some)解包
import os
import os.path
import sys


IP = '127.0.0.1'
PORT = 9999   # 端口
messages = queue.Queue()
users = []  # 0:userName 1:connection
lock = threading.Lock()

def onlines():  # 統(tǒng)計當(dāng)前在線人員
  online = []
  for i in range(len(users)):
    online.append(users[i][0])
  return online

class ChatServer(threading.Thread):
  global users, que, lock

  def __init__(self):     # 構(gòu)造函數(shù)
    threading.Thread.__init__(self)
    self.s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    os.chdir(sys.path[0])
# 接受來自客戶端的用戶名,如果用戶名為空,使用用戶的IP與端口作為用戶名。如果用戶名出現(xiàn)重復(fù),則在出現(xiàn)的用戶名依此加上后綴“2”、“3”、“4”……
  def receive(self, conn, addr):       # 接收消息
    user = conn.recv(1024)    # 用戶名稱
    user = user.decode()
    if user == '用戶名不存在':
      user = addr[0] + ':' + str(addr[1])
    tag = 1
    temp = user
    for i in range(len(users)):   # 檢驗重名,則在重名用戶后加數(shù)字
      if users[i][0] == user:
        tag = tag + 1
        user = temp + str(tag)
    users.append((user, conn))
    USERS = onlines()
    self.Load(USERS,addr)
    # 在獲取用戶名后便會不斷地接受用戶端發(fā)來的消息(即聊天內(nèi)容),結(jié)束后關(guān)閉連接。
    try:
      while True:
        message = conn.recv(1024)      # 發(fā)送消息
        message = message.decode()
        message = user + ':' + message
        self.Load(message,addr)
      conn.close()
    # 如果用戶斷開連接,將該用戶從用戶列表中刪除,然后更新用戶列表。
    except:  
      j = 0      # 用戶斷開連接
      for man in users:
        if man[0] == user:
          users.pop(j)    # 服務(wù)器段刪除退出的用戶
          break
        j = j+1

      USERS = onlines()
      self.Load(USERS,addr)
      conn.close()

# 將地址與數(shù)據(jù)(需發(fā)送給客戶端)存入messages隊列。
  def Load(self, data, addr):
    lock.acquire()
    try:
      messages.put((addr, data))
    finally:
      lock.release()    

  # 服務(wù)端在接受到數(shù)據(jù)后,會對其進(jìn)行一些處理然后發(fā)送給客戶端,如下圖,對于聊天內(nèi)容,服務(wù)端直接發(fā)送給客戶端,而對于用戶列表,便由json.dumps處理后發(fā)送。
  def sendData(self): # 發(fā)送數(shù)據(jù)
    while True:
      if not messages.empty():
        message = messages.get()
        if isinstance(message[1], str):
          for i in range(len(users)):
            data = ' ' + message[1]
            users[i][1].send(data.encode())
            print(data)
            print('\n')

        if isinstance(message[1], list):
          data = json.dumps(message[1])
          for i in range(len(users)):
            try:
              users[i][1].send(data.encode())
            except:
              pass

  def run(self):
    self.s.bind((IP,PORT))
    self.s.listen(5)
    q = threading.Thread(target=self.sendData)
    q.start()
    while True:
      conn, addr = self.s.accept()
      t = threading.Thread(target=self.receive, args=(conn, addr))
      t.start()
    self.s.close()
if __name__ == '__main__':
  cserver = ChatServer()
cserver.start()

Client.py

import socket
import tkinter
import tkinter.messagebox
import threading
import json
import tkinter.filedialog
from tkinter.scrolledtext import ScrolledText

IP = ''
PORT = ''
user = ''
listbox1 = '' # 用于顯示在線用戶的列表框
show = 1 # 用于判斷是開還是關(guān)閉列表框
users = [] # 在線用戶列表
chat = '------Group chat-------' # 聊天對象

#登陸窗口

root0 = tkinter.Tk()
root0.geometry("300x150")
root0.title('用戶登陸窗口')
root0.resizable(0,0)
one = tkinter.Label(root0,width=300,height=150,bg="LightBlue")
one.pack()

IP0 = tkinter.StringVar()
IP0.set('')
USER = tkinter.StringVar()
USER.set('')

labelIP = tkinter.Label(root0,text='IP地址',bg="LightBlue")
labelIP.place(x=20,y=20,width=100,height=40)
entryIP = tkinter.Entry(root0, width=60, textvariable=IP0)
entryIP.place(x=120,y=25,width=100,height=30)

labelUSER = tkinter.Label(root0,text='用戶名',bg="LightBlue")
labelUSER.place(x=20,y=70,width=100,height=40)
entryUSER = tkinter.Entry(root0, width=60, textvariable=USER)
entryUSER.place(x=120,y=75,width=100,height=30)

def Login(*args):
	global IP, PORT, user
	IP, PORT = entryIP.get().split(':')
	user = entryUSER.get()
	if not user:
		tkinter.messagebox.showwarning('warning', message='用戶名為空!')
	else:
		root0.destroy()

loginButton = tkinter.Button(root0, text ="登錄", command = Login,bg="Yellow")
loginButton.place(x=135,y=110,width=40,height=25)
root0.bind('<Return>', Login)

root0.mainloop()

# 建立連接
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((IP, int(PORT)))
if user:
  s.send(user.encode()) # 發(fā)送用戶名
else:
  s.send('用戶名不存在'.encode())
  user = IP + ':' + PORT

# 聊天窗口
root1 = tkinter.Tk()
root1.geometry("640x480")
root1.title('群聊')
root1.resizable(0,0)

# 消息界面
listbox = ScrolledText(root1)
listbox.place(x=5, y=0, width=640, height=320)
listbox.tag_config('tag1', foreground='red',backgroun="yellow")
listbox.insert(tkinter.END, '歡迎進(jìn)入群聊,大家開始聊天吧!', 'tag1')

INPUT = tkinter.StringVar()
INPUT.set('')
entryIuput = tkinter.Entry(root1, width=120, textvariable=INPUT)
entryIuput.place(x=5,y=320,width=580,height=170)

# 在線用戶列表
listbox1 = tkinter.Listbox(root1)
listbox1.place(x=510, y=0, width=130, height=320)


def send(*args):
	message = entryIuput.get() + '~' + user + '~' + chat
	s.send(message.encode())
	INPUT.set('')

sendButton = tkinter.Button(root1, text ="\n發(fā)\n\n\n送",anchor = 'n',command = send,font=('Helvetica', 18),bg = 'white')
sendButton.place(x=585,y=320,width=55,height=300)
root1.bind('<Return>', send)


def receive():
	global uses
	while True:
		data = s.recv(1024)
		data = data.decode()
		print(data)
		try:
			uses = json.loads(data)
			listbox1.delete(0, tkinter.END)
			listbox1.insert(tkinter.END, "當(dāng)前在線用戶")
			listbox1.insert(tkinter.END, "------Group chat-------")
			for x in range(len(uses)):
				listbox1.insert(tkinter.END, uses[x])
			users.append('------Group chat-------')
		except:
			data = data.split('~')
			message = data[0]
			userName = data[1]
			chatwith = data[2]
			message = '\n' + message
			if chatwith == '------Group chat-------':  # 群聊
				if userName == user:
					listbox.insert(tkinter.END, message)
				else:
					listbox.insert(tkinter.END, message)
			elif userName == user or chatwith == user: # 私聊
				if userName == user:
					listbox.tag_config('tag2', foreground='red')
					listbox.insert(tkinter.END, message, 'tag2')
				else:
					listbox.tag_config('tag3', foreground='green')
					listbox.insert(tkinter.END, message,'tag3')

			listbox.see(tkinter.END)
r = threading.Thread(target=receive)
r.start() # 開始線程接收信息

root1.mainloop()
s.close()

關(guān)于使用Python怎么實現(xiàn)一個網(wǎng)絡(luò)聊天室功能問題的解答就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,如果你還有很多疑惑沒有解開,可以關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道了解更多相關(guān)知識。

文章名稱:使用Python怎么實現(xiàn)一個網(wǎng)絡(luò)聊天室功能-創(chuàng)新互聯(lián)
分享URL:http://www.js-pz168.com/article38/cdoosp.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供微信小程序關(guān)鍵詞優(yōu)化品牌網(wǎng)站設(shè)計網(wǎng)站建設(shè)小程序開發(fā)品牌網(wǎng)站建設(shè)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

微信小程序開發(fā)
久久99久久人婷婷精品综合_超碰aⅴ人人做人人爽欧美_亚洲电影第三页_日韩欧美一中文字暮专区_波多野结衣的一区二区三区_婷婷在线播放_人人视频精品_国产精品日韩精品欧美精品_亚洲免费黄色_欧美性猛交xxxxxxxx
亚洲男人的天堂在线aⅴ视频| 日韩vs国产vs欧美| 日本免费新一区视频| 国产成人免费在线视频| 国产日韩一区二区| 欧美性三三影院| 国产色产综合色产在线视频| 亚洲成人av中文| 成人小视频免费在线观看| 蜜桃视频日韩| 91精品国产综合久久久蜜臀粉嫩| 国产精品久久久久久久裸模| 男女视频一区二区| 99re在线视频上| 在线免费观看成人短视频| 国产视频一区二区在线观看| 日韩电影在线免费看| 99re在线精品| 色女孩综合影院| 欧美国产日韩精品免费观看| 免费不卡在线视频| 国产99在线免费| 精品视频一区 二区 三区| 国产精品青草久久| 国产一区二区三区美女| 精品伦精品一区二区三区视频 | 色狠狠桃花综合| 欧美国产成人精品| 九九九精品视频| 欧美日韩国产高清视频| 日韩一级欧美一级| 亚洲图片欧美视频| 91女厕偷拍女厕偷拍高清| 一本一道久久a久久综合精品 | av欧美精品.com| 色中色一区二区| 欧美国产精品一区| 韩国成人在线视频| 日本不卡二区高清三区| 亚洲精品在线免费观看视频| 日韩黄色免费网站| 国产欧美日韩一区| 91精品国产手机| 亚洲va欧美va国产va天堂影院| 91嫩草在线| 欧美久久久一区| 亚洲成人动漫av| 国产伦一区二区三区色一情| 91精品国产品国语在线不卡| 亚洲国产精品麻豆| 不卡一卡2卡3卡4卡精品在| 欧美日韩激情在线| 亚洲国产成人va在线观看天堂| 91偷拍与自偷拍精品| 欧美日韩精品电影| 午夜精品福利久久久| 激情视频一区二区| 精品免费一区二区三区| 久久er精品视频| 日韩性感在线| 最近中文字幕一区二区三区| 不卡av在线免费观看| 欧美日韩一级二级| 午夜视频久久久久久| 久久99国产精品| 国产日韩高清在线| 国产成人a级片| 欧美色老头old∨ideo| 亚洲国产精品久久人人爱蜜臀| 国产精品一 二 三| 精品国产99国产精品| 久久99久久久欧美国产| 亚洲精品成人a8198a| 亚洲人午夜精品天堂一二香蕉| 99se婷婷在线视频观看| 精品久久久三级丝袜| 国产精品一二三四| 91福利视频网站| 午夜精品福利一区二区三区蜜桃| 蜜桃视频成人| 亚洲色欲色欲www| 国产精品推荐精品| 久久久电影一区二区三区| 成人一区二区三区视频在线观看| 欧美亚洲一区二区三区四区| 肉丝袜脚交视频一区二区| 色姑娘综合av| 亚洲一区二区三区视频在线播放| 精品乱子伦一区二区三区| 中文字幕欧美国产| 不卡一区二区三区四区五区| 久久久久久久免费视频了| 成人丝袜18视频在线观看| 欧美一级午夜免费电影| 国产麻豆日韩欧美久久| 欧美三级中文字幕在线观看| 蜜臀av亚洲一区中文字幕| 色综合视频一区二区三区高清| 亚洲成av人**亚洲成av**| 欧美主播一区二区三区美女 久久精品人| 亚洲欧洲色图综合| 老牛影视免费一区二区| 18涩涩午夜精品.www| 久久草.com| 亚洲精品乱码久久久久久黑人 | 成人一区在线观看| 日韩免费性生活视频播放| 岛国精品在线观看| 精品国产污污免费网站入口| av网站一区二区三区| 久久久久99精品国产片| 91麻豆福利精品推荐| 国产欧美日韩综合| 国产精品乱码| 日韩伦理av电影| 欧美日韩在线高清| 亚洲国产aⅴ成人精品无吗| 亚洲日本精品国产第一区| 天堂成人国产精品一区| 在线欧美日韩精品| 韩国视频一区二区| 日韩欧美中文字幕制服| kk眼镜猥琐国模调教系列一区二区 | 91视频www| 国产精品免费av| 久久久久一区二区| 亚洲国产婷婷综合在线精品| 中文精品视频一区二区在线观看| 免费精品视频最新在线| 欧美日韩国产123区| 国产超碰在线一区| 久久久久青草大香线综合精品| 国产精品xxxx| 亚洲精品国产视频| 一本一道久久a久久精品综合蜜臀| 美女视频免费一区| 91精品国产色综合久久不卡电影 | 日本高清不卡三区| 日韩精品三区四区| 5月丁香婷婷综合| 99在线精品一区二区三区| 国产精品三级视频| 日韩欧美亚洲区| 久久激情五月激情| 精品国产乱码91久久久久久网站| 99精彩视频| 亚洲一区二区三区三| 欧美在线三级电影| 99久久婷婷国产综合精品电影 | 久久影院理伦片| 日韩成人一级片| 欧美一区二区三区不卡| 97视频中文字幕| 亚洲一区二区在线视频| 欧美性高清videossexo| 99视频有精品| 亚洲人123区| 在线精品视频免费观看| 成人美女视频在线观看| 中文字幕一区二区三区在线播放| 夜夜春亚洲嫩草影视日日摸夜夜添夜| 国内精品久久久久影院一蜜桃| 337p粉嫩大胆噜噜噜噜噜91av| 免费毛片一区二区三区久久久| 蜜臀av性久久久久蜜臀av麻豆| 精品国精品自拍自在线| 久久久久九九九| 久色婷婷小香蕉久久| 久久久久久久久久久黄色| 日韩av高清在线播放| 国内精品国产成人国产三级粉色| 久久久精品蜜桃| 亚洲高清在线播放| 高清不卡一二三区| 亚洲男人电影天堂| 欧美日韩www| 精品国产乱码久久久久久108| 男男gaygay亚洲| 国产亚洲人成网站| 制服国产精品| 91九色极品视频| 调教+趴+乳夹+国产+精品| 日韩免费电影一区| 日本在线成人一区二区| 国产成人在线视频网址| 亚洲欧洲国产日本综合| 欧美性大战久久| 国模精品娜娜一二三区| 精品影视av免费| 成人免费在线视频| 8x福利精品第一导航| 欧美极品视频一区二区三区| 国产一区二区不卡在线 | 免费观看在线综合色| 国产亲近乱来精品视频| 色婷婷亚洲精品| 鬼打鬼之黄金道士1992林正英| 日本一区中文字幕| 国产精品区一区二区三区| 欧美日韩国产小视频|