文章目录

  • 一、实验名称
  • 二、实验目的
  • 三、实验内容和要求
  • 四、实验环境
  • 五、操作方法与实验步骤
  • 六、实验数据记录和结果分析

一、实验名称

建立聊天工具

二、实验目的

掌握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]相关推荐

  1. TCP聊天工具的实现

    由于本人天生愚钝,所以关于聊天工具的编程一直都没学会,尽管网上教程一大堆,但是关于IdTCPClient  IdTCPServer 的不多,今天终于学会一些,分享给像我一样纠结的小伙伴,下一步学习多线 ...

  2. python语言视频-Python语言之Python3 实现简易局域网视频聊天工具

    本文主要向大家介绍了Python语言之Python3 实现简易局域网视频聊天工具,通过具体的内容向大家展示,希望对大家学习Python语言有所帮助. 操作系统为 Ubuntu 16.04,OpenCV ...

  3. python socket能做什么_用python写一个聊天小程序!和女朋友的专属聊天工具!

    原标题:用python写一个聊天小程序!和女朋友的专属聊天工具! 1.UDP简介 Internet协议集支持一个无连接的传输协议,该协议称为用户数据报协议(UDP).UDP为应用程序提供了无需建立就可 ...

  4. [NUAA]Python用UDP协议建立带有私聊功能的网络聊天室-建立聊天工具

    文章目录 前言 1.网络聊天室的基本架构是什么? 1.1 客户端和服务器的架构 1.2 通信协议的选择以及多线程通信 1.2.1 多线程通信 1.2.2 通信协议选择 1.3 前后端功能设计思路 1. ...

  5. 【Java】TCP Socket编程案例——文件传输聊天工具

    TCP(传输控制协议)是面向连接的可靠数据传输协议.TCP连接一旦建立起来,一直占用,直到关闭连接.另外,TCP为了保证数据的正确性,会重发一切没有收到的数据,还会对数据内容进行验证,并保证数据传输的 ...

  6. 基于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 ...

  7. 基于TCP,Socket编程,模仿腾讯QQ界面,使用Java开发的一款网络聊天工具。QQ_Chat

    代码下载地址 原博客地址 QQ_Chat 基于TCP,Socket编程,模仿腾讯QQ界面,使用Java开发的一款网络聊天工具. (内含报告) 工具: Eclipse.Navicat for MySQL ...

  8. 利用TCP/UDP 协议制作一个飞秋聊天工具

    视频操作演示: 利用TCP/UDP 协议制作一个飞秋聊天工具演示视频 int udp_broadcast(char const*argv[]) {//1.创建对象udp_socket = socket ...

  9. 基于TCP的QQ聊天工具

    ###前言: 基于JAVA语言开发的一款网络聊天工具,通过Socket实现TCP编程,使用多线程实现了多客户端的连接.模仿腾讯QQ的界面,功能较为简单,但是使用了最基本的网络编程技术,如socket. ...

最新文章

  1. 贵州高二会考计算机考试题,20167月贵州普通高中学业水平考试会考试题
  2. 013_Redis的主从模式
  3. Python time.time()方法
  4. 计算机考试题库电子版,全国计算机等级考试一级试题库大全完整版附参考答案...
  5. Ext JS的模块化开发(Package)
  6. java表格选中事件_表格中删除选中的操作
  7. 整理索引碎片,提升SQL Server速度 SQL Server“吃内存”的解决(转载)
  8. 电功图matlab,基于Matlab的电力系统输电线路仿真
  9. 数据分析 线性回归分析 方差分析表
  10. vue 使用 vue-awesome-swiper(swiper)解决方法
  11. ICCV 2019|70 篇论文抢先读,含目标检测/自动驾驶/GCN/等(提供PDF下载)
  12. 杭电计算机专业期末考试助攻,杭电嘻哈:舶来文化亦可玩出小清新
  13. EXCEL中快速在下方插入空白行,并且与下方空白单元格合并
  14. 鼠标移动到图片上实现图片的放大缩小
  15. 不同的声音-我为什么反对用Node
  16. 网络舆情信息整理分析怎么有效做好的方法
  17. Prometheus监控实战系列十七:探针监控
  18. 长沙:胆大、心细、眼疾手快的“复苏先锋”
  19. 情人节表白代码 静态网页表白
  20. Matlab pcode p文件 p代码 p文件代转m文件 被加密的p文件转换成.m文件

热门文章

  1. python:用OLS 求企业的净利润年平均增长率
  2. 算法4:数列极差问题(贪心算法)
  3. 【C语言】实现字符串逆序输出(包含空格的字符串)
  4. I - 最大公约数GCD
  5. 深入解析python版SVM源码系列(三)——计算样本的预测类别
  6. Docker部署onlyoffice并完成20最大连接数破解
  7. 'string' : undeclared identifier
  8. 基于SSM网上商城系统(附论文)
  9. 用JavaScript在网页右下角弹出窗口
  10. 显示屏连接DL580服务器方法,HPE ProLiant DL580 Gen9 服务器用户指南.pdf