python互联网程序设计GUI程序设计和网络程序设计(人机互动聊天软件)

news2024/9/25 15:29:39

1.项目意义

1、了解网络的结构;
2、了解网络传输协议;
3、掌握基本的网络编程方法。

2.总体设计

使用 TCP 协议实现人机聊天互动,程序具有服务端和客户端:

(1)必备功能:要求服务端代码具有一定的智能,能够根据不完整的问题识别客户端真正 要问的问题。如客户输入how old, 服务器能回答年龄。

(2)必备功能:服务器客户端之间能简单发送和接收文件。至少应有序列化和反序列化功 能。收发双方,应打印显示发送或接收的原始对象的信息(非字节串)。

3.程序描述

1、TCP客户端:
(1)发送信息的函数

def SendMessage():
	mySocket.sendall("111-111".encode())
	sendLines = SendInput.get("0.0", END)
	mySocket.sendall(sendLines.encode())
	ShowInput.insert(END,"\t\t\t"+sendLines[:-1]+" :(Client)\n")
	ShowInput.insert(END,"(Server):"+mySocket.recv(BUFSIZE).decode()+"\n")
SendInput.delete("0.0", END)

(2)发送文件的函数

def SendFile():
	mySocket.sendall("222-222".encode())
	filename = askopenfilename()
	#ShowInput.insert(END, filename+ s +"  SendFile \n")
	#建立socket
	file_size=os.path.getsize(filename)
	fhead = struct.pack('l',file_size)
	mySocket.sendall(fhead)
	fp=open(filename,'rb')
	while True:      
	    data=fp.read(BUFSIZE)
	    if not data:
	        break
	    mySocket.sendall(data)
	fp.close()
	ShowInput.insert(END, "filename: "+filename+" :(Client)\n")
	ShowInput.insert(END, "\t\t\t\tsend over"+" :(Client)\n")

(3)界面部分

frame = Frame(RootWindow, bg = 'Tan',)
frame1 = Frame(RootWindow, bg = 'Tan',)

ShowInput = Text(RootWindow, width = 200, 
							height = 7, 
							bg = 'Tan', 
							fg = 'linen',
							font = ('微软雅黑',10))
SendInput = Text(RootWindow, width = 200, 
							height = 4, 
							bg = 'Tan', 
							fg = 'linen',
							font = ('微软雅黑',10))
MessageLabel = Label(frame, text = "收发信息框:",
							bg = 'Tan',
  							fg = 'linen',
  							font = ('微软雅黑',8))

InputLabel = Label(frame1, text = "输入框:",
							bg = 'Tan',
  							fg = 'linen',
  							font = ('微软雅黑',8))

blankLabel = Label(RootWindow)

ChatBtn = Button(RootWindow, text = "聊天", 
							width = 7, 
							relief = RIDGE,
  							bg = 'Tan',
  							fg = 'linen',
  							font = ('微软雅黑',11),
							command = SendMessage)

FielBtn = Button(RootWindow, text = "发送文件",
							width = 7, 
							relief = RIDGE,
  							bg = 'Tan',
  							fg = 'linen',
  							font = ('微软雅黑',11),
							command = SendFile)

menubtn = Menubutton(RootWindow,text = '快速对话', 
								width = 7, 
								relief = RIDGE,
  								bg = 'Tan',
  								fg = 'linen',
  								font = ('微软雅黑',11))

menu = Menu(menubtn, tearoff = True)

for word in words:
	menu.add_radiobutton(label = word, command = lambda word_name = word : InsertLines(word_name))
menubtn.config(menu = menu)

(4)界面布局部分

frame.pack(side = 'top', padx = 10, pady = 0,fill = BOTH)
MessageLabel.pack(side = 'left', padx = 0, pady = 0)

ShowInput.pack(side = 'top', padx = 10, pady = 0)
blankLabel.pack(side = 'top', padx = 10, pady = 0)

frame1.pack(side = 'top', padx = 10, pady = 0,fill = BOTH)
InputLabel.pack(side = 'left', padx = 0, pady = 0)

SendInput.pack(side = 'top', padx = 10, pady = 0)
ChatBtn.pack(side = 'right', padx = 10, pady = 6)
FielBtn.pack(side = 'right', padx = 10, pady = 6)
menubtn.pack(side = 'right', padx = 10, pady = 6)

2、TCP服务端
(1)接收信息

