python聊天室(虽然很简洁,但是可以用)
作者:wangziwenhk 发布时间:2021-05-21 01:10:46
标签:python,聊天室
python聊天室
很多人都觉得微信,QQ,ICQ(我不知道现在还能不能用了)都过于垃圾,想要自己做一个聊天室(或是聊天软件),所以我们可以自己做一个。
想要做出聊天室(或是聊天软件),我们就需要搞清楚它们的原理,这里我们用一个图片
来给你们看
我们可以看到,服务端其实就只是起到了一个转发消息的原理,搞清楚原理,就开始做
服务端
import socket,threading #导入文件
def shou(new_s,socket_list):#创建一个收的函数
try:
nikename = new_s.recv(1024).decode('utf-8').strip()#为当前客户端执行一次‘收'来获取
except:
new_s.close()#关闭当前客户端的套接字
socket_list.remove(new_s)#去除套接字列表里的nes_s
for i in socket_list:
i.send('\n公告:一个未知的人离开了聊天室......'.encode('utf-8'))#广播
return None
for i in socket_list:
i.send(f'\n公告:欢迎{nikename}进入了聊天室........\n'.encode('utf-8'))#广播
while 1:
try:
recv_data = new_s.recv(1024).decode('utf-8')#如果接受到了客户端发来的信息
print(recv_data)#仅作提醒用
for i in socket_list:
i.send(f'{nikename}:{recv_data}'.encode('utf-8'))#广播
except:
new_s.close()#关闭当前客户端的套接字
socket_list.remove(new_s)#去除套接字列表里的nes_s
for i in socket_list:
i.send(f'公告:{nikename}离开了聊天室......'.encode('utf-8'))#广播
break#跳出循环
def fa(new_s):
while 1:
msg = input('')#发出
new_s.send(msg.encode('utf-8'))
#创建套接字
s = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
#绑定
s.bind(("",5678))#端口
#监听
s.listen(5)
print('服务端处于监听状态,等待客户端接入..........')
socket_list = []
while 1:
#接入
new_s,addr = s.accept()
print('客户端已接入')
socket_list.append(new_s)
new_s.send('请输入昵称:'.encode('utf-8'))
t1 = threading.Thread(target=shou,args=(new_s,socket_list))
t2 = threading.Thread(target=fa,args=(new_s,))
t1.start()
t2.start()
# new_s.close()
# s.close()
客户端
怎么样,服务端是不是很简单?接下来我们做客户端
import socket,threading
import tkinter as tk
#创建套接字
a = 1
s = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
s.connect(("127.0.0.1",5678))#此处端口看服务端的端口,127.0.0.1要改成服务端主机的ipv4地址
print('已链接服务端,通讯加密中')
def shou(s,msg_texe):
recv_data = s.recv(1024).decode('utf-8')
msg_text.insert(tk.END, recv_data)
while 1:
recv_data = s.recv(1024).decode('utf-8')
msg_text.insert(tk.END,recv_data)
def fa():
global a
if a == 0:
msg = input_text.get('0.0',tk.END)
s.send(msg.encode('utf-8'))
input_text.delete('0.0',tk.END)
else:
msg = input_text.get('0.0', tk.END)
s.send(msg.encode('utf-8'))
input_text.delete('0.0', tk.END)
msg_text.delete('0.0', tk.END)
a = 0
app = tk.Tk()
app.title('聊天室')
#显示消息框
msg_frame = tk.Frame(app,width=480,height=300)
msg_frame.grid(row=0,column=0,padx=6,pady=6)
msg_frame.grid_propagate(0)#固定Frame的大小
msg_text = tk.Text(msg_frame,bg='white')
msg_text.grid()
# msg_text.insert('0.0','hhh')
#输入
input_frame = tk.Frame(app,width=480,height=100)
input_frame.grid(row=1,column=0)
input_frame.grid_propagate(0)
input_text = tk.Text(input_frame,bg='white')
input_text.grid()
#发送按钮
btn_frame = tk.Frame(app,width=480,height=20)
btn_frame.grid(row=2,column=0,sticky='E')
button = tk.Button(btn_frame,text='发送',command=fa)
button.grid()
#线程
t1 = threading.Thread(target=shou,args=(s,msg_text))
t1.daemon = True
t1.start()
app.mainloop()
#s.close()
伸手党下载链接:https://pan.baidu.com/s/1KD6p_a2KgFxbOVN5yftQRw
提取码:2iwk
来源:https://blog.csdn.net/wangziwenhk/article/details/119810028
0
投稿
猜你喜欢
- 本文实例讲述了Golang算法问题之数组按指定规则排序的方法。分享给大家供大家参考,具体如下:给出一个二维数组,请将这个二维数组按第i列(i
- 按数量级递增排列,常见的时间复杂度有:常数阶O(1),对数阶O(log2n),线性阶O(n),线性对数阶O(nlog2n),平方阶O(n2)
- 经常写 shell 脚本知道,字符串判断可以用 =,!= 数字的判断是 -eq,-ne 等,但是 Python 确不是这样子的。所以作为慢慢
- 有时候发微博时候,需要裁切图片为九宫格,但是ps或者其他工具都太麻烦,这里写一个python一键切割九宫格的工具,以供大家学习和使用!实现代
- 如下:counter.htm<a href=counter.asp?save=123&url=http://127.0.0
- 报错现象File "<string>", line 1SyntaxError: unexpected EOF
- --使用说明 本代码适用于MsSql2000,对于其它数据库也可用.但没必要 --创建存储过程 CREATE PROCEDURE pagin
- 本文实例讲述了Python3使用requests包抓取并保存网页源码的方法。分享给大家供大家参考,具体如下:使用Python 3的reque
- 环境:window7 x64、python3.4、django1.10一、pip install xadmin安装报错1、使用pip ins
- 首先,我们要先看看微信远程控制电脑的原理是什么呢? 我们可以利用Python的标准库控制本机电脑,然后要实现远程的话,我们可以把电子邮件作为
- 刚开始涉及到图像处理的时候,在opencv等库中总会看到mask这么一个参数,非常的不理解,在查询一系列资料之后,写下它们,以供翻阅。什么是
- 本文实例讲述了Python数据分析之双色球基于线性回归算法预测下期中奖结果。分享给大家供大家参考,具体如下:前面讲述了关于双色球的各种算法,
- 代码如下:<% class MyClass Dim var '公共变量必须使
- 原文地址:30 Days of Mootools 1.2 Tutorials - Day 11 - Using Fx.Morph, Fx O
- 1. SELECT INTO 语句用途:SELECT INTO 语句从一个表复制数据,然后把数据插入到另一个新表中,表结构与查询结构一致。P
- 本文总结了ASP初学者常犯的几个错误,希望对asp学习者有所帮助!1.记录集关闭之前再次打开:-----------------------
- 一些简单的代码简化下面是一个简单示例,它说明了 jQuery 对代码的影响。要执行一些真正简单和常见的任务,比方说为页面的某一区域中的每个链
- 1.什么是面向对象面向对象(oop)是一种抽象的方法来理解这个世界,世间万物都可以抽象成一个对象,一切事物都是由对象构成的。应用在编程中,是
- 前言首先要明确Go语言中实质只有值传递,引用传递和指针传递是相对于参数类型来说。个人认为上诉的结论不对,把引用类型看做对指针的封装,一般封装
- 开发客户端客户是持有TPCoins并从网络上的其他供应商处交换商品/服务的客户,包括他自己的.我们应该为此目的定义 Client&