TCP 聊天工具[python]
文章目录
- 一、实验名称
- 二、实验目的
- 三、实验内容和要求
- 四、实验环境
- 五、操作方法与实验步骤
- 六、实验数据记录和结果分析
一、实验名称
建立聊天工具
二、实验目的
掌握Socket编程中流套接字的技术,实现多台电脑之间的聊天。
三、实验内容和要求
vii.掌握利用Socket进行编程的技术
viii.必须掌握多线程技术,保证双方可以同时发送
ix.建立聊天工具
x.可以和多个人同时进行聊天
xi.必须使用图形界面,显示双方的语录
四、实验环境
PC多台,操作系统Win7,win10(32位、64位)
具备软件python3.6 。
五、操作方法与实验步骤
服务端
1.调入多线程、与scoket包,用于实现多线程连接
2.记录本地地址与端口,开启监听,等待请求
3.收到某个客户端的请求,建立连接,为每一个客户端分配一个线程,并记录客户端地址与端口
4.收到某个客户端发送的数据,将数据转发给所有与服务器连接的客户机。
5.当某个客户端断开连接,通知所有与服务器连接的客户机。
6.服务器一直保持监听状态,等待其他客户端接入服务器
7.代码
import socket
import threadingnum=0def chat(service_client_socket,addr): # 等待接收客户端消息存放在2个变量service_client_socket和addr里if not addr in user: print('Accept new connection from %s:%s...' % addr)# 如果addr不在user字典里则执行以下代码for scs in serv_clie_socket: serv_clie_socket[scs].send(data +' 进入聊天室...'.encode('utf-8')) # 发送user字典的data和address到客户端user[addr] = data.decode('utf-8') #data 是最新进入聊天室的客户,解压后放入userserv_clie_socket[addr] = service_client_socket #将服务器与服务器端口号为addr的套接字放入字典# 接收的消息解码成utf-8并存在字典user里,键名定义为addr#print("可以开始聊天了>>>>>>") # 如果addr在user字典里,跳过本次循环while True:d = service_client_socket.recv(1024)if (('EXIT'.lower() in d.decode('utf-8'))|(d.decode('utf-8') == 'error1')):#如果EXIT在发送的data里name = user[addr] #user字典addr键对应的值赋值给变量nameuser.pop(addr) serv_clie_socket.pop(addr) #删除user里的addrfor scs in serv_clie_socket: #从user取出addressserv_clie_socket[scs].send((name + ' 离开了聊天室...').encode('utf-8')) #发送name和address到客户端print('Connection from %s:%s closed.' % addr)global numnum = num-1breakelse: print('"%s" from %s:%s' %(d.decode('utf-8'), addr[0], addr[1])) for scs in serv_clie_socket: #从user遍历出addressif serv_clie_socket[scs] != service_client_socket: #address不等于addr时,执行下面的代码serv_clie_socket[scs].send(d) #发送data到客户端s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # 创建socket对象addr = ('127.0.0.1', 9999)
s.bind(addr) # 绑定地址和端口s.listen(128)print('TCP Server on', addr[0], ":",addr[1],"......")user = {} # 存放字典{addr:name}
serv_clie_socket = {} #存放{socket:不同线程的套接字}
while True:try:print("等待接收客户端的连接请求....")service_client_socket, addr = s.accept() # 等待接收客户端的连接请求print("接收到客户端的连接请求....")except ConnectionResetError:print('Someone left unexcept.')data = service_client_socket.recv(1024)if data.decode()=='error1':print(addr,"关闭了登录窗口。。。")continueprint("data = ",data.decode())#为服务器分配线程num=num+1r = threading.Thread(target=chat, args=(service_client_socket,addr), daemon=True) r.start()print("聊天室人数:",num)
客户端
1.调入多线程、与scoket包,用于实现多线程连接,调入tkinter包,用于图形化页面展示
2.记录本地地址与端口,向服务器发送连接请求,建立持续连接
3.图形化登录界面,记录输入的用户名,发送给服务器
4.进入聊天界面,从服务器接收到的消息显示在左边,发送给服务器的消息显示在右边
5.退出时,弹出警示界面。退出后,与服务器断开连接,结束。
6.代码
7.其他:客户端代码中的server改成服务器地址,客户端可以在不同的电脑上运行连接服务器,通过服务器与其他的客户端通讯。
#客户端
import tkinter
from tkinter import font
import tkinter.messagebox
import socket
import threading
import timestring=''
def my_string(s_input):string = s_input.get()def Send(sock):'''发送数据的方法参数:sock:定义一个实例化socket对象server:传递的服务器IP和端口'''if string!='':message = name + ' : ' + stringdata = message.encode('utf-8')sock.send(data)if string.lower() == 'EXIT'.lower():exit()def recv(sock):sock.send(name.encode('utf-8'))while True:data = sock.recv(1024)#加一个时间戳time_tuple = time.localtime(time.time())str = ("{}点{}分".format(time_tuple[3],time_tuple[4]))rrecv = tkinter.Label(t,text=data.decode('utf-8'),width=40,anchor='w',bg='pink')#接收的消息靠左边rrecv.pack()def left():global stringstring = rv1.get()Send(s)if string!='':rleft = tkinter.Label(t,text=string,width=40,anchor='e')#发送的消息靠右边rleft.pack()rv1.set('')def Creat():global namename = n.get()#接收进程tr = threading.Thread(target=recv, args=(s,), daemon=True)# daemon=True 表示创建的子线程守护主线程,主线程退出子线程直接销毁tr.start()l.destroy()e.destroy() b.destroy()t.title("聊天室")t.geometry("500x600")rL0 = tkinter.Label(t,text='%s的聊天室'%name,width=40)rL0.pack()rL1 = tkinter.Label(t,text='请输入消息:',width=20, height=1)rL1.place(x=0,y=450)rE1 = tkinter.Entry(t, textvariable = rv1)rE1.place(x=200,y=450) rB1 = tkinter.Button(t, text="发送",command=left) rB1.place(x=380,y=450)#发送进程def JieShu():tkinter.messagebox.showwarning(title='你确定退出吗?', message='刚才你点击了关闭按钮')s.send("error1".encode('utf-8'))exit(0) s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server = ('10.100.207.40', 9999)
s.connect(server)#建立连接
t=tkinter.Tk()
t.title("多人聊天室")
t.geometry("300x200+500+200")
l = tkinter.Label(t,text='多人聊天室欢迎您,请输入你的名称',width=40, height=8)
l.pack()
n = tkinter.StringVar()
e = tkinter.Entry(t, width=15,textvariable = n)
e.pack()
rv1 = tkinter.StringVar()
name = n.get()b = tkinter.Button(t, text="登录",width=40, height=10,command=Creat) b.pack()
t.protocol("WM_DELETE_WINDOW", JieShu)
t.mainloop()s.close()
六、实验数据记录和结果分析
1.服务器启动,等待客户机连接请求
2.客户端请求服务,客户端弹出登录窗口,输入用户名登录
3.服务器接收到请求,分配端口,并持续监听其他客户机的请求
4.客户端登陆后进入聊天窗口
5.进入聊天室的用户,发送消息,其他用户都可以接收到,服务器也能看到
6.客户机退出连接,其他用户都可以接收到,服务器也能看到
7.其他客户机可以中途进入聊天室
TCP 聊天工具[python]相关推荐
- TCP聊天工具的实现
由于本人天生愚钝,所以关于聊天工具的编程一直都没学会,尽管网上教程一大堆,但是关于IdTCPClient IdTCPServer 的不多,今天终于学会一些,分享给像我一样纠结的小伙伴,下一步学习多线 ...
- python语言视频-Python语言之Python3 实现简易局域网视频聊天工具
本文主要向大家介绍了Python语言之Python3 实现简易局域网视频聊天工具,通过具体的内容向大家展示,希望对大家学习Python语言有所帮助. 操作系统为 Ubuntu 16.04,OpenCV ...
- python socket能做什么_用python写一个聊天小程序!和女朋友的专属聊天工具!
原标题:用python写一个聊天小程序!和女朋友的专属聊天工具! 1.UDP简介 Internet协议集支持一个无连接的传输协议,该协议称为用户数据报协议(UDP).UDP为应用程序提供了无需建立就可 ...
- [NUAA]Python用UDP协议建立带有私聊功能的网络聊天室-建立聊天工具
文章目录 前言 1.网络聊天室的基本架构是什么? 1.1 客户端和服务器的架构 1.2 通信协议的选择以及多线程通信 1.2.1 多线程通信 1.2.2 通信协议选择 1.3 前后端功能设计思路 1. ...
- 【Java】TCP Socket编程案例——文件传输聊天工具
TCP(传输控制协议)是面向连接的可靠数据传输协议.TCP连接一旦建立起来,一直占用,直到关闭连接.另外,TCP为了保证数据的正确性,会重发一切没有收到的数据,还会对数据内容进行验证,并保证数据传输的 ...
- 基于JAVA的TCP网络QQ聊天工具系统
目 录 1 功能设计 1 1.1功能概述 1 1.2功能模块图 1 2 逻辑设计 2 3 界面设计 4 3.1注册界面: 4 3.2登录界面 5 3.3好友列表页面 5 3.4好友聊天页面 6 3.5 ...
- 基于TCP,Socket编程,模仿腾讯QQ界面,使用Java开发的一款网络聊天工具。QQ_Chat
代码下载地址 原博客地址 QQ_Chat 基于TCP,Socket编程,模仿腾讯QQ界面,使用Java开发的一款网络聊天工具. (内含报告) 工具: Eclipse.Navicat for MySQL ...
- 利用TCP/UDP 协议制作一个飞秋聊天工具
视频操作演示: 利用TCP/UDP 协议制作一个飞秋聊天工具演示视频 int udp_broadcast(char const*argv[]) {//1.创建对象udp_socket = socket ...
- 基于TCP的QQ聊天工具
###前言: 基于JAVA语言开发的一款网络聊天工具,通过Socket实现TCP编程,使用多线程实现了多客户端的连接.模仿腾讯QQ的界面,功能较为简单,但是使用了最基本的网络编程技术,如socket. ...
最新文章
- 贵州高二会考计算机考试题,20167月贵州普通高中学业水平考试会考试题
- 013_Redis的主从模式
- Python time.time()方法
- 计算机考试题库电子版,全国计算机等级考试一级试题库大全完整版附参考答案...
- Ext JS的模块化开发(Package)
- java表格选中事件_表格中删除选中的操作
- 整理索引碎片,提升SQL Server速度 SQL Server“吃内存”的解决(转载)
- 电功图matlab,基于Matlab的电力系统输电线路仿真
- 数据分析 线性回归分析 方差分析表
- vue 使用 vue-awesome-swiper(swiper)解决方法
- ICCV 2019|70 篇论文抢先读,含目标检测/自动驾驶/GCN/等(提供PDF下载)
- 杭电计算机专业期末考试助攻,杭电嘻哈:舶来文化亦可玩出小清新
- EXCEL中快速在下方插入空白行,并且与下方空白单元格合并
- 鼠标移动到图片上实现图片的放大缩小
- 不同的声音-我为什么反对用Node
- 网络舆情信息整理分析怎么有效做好的方法
- Prometheus监控实战系列十七:探针监控
- 长沙:胆大、心细、眼疾手快的“复苏先锋”
- 情人节表白代码 静态网页表白
- Matlab pcode p文件 p代码 p文件代转m文件 被加密的p文件转换成.m文件