if data == "111-111":
        #处理分析发送函数请求
        print("receive message!")
        messageFalg = True

    if messageFalg:
        if data != "111-111":
            print('Received message:', data[0:-1])

            #字符匹配
            mydata = ''
            for item in words.keys():
                if item.find(data[0:-1]) != -1:
                    mydata = item
                    break
            
            conn.sendall(words.get(mydata,"Sorry, I dont' know!").encode())
            messageFalg = False

(2)接收文件

if data == "222-222":
        print("receive file!")
        fileFlag = True
        
    if fileFlag:
        data = conn.recv(BUFSIZE)
        f_info=struct.unpack('l',data) 
        file_size=f_info[0]    
        recv_size=0

        while not recv_size==file_size:
            with open('ClientFile_'+str(filenuber)+'.dat','ab') as fp:  
                if file_size - recv_size > BUFSIZE:
                    data = conn.recv(BUFSIZE)              
                    recv_size += len(data)
                else:
                    data= conn.recv(file_size - recv_size) 
                    recv_size = file_size
                print(data)
                fp.write(data)
        filenuber = filenuber + 1
        print('received a file :' + 'ClientFile'+str(filenuber)+'.dat')
        fileFlag = False

4 测试要点

(1)测试TCP连接是否成功

(2)试接收信息是否完整

(3)测试智能回复聊天

(4)测试其他无关键词汇

(5)测试文件发送与接收

(2)试接收信息是否完整

在这里插入图片描述
在这里插入图片描述在这里插入图片描述

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/131435.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Java财务在线咨询网站系统财务咨询网

简介 财务咨询网站,可以咨询公司代办,代理记账等一系列的财务问题的资讯服务网站 演示视频 https://www.bilibili.com/video/BV1T54y1H7Ar/?share_sourcecopy_web&vd_sourceed0f04fbb713154db5cc611225d92156 角色 管理员客服注册用户游客 技术…

Spring之DI入门案例

目录 一:DI入门案例实现思路分析 1.要想实现依赖注入,必须要基于 IOC 管理 Bean 2.Service 中使用 new 形式创建的 Dao 对象是否保留 ? 3.Service 中需要的 Dao 对象如何进入到 Service 中 ? 4.Service 与 Dao 间的关系如何描述 ? 二&#xff1…

(Qt) cmake编译Qt项目

文章目录前言环境cmake基础预备的项目代码文件资源路径demo.promain.cppres.qrcmywidget.cppmywidget.hmywidget.ui运行效果CMake文件资源路径CMakeLists.txt生成与构建END前言 通常我们在编写qt的时候都是在Qt creator中。而如何在VS Code中编写qt就是本文需要解决的问题 环…

顺序表 —— 初始化、销毁、打印、增加、删除、查找、修改

1.何为线性表 线性表(linear list)是n个具有相同特性的数据元素的有限序列。 线性表是一种在实际中广泛使用的数据结构,常见的线性表:顺序表、链表、栈、队列、字符串…线性表在逻辑上是线性结构,也就说是连续的一条直…

zotero导出pdf

今天老师给我改论文的时候布置了一个任务,让我把所有论文的pdf按格式打包发给她。可是之前我用zotero的时候都是在线保存的,有些是没有pdf的,怎么办?而且就算有pdf,他们的命名格式也五花八门,难道一个个手改…

kafka 消息日志原理 指定偏移量消费 指定时间戳消费

Kafka 日志详解 Apache Kafka日志存储在物理磁盘上各种数据的集合,日志按照topic分区进行文件组织,每一个分区日志由一个或者多个文件组成。生产者发送的消息被顺序追加到日志文件的末尾。 如上图所述,Kafka主题被划分为3个分区。在Kafka中&…

vscode使用跳板机(密钥)进入内网并连接内网中其它机器(密码)

经过简单测试 1、不能像xshell一样选择服务器的密钥登陆,只能通过将本机的公钥传到服务器上 2、不能使用本地socket5做代理登录 3、不能使用系统代理登录 一、使用密钥连接到跳板机 1、内网穿透 2、将本机公钥上传到服务器上 1)建立密钥对 无论是win…

redis集群 mac安装

1.安装redis mac环境用brew install安装 brew install redis 安装好后默认配置启动单点服务 redis-server 注:brew默认程序安装在/usr/local/Cellar目录下 /usr/local/Cellar/redis 默认配置文件在 /usr/local/etc/redis.conf 2.创建配置文件 准备创建6个节…

