本文主要介绍Python实现在线聊天室(支持多人聊天和私聊)的示例代码。本文介绍的示例代码非常详细,对大家的学习或工作都有一定的参考价值。下面让我们跟随边肖一起学习。
实验名称:
网络聊天室
功能:
掌握Socket编程技术
二。掌握多线程技术,保证双方可以同时发送。
三。建立一个聊天工具
四。你可以和一个人聊天
你可以同时和很多人聊天
不及物动词使用图形界面显示双方的报价。
七。程序在某种程度上可能会被误认。
概述
通过实验聊天室,一个或多人可以聊天交流,功能的实现主要通过Socket通信来实现。本实验采用客户端/服务器(C/S)架构模式,服务器端和客户端程序均采用Python语言编写。多线程可以用来完成多点对多点的聊天。
服务器程序主要用于接收用户信息,接收和转发消息。
客户端程序实现用户注册登录、聊天信息显示和信息输入。
代码解释
统计当前在线用户的数量,并向用户列表中添加新用户。
Serve.py
这是聊天服务的服务器实现。
通过继承线程实现多线程。线程类,并重写运行函数。
接受来自客户端的用户名。如果用户名为空,则使用用户的IP和端口作为用户名。如果有重复的用户名,请在出现的用户名后添加后缀“2”、“3”和“4”.
获得用户名后,它会不断接受来自客户端的消息(即聊天内容),然后关闭连接。
如果用户断开连接,请从用户列表中删除该用户并更新用户列表。
将地址和数据(要发送给客户机)存储在消息队列中。
服务器收到数据后,会进行处理并发送给客户端,如下图所示。对于聊天内容,服务器会直接发送给客户端,而对于用户列表,则由json.dumps处理后发送
Client.py
建立连接,发送用户名,判断是否是私聊消息。私聊由~
接受从服务器发送的消息。
判断收到的消息。如果是在线用户列表(用json.dumps处理),则清除在线用户列表框,并在在线用户列表框中输出该列表。
如果是聊天内容,会在聊天内容显示框中输出。
设置登录窗口
设置消息接口
设置在线用户列表。
完整代码:
Serve.py
导入插座
导入线程
导入队列
导入json # json.dumps(一些)包json.loads(一些)解包。
导入操作系统
导入os.path
导入系统
IP='127.0.0.1 '
端口=9999 #端口
消息=队列。队列()
用户=[] # 0:用户名1:连接
锁=线程。锁定()
Def onlines(): #统计当前在线人员
在线=[]
对于范围内的I(len(users)):
online.append(用户[i][0])
在线返回
类ChatServer(线程。线程):
全局用户,缺省,锁定
Def __init__(self): #构造函数
threading.Thread.__init__(self)
self.s=socket.socket(socket。AF_INET,socket。袜子_流)
os.chdir(sys.path[0])
#接受来自客户端的用户名。如果用户名为空,则使用用户的IP和端口作为用户名。如果有重复的用户名,请在出现的用户名后添加后缀“2”、“3”和“4”.
Def receive(self,conn,addr): #接收消息
User=conn.recv(1024) #用户名
user=user.decode()
If=='用户名不存在':
user=addr[0] ':' str(addr[1])
标签=1
临时=用户
对于i in range(len(users)): #检查重复的名称,然后在重复的用户后添加一个数字。
如果用户[i][0]==用户:
标签=标签1
user=临时字符串(标签)
users.append((用户,康涅狄格州))
USERS=onlines()
自我。加载(用户,地址)
#获得用户名后,它会不断接受来自客户端的消息(即聊天内容),然后关闭连接。
尝试:
虽然正确:
message=conn.recv(1024) #发送消息
message=message.decode()
消息=用户“:”消息
自我。加载(消息,地址)
conn.close()
# 如果用户断开连接,将该用户从用户列表中删除,然后更新用户列表。
除了:
j=0 #用户断开连接
对于用户中的男人:
if man[0]==用户:
users.pop(j) #服务器段删除退出的用户
破裂
j=j 1
USERS=onlines()
自我。加载(用户,地址)
conn.close()
# 将地址与数据(需发送给客户端)存入信息队列。
定义加载(自身、数据、地址):
lock.acquire()
尝试:
messages.put((addr,data))
最后:
lock.release()
# 服务端在接受到数据后,会对其进行一些处理然后发送给客户端,如下图,对于聊天内容,服务端直接发送给客户端,而对于用户列表,便由json.dumps处理后发送。
定义发送数据(自身):#发送数据
虽然正确:
如果不是messages.empty():
message=messages.get()
如果是实例(消息[1],字符串):
对于范围内的我(贷款(用户)):
数据=' '消息[1]
用户[i][1].send(data.encode())
打印(数据)
打印(' \n ')
如果是实例(消息[1],列表):
data=json.dumps(消息[1])
对于范围内的我(贷款(用户)):
尝试:
用户[i][1].send(data.encode())
除了:
及格
定义运行(自身):
self.s.bind((IP,PORT))
自我倾听(5)
q=线程。线程(target=self.sendData)
q.start()
虽然正确:
conn,addr=self.s.accept()
t=螺纹Thread(target=self.receive,args=(conn,addr))
启动()
self.s.close()
if __name__=='__main__ ':
cserver=ChatServer()
cserver.start()
Client.py
导入插座
导入tkinter
导入tkinter.messagebox
导入线程
导入json
导入tkinter.filedialog
从tkinter.scrolledtext导入scrolledtext
IP=' '
端口=' '
用户=' '
listbox1='' #用于显示在线用户的列表框
显示=1 #用于判断是开还是关闭列表框
用户=[] #在线用户列表
聊天=' -群聊- ' #聊天对象
#登陆窗口
root0=tkinter .Tk()
root0.geometry('300x150 ')
root0.title('用户登陆窗口)
root0.resizable(0,0)
一=tkinter .标签(根0,宽度=300,高度=150,bg='浅蓝色)
one.pack()
IP0=tkinter .字符串变量()
IP0.set(" ")
USER=tkinter .字符串变量()
USER.set(" ")
labelIP=tkinter .Label(root0,text='IP地址,bg='浅蓝色)
labelIP.place(x=20,y=20,宽度=100,高度=40)
entryIP=tkinter .条目(root0,width=60,textvariable=IP0)
恩特瑞普。place(x=120,y=25,宽度=100,高度=30)
labelUSER=tkinter .Label(root0,text='用户名,bg='浅蓝色)
labelUSER.place(x=20,y=70,宽度=100,高度=40)
entryUSER=tkinter .条目(root0,width=60,textvariable=USER)
entryUSER.place(x=120,y=75,宽度=100,高度=30)
定义登录(*args):
全局IP,端口,用户
IP,PORT=entryIP.get().拆分(':')
user=entryUSER.get()
如果不是用户:
tkinter。messagebox。显示警告(' warning ',message='用户名为空!')
否则:
root0.destroy()
登录按钮=tkinter .按钮(root0,text='登录,command=Login,bg='Yellow ')
loginButton.place(x=135,y=110,宽度=40,高度=25)
root0.bind('Return ',Login)
root0.mainloop()
# 建立连接
s=socket.socket(socket .AF_INET,插座.袜子_流)
s.connect((IP,int(PORT)))
如果用户:
s.send(user.encode()) #发送用户名
否则:
s.send('用户名不存在encode())
用户=IP ':'端口
# 聊天窗口
root1=tkinter .Tk()
root1.geometry('640x480 ')
root1.title('群聊)
root1.resizable(0,0)
# 消息界面
listbox=ScrolledText(root1)
listbox.place(x=5,y=0,宽度=640,高度=320)
listbox.tag_config('tag1 ',前景='红色,背景='黄色)
listbox.insert(tkinter .'结束'欢迎进入群聊,大家开始聊天吧!','标签1 ')
输入=tkinter .字符串变量()
INPUT.set(' ')
entryIuput=tkinter .Entry(root1,width=120,textvariable=INPUT)
entryIuput.place(x=5,y=320,宽度=580,高度=170)
# 在线用户列表
listbox1=tkinter .列表框(根1)
listbox1.place(x=510,y=0宽度=130,高度=320)
极好的发送(*args):
message=entryiuput。get()' ~ ' user ' ~ ' chat
s.send(message.encode())
INPUT.set(' ')
sendButton=tkinter .按钮(root1,text='\n发\n\n\n送,anchor='n ',command=send,font=('Helvetica ',18),bg='怀特)
sendButton.place(x=585,y=320,宽度=55,高度=300)
根1。bind("返回",发送)
定义接收():
全球使用
虽然正确:
data=s.recv(1024)
data=data.decode()
打印(数据)
尝试:
uses=json.loads(数据)
listbox1.delete(0,tkinter .结束)
listbox1.insert(tkinter .'结束'当前在线用户)
listbox1.insert(tkinter .结束,'-群聊-')
对于范围内的x(len(uses)):
listbox1.insert(tkinter .结束,使用[x])
users.append(' -群聊-')
除了:
data=data.split('~ ')
消息=数据[0]
用户名=数据[1]
chatwith=data[2]
消息='\n '消息
如果chatwith==' -群聊- ': #群聊
如果用户名==用户:
listbox.insert(tkinter .结束,消息)
否则:
listbox.insert(tkinter .结束,消息)
elif用户名==用户或chatwith==user: #私聊
如果用户名==用户:
listbox.tag_config('tag2 ',foreground='red ')
listbox.insert(tkinter .结束,消息,"标签2")
否则:
listbox.tag_config('tag3 ',前景='绿色)
listbox.insert(tkinter .结束,消息,"标签3")
listbox.see(tkinter .结束)
r=螺纹。线程(目标=接收)
r.start() #开始线程接收信息
root1.mainloop()
关闭()
到此这篇关于计算机编程语言实现网络聊天室的示例代码(支持多人聊天与私聊)的文章就介绍到这了,更多相关计算机编程语言网络聊天室内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。