谣言检测数据集

1 PHEME-R 这是一个在PHEME FP7项目的新闻学用例中收集和注释的数据集。这些谣言与9个不同的突发新闻相关。它是为分析社交媒体谣言而创建的,包含由谣言推文发起的推特对话;对话包括对这些谣言推文的回应推文。这些推文已经被注解为支持度、确定性和证…

VS2012安装教程

我要学只有我们两个人懂得C语言。 安装包:https://pan.baidu.com/s/1YR7Xk9Zlv7zQWCsERdVgIQ [提取码]:stvi 1、右键以管理员身份运行 “vs_ultimate.exe” 2、编辑软件安装位置,然后点击同意许可,之后点下一步即可! 3…

mongoDB聚合查询

管道 管道在Unix和Linux中一般用于将当前命令的输出结果作为下一个命令的参数。MongoDB的聚合管道将MongoDB文档在一个管道处理完毕后将结果传递给下一个管道处理。管道操作是可以重复的。 聚合管道操作 可参考菜鸟文档:菜鸟文档 命令 功能描述 $project指定输出…

shell第四天作业——流程控制之循环

题目 一、for创建20个用户,用户前缀由用户输入,用户初始密码由用户输入。 二、for循环ping测试指定网段的主机,网段由用户输入。 三、使用for/while实现批量主机root密码的修改 一、for创建20个用户,用户前缀由用户输入&#x…

2022年已然要结束了,一起来分享下你的故事吧!2023年的接力棒已经递到手里,千言万语不如一句Fighting!

【系列专栏】:博主结合工作实践输出的,解决实际问题的专栏,朋友们看过来! 《QT开发实战》 《嵌入式通用开发实战》 《从0到1学习嵌入式Linux开发》 《Android开发实战》 《实用硬件方案设计》 长期持续带来更多案例与技术文章分享…

c++语法欠缺地方

sizeof是用来计算变量占多大内存的,单位是字节(byte);sizeof 后面跟类型时,必须加上括号,例如sizeof(double);后面跟变量可以不用加括号,例如:sizeof d%d是以十进制形式输出有符号整…

CDP集群卸载过程

CDP集群卸载过程 1. 登录到Cloudera Manager,并停止整个集群服务。 2. 停用并移除所有Parcel 3. “停用”CDH7的Parcel。 4. 从主机删除”CDH6的Parcel 5. 删除集群 6. 登录server机器,停止CM Server服务 systemctl stop cloudera-scm-server 7. 移除…

如何实现高性能点赞(三)

数据库设计 数据库表中至少要包含三个字段:被点赞用户id,点赞用户id,点赞状态。再加上主键id,创建时间,修改时间就行了。 建表语句 对应的对象 UserLike 数据库操作 操作数据库同样封装在接口中 LikedService L…

【2.2】服务拆分--服务远程调用

服务拆分--服务远程调用1 案例--根据订单id查询订单功能2 远程调用方式分析2.1 注册RestTemplate2.2 发http请求3 总结1 案例–根据订单id查询订单功能 需求:根据订单id查询订单的同时,把订单所属的用户信息一起返回。 由上一节的测试结果可以看出&…

opencv-python常用函数解析及参数介绍(五)——腐蚀与膨胀

腐蚀与膨胀前言膨胀腐蚀开运算与闭运算礼帽与黑帽运用膨胀和腐蚀获得图像轮廓前言 有些时候图片上会有一些划痕或者污渍,会影响图片的质量,假设我有一张写有“艾醒”的图片,但是有花花绿绿的划痕和污渍,这时我们就可以运用腐蚀与…

五、Web自动化测试

Web自动化测试5.1 Selenium Web 自动化5.1.1 Selenium 和 Robot Framework SeleniumLibrary 库介绍安装 robotframework-seleniumlibrary导入 SeleniumLibrary5.1.2 Open Browser 和 Close Browser5.1.3 Input Text5.1.4 Click Button5.1.5 Click Element5.1.6 Click Link5.1.7…

2022CTF培训(十)IOT 相关 CVE 漏洞分析

附件下载链接 这里选择的设备是一款家用路由器,型号为 D-Link DIR-850L(EOL) 。由于该款路由器已停产,官网无法下载到固件,不过目前这个网站还能下载到相关的固件,当然附件中也会提供需要分析的固件。 固件解密 以 DIR850LB1_FW…