聊天系统客户端的设计与实现毕业设计.docx

上传人:b****6 文档编号:7565482 上传时间:2023-01-25 格式:DOCX 页数:76 大小:424.87KB
下载 相关 举报
聊天系统客户端的设计与实现毕业设计.docx_第1页
第1页 / 共76页
聊天系统客户端的设计与实现毕业设计.docx_第2页
第2页 / 共76页
聊天系统客户端的设计与实现毕业设计.docx_第3页
第3页 / 共76页
聊天系统客户端的设计与实现毕业设计.docx_第4页
第4页 / 共76页
聊天系统客户端的设计与实现毕业设计.docx_第5页
第5页 / 共76页
点击查看更多>>
下载资源
资源描述

聊天系统客户端的设计与实现毕业设计.docx

《聊天系统客户端的设计与实现毕业设计.docx》由会员分享,可在线阅读,更多相关《聊天系统客户端的设计与实现毕业设计.docx(76页珍藏版)》请在冰豆网上搜索。

聊天系统客户端的设计与实现毕业设计.docx

聊天系统客户端的设计与实现毕业设计

聊天系统客户端的设计与实现毕业设计

 

 

第一章概述

1.1选题来源及意义

1.1.1选题来源

在网络无所不在的今天,在Internet上,有icq,oicq,ticq等网络聊天软件,极大程度上方便了处于在世界各地的友人之间的相互联系,也使世界好象一下子缩小了,不管你在哪里,只要你上了网,打开这些软件,就可以给你的朋友发信息,不管对方是否也同时在线,只要知道他有。

本文讨论基于TCP/IP通信开发聊天程序的关键技术,重点讨论面向对象方法以及聊天程序的实现方法,并给出了相应的VC++代码.

网络聊天软件在国外的有icq等,在国的主要有腾讯的Oicq,还有Ticq,OmO和一些在网页上的即时通讯工具,像Chinaren上的WebMaster等等,都做得即美观,且功能强大,Oicq现在拥有非常大的用户群。

现在也有很多,在网络上不使用服务器的通讯软件,这种软件小巧且方便,也能解决一部分问题。

但是有服务器的通讯软件,有着不可比拟的优势:

可以发送离线消息,不管用户当时是否在线,下次上线时,就可以看到这条消息了。

可以保存用户的个人信息或介绍,供人查看。

而且,那种通讯软件,是以机器为通讯单元的,而这种聊天软件是以人为通讯单元。

总之,这种软件在网络上,还是有很大的用途的,为网络上通讯,带来极大的方便。

虽然说,现在这个软件已经有公司把它开发出来了,我再做也不一定有新意,也未必可以做得更好,但作为毕业设计,也算是对我能力的一个考验和这四年来我学习知识的一个检查。

如果这个软件做得比较成功的话,能为网络通讯带来一定的方便的话,我就很满足了。

1.1.2选题意义

以前聊天的方式早已离我们远去。

自从我们顺应现代工业的潮流,从平房搬入楼房之后,在享受自动的水、电、煤气之时,我们也失去了旧日街坊邻里聚在一起群聚而谈的热闹和温情。

甚至这种气氛也渗透到了家庭部,我们与家人一起聊天的时间也越来越少。

然而这并不是说人们不需要聊天提供的享受。

在人情淡薄怀旧气氛浓重的九十年代末期,网络聊天出现了。

那些寂寞无助的“亚细亚的孤儿”们忽然发现了这一巨大的狂欢场所,更有甚于电子游戏带给他们的新奇和喜悦。

“网聊”借助网络这种现代通讯手段在一定程度上恢复甚至拓展了传统聊天在人们生活中失去的地盘。

这些因素都决定了网络聊天势必成为一种青年人的流行事物。

1.2任务、要求及问题提出

1.2.1任务、要求

本设计基于TCP/IP通信开发聊天程序,综合利用VC++程序设计语言,以SQLServer2000数据库做后台开发出一高效实用的聊天系统客户端软件。

该系统要求实现:

1.实现各种信息的系统化、规化和自动化;

2.客户端应具有十分友好的主窗口界面,登陆界面和注册界面等;

3.客户端可以使用户方便地进行登录、下线、接收消息和发送消息等;

4.客户端能够使用TCP连接实现与服务器端进行良好的协作与通信;

5.客户端能够使用IP连接,与其他客户端进行信息的收发;

6.客户端各个界面的设计合理、实用。

1.2.2问题提出

随着计算机应用技术的日益普及,网络也遍及到我们生活的每个角落,很好的利用这人资源,将为我们的工作和学习,带来极大的方便和提高工作效率,所以,开发一个网络里的C/S通讯软件,是十分必要。

由于采用面向对象方法开发软件具有明显的优点,本系统将采用面向对象方法进行开发。

由于采用面向对象的系统模型可以使整个软件系统的结构变得更加灵活,本系统的结构模型将采用面向对象的系统模型,采用VC++6.0这个可视化开发工具进行编码。

传统的软件工程方法有生命周期方法和快速原型法。

面向对象方法学是一种全新的软件工程方法,其出发点和基本原则是尽可能模拟人类习惯的思维方式,把构成客观世界的实体抽象为对象。

概括地说,面向对象方法学有四个要点:

1.认为客观世界是由各种对象组成的,复杂的对象可以由比较简单的对象以某种方式组合而成;

2.把所有对象都划分成各种对象类,每个对象类可以定义一组数据和方法;

3.按照子类和父类的关系,把若干对象类组成一个层次结构的系统;

4.对象彼此之间仅能通过传递消息互相联系。

用面向对象方法学开发的软件有以下优点:

1.与人类习惯的思维方法一致;

2.稳定性好;

3.可重用性好;

4.可维护性好。

1.3国外发展概况

1.3.1国外发展概况

伴随着网络的发展,已经有大量的聊天类软件进入了实用阶段,例如现阶段大家经常使用的QQ,ICQ和MSN等,他们已经融入到大家的网络生活中,成为大家网络生活中必不可少的组成部分。

而且其程序的功能也伴随着网络技术的发展而不断的完善和发展,从最初的只支持文本式聊天一直到现在的图文聊天、语音聊天、视频对话等,技术越来越成熟可靠。

网络聊天软件在国外的有icq等,在国的主要有腾讯的Oicq,还有Ticq,OmO和一些在网页上的即时通讯工具,像Chinaren上的WebMaster等等,都做得即美观,且功能强大,Oicq现在拥有非常大的用户群。

现在也有很多,在网络上不使用服务器的通讯软件,这种软件小巧且方便,也能解决一部分问题。

但是有服务器的通讯软件,有着不可比拟的优势:

可以发送离线消息,不管用户当时是否在线,下次上线时,就可以看到这条消息了。

可以保存用户的个人信息或介绍,供人查看。

而且,那种通讯软件,是以机器为通讯单元的,而这种聊天软件是以人为通讯单元。

总之,这种软件在网络上,还是有很大的用途的,为网络上通讯,带来极大的方便。

传统聊天是指在任何现代通讯技术出现之前人类最寻常的交流方式,即面对面地对话。

它包括非正式的私人谈话,如家人团聚、邻居串门、朋友造访,也包括一些较为随意的多人集会如酒会、沙龙和座谈会。

聊天的特点在于它的无目的性,天南地北,海阔天空,都可以作为谈资助兴,所以正式的访谈和会议都不在聊天之列。

传统聊天具有多重社会功能,比如交流情感、促进友谊、扩散信息等等,但最主要的还是消闲,一种有效的排解无聊的手段——无聊这一词的字面意思就是指“不值一聊”。

聊天作为一种消闲手段廉价而富有人情味,很适合人类这种拥有语言能力的高等群居动物。

梁实秋的“雅舍小品”里有专文谈聊天的好处。

即使在现代通讯方式已经非常普及的今天,传统聊天方式依然不可能被取代,然而它占有人们的时间已经大为缩小。

虽然和网络提供了远程的即时交流手段,但是现代社会一方面加快了人们的生活和工作节奏,另一方面以商业化的手段向人们提供了更多消闲方式,其中电视就挤占了我们原先大量的聊天时间。

由于电视的诱惑,传统聊天被迫让出了它在人类生活中的地位。

茶余饭后不再是门前一板凳围在一起侃,而是每家每户坐在封闭的单元房面对一台电子显像管。

电视节目虽然表面上比聊天更为丰富多彩,但是看电视本身单向传递信息,没有反馈机制,观众只是被动地接受信息,只在极小的程度上参与节目。

电视并不促进观众思考,也不会根据观众收看时的反应做出调整。

更不要说电视的非人格化与聊天富有人情味的区别。

电视虽然对人类消闲时间的争夺战中胜出,但它却不可能满足人类所有的需要,尤其是传统聊天能够满足的那些需要。

这些需要也不是电子游戏、观看电影话剧表演甚至旅游所能替代的。

这时,一种新的聊天形式借助网络生长出来,填补了人们的精神空白。

网络聊天同样具有传统聊天的基本功能,即消闲的作用,它也同样可以交流情感、促进友谊、传递信息,满足表达欲望。

但它并非是传统聊天在网络上简单的呈现和复制,它具有并非本质但十分重要的特殊性质。

1.3.2发展趋势

最后试着讨论一下网络聊天的命运。

网络聊天的现实存在不可能因为老师和家长的反对而消除,也不会因为某某法规的出台而被管制。

淘汰它的只能是更发达的聊天技术,即语音聊天。

语音聊天更为经济快捷,单位时间传递的信息量也更大。

语音聊天的技术已经成熟,待它普及之后成熟之后,目前这种“打”的网络聊天方式将成为历史。

等有一天,我们都可以像打免费那样语音聊天时,我们还会怀念当年那段“此时无声胜有声”的网络聊天故事吗?

 

第二章设计原理和过程

2.1用户需求分析

提供基于TCP/IP网络的即时消息传送、大小图标方式、实时聊天、多人聊天等功能。

具体列举如下:

支持多账号。

可以同时发送同一个消息给多人,通过输入这些人的列表或列表。

可以同时发送一个消息给所有好友。

即使用户不在线,也能通过服务器发送离线消息。

提供消息、聊天的历史记录,方便对信息的查看和管理。

提供查看在线的人的功能。

提供按ID或查找用户的功能,添加用户方便。

小窗口显示,不占用屏幕很大的空间。

支持隐身登陆,可以看到在线的朋友,朋友却不知道你上线。

可以实时显示用户的状态和随时改变自己的状态。

提供了自动弹出消息。

好友上线通知。

好友下线更新。

查看好友信息。

按或查找某人。

在好友列表中删除某人。

更改个人信息。

系统设置。

主窗口总是浮在最上端。

速度快,占用资源少。

2.2设计原理概述

采用客户端——服务器模型,使用从MFC类中的CAsyncSocket类的派生类进行实现底层通讯,底层利用UDP数据报协议进行通讯,这样,便于客户端之间的直接通讯,也可以高效的传送消息。

因为使用UDP协议进行通讯,所以要自己控制其可靠性。

我每发送一个数据,接受方接受到数据后,会发回一个响应信息,发送方在一个超时时间,收到响应信息,就表示发送数据成功,若没有收到,就表示发送失败,会按用户指定的次数N,重试N次,如果N次都失败,就返回发送数据失败。

当然,发回来的确认信息也可能丢失,但确认信息很短,相对来说,丢失的机率会小一些,是一个折中的办法。

为了保存用户信息和好友信息及一些相关数据,服务器使用到数据库技术。

服务器的数据库采用的是ODBC的SQL2000数据源,服务器访问数据库,用的是MFC中的CDatabase和CRecordset,因为,对数据库的操作简单,服务器端,我只要功能,不需做界面,所以使用Sql语句直接访问数据库,已经足够满足要求了。

服务器运行的流程为:

服务器运行后,开启服务,则服务器开始侦听用户请求,如有信息发送过来,首先,发送回确认信息,然后,建立一个线程,处理接受到的数据。

在线程里,按照接受到数据的类别,进行相应的处理,如有需要,会向用户发送处理的结果,或成功或失败的消息,处理结束后,线程就结束了。

这样,可以实时接受每个用户的请求,不会因为处理一个用户的请求,而忽略了其它用户。

服务器端主要是为用户存储必要的信息,协调用户之间的通讯,服务器端的设计,主要在功能上面。

服务器端的设计和底层通讯的方法,将是我讲述的重点。

客户端的运行流程为:

若有本地用户信息,则取出本地用户信息,显示登陆窗口,若没有,则显示用户注册窗口(在登陆窗口里,也可以选择用户注册)。

登陆时,可选择是否隐身,进入系统后,好友列表中,在线的人,将以高亮度显示,并处在列表的上头。

不在线的人,将以灰色显示。

登陆后,如果有的话,服务器会发来好友给你发送的离线消息。

如果有好友上线了,就会通知你,好友下线了,你也可以在好友列表中看到,你可能接受到别人给你发送的消息。

根据用户的操作,可以向好友发送消息,查看好友信息,查看在线的人,查找用户等等功能。

客户端主要是提供给用户一个友好的用户界面,方便用户操作,客户端主要负责从服务器上得到数据后,显示给用户。

从服务器得到好友的IP和Port后,就可以直接与好友进行通讯,聊天等等。

客户端主要是界面的设计(除了底层通讯的以外),根据不同的要求,向服务器发送各种类型的请求。

然后等待服务器的响应。

客户端的界面的设计很繁琐,没有详细介绍的必要,所以,我的重点将放在服务器的设计上。

客户端只是简要的说明一下。

2.3系统模块设计

聊天系统将分为六大模块,包括用查找户模块,查找在线用户模块,发群体消息模块,系统参数模块,个人设定模块,关于模块。

各模块功能如下图2-1所示:

 

图2-1聊天系统模块

在信息世界中,信息从客观事物出发流经数据库,通过决策机构最后又回到客观世界,信息的这一循环经历了三个领域:

信息世界,数据世界,现实世界。

现实世界的事物反映到人的头脑中,人的大脑对它有个认识过程,经过分析(选择、命名、分类等)进入信息世界。

这些信息再进一步加工、编码,然后进入数据世界,而软件系统的开发工作需要考虑这两个方面的问题,也就是要考虑系统开发所需要的数据,以及如何对这些数据进行操作。

这两个问题贯穿了整个软件系统的开发过程,这也就是数据库的设计问题,也是软件设计的一个核心。

在系统设计的开始,我首先考虑的是如何用数据模型来数据库的结构与语义,以对现实世界进行抽象。

目前广泛使用的数据模型可分为两种类型,一种是独立于计算机系统的“概念数据模型”如“实体联系模型”,另一种是直接面向数据库逻辑结构的“结构数据模型”。

在本系统中我采用“实体联系模型”(ER模型)来描述数据库的结构与语义,以对现实世界进行第一次抽象。

ER模型直接从现实世界抽象出实体类型及实体间联系,然后用ER图来表示数据模型。

它有两个明显的优点:

接近于人的思维,容易理解;与计算机无关,用户容易接受。

但ER模型只能说明实体间语义的联系,不能进一步说明详细的数据结构,它只是数据库设计的第一步。

ER图是直观表示概念模型的工具,它有四个基本成分:

1.矩形框,表示实体类型(考虑问题的对象)。

2.菱形框,表示联系类型(实体间的联系)。

3.椭圆形框,表示实体类型和联系类型的属性。

对于主键码的属性,如下表示:

属性名(*)。

4.直线,联系类型与其涉及的实体类型之间以直线连接。

本系统为聊天系统客户端的实现,主要是聊天为主,考虑了多方面的因素以后,确定系统图如下:

下面就是各实体及联系类型的属性图:

(为了表达的方便,在这里我没有在一图上表达出所有的关系,而是分别采用实体属性关系图(即E-R图)来表达数据库的结构。

)本系统的实体图如下图所示:

 

图2-2用户信息

 

图2-3好友信息

 

 

图2-4离线消息

2.4服务器数据库设计

服务器数据库设计的要求是要能够满足客户端的需求,保存用户信息和用户好友信息,提供离线消息的服务,和发广播消息的服务等。

总共有三个表:

用户信息表(Users)好友信息表(Friends)离线消息表(OffMsg)

表2-1用户信息表(Users)

字段名称

说明

长度

UserId(主键)

自动编号

4字节长整形

Id

用户

4字节长整形

Photoid

用户的图象编号

4字节长整形

password

用户登陆的密码

字符串

name

用户的

字符串

sex

用户的性别

单字节整形0男1女2未知

age

用户的年龄

字符串(为了适应不愿填写此项的人)

canbeadd

能否被人加为好友

单字节整形(0,1,2不能被加入,允许被任何人加入,需要身份验证)

email

电子信箱

字符串

homepage

个人主页

字符串

address

地址

字符串

phone

字符串

fax

传真

字符串

department

部门

字符串

description

个人简介

字符串

表2-2好友信息表(Friends)

字段名称

说明

长度

Num(主键)

自动编号

4字节长整形

MyId

自己

4字节长整形

FriendId

朋友

4字节长整形

表2-3离线消息表(OffMsg)

字段名称

说明

长度

MsgId(主键)

自动编号

4字节长整形

RecvId

接受者

4字节长整形

SenderId

发送者

4字节长整形

RecvTime

接受时间

4字节长整形

nIndex

发送消息类型

4字节长整形

Msg

发送消息

备注类型

2.5客户/服务器程序设计

C/S模型也是一种网络模型,但与前述的模型不同,它并不是定义了网络的层次结构,而是描述了一种网络程序运行的方式。

C/S模型将网络应用程序分为客户和服务器两部分。

客户方对服务器方发送信息请求,服务器方对其做出相应回答,提供服务。

在TCP/IP网络应用中,多数网络应用程序是使用C/S模型设计的。

服务程序通常在一个众所周知的地址监听对服务的请求,也就是说,服务进程一直处于休眠状态,直到一个客户程序提出了请求信息。

此时,服务程序被"惊醒"并且为客户提供服务,对客户的请求作出适当的反应。

虽然基于连接的服务是设计C/S应用程序的标准,但有些服务也是可以通过数据报Socket提供的。

通常,网络应用程序包含两个独立的应用程序:

客户程序和服务器程序。

但是,也可以设计同时完成这两种功能的程序,例如,一些服务器程序如果不能完成一个服务请求时,它将转而充当客户程序,向其它服务器程序请求信息。

这方面的一个典型例子就是提供Internet从域名到IP地址映射服务的DNS服务器。

为了充分理解TCP/IP协议族,必须理解几个重要术语。

这些术语指出了两个TCP/IP传输协议:

用户数据包协议(UDP)和传榆控制协议(TCP)之间的区别。

这些术语进一步描述了与网络连接、协议可靠性以及数据服务有关的协议特性。

当建立服务器程序时,应该将服务器程序设计成等候客户的请求。

你知道,TCP传输层通过协议端口和应用程序(像服务器和客户)通信,也就是说,为了按收客户请求,服务器程序必须对传输层的一个特定协议端口进行侦听。

当服务器配置socket接口时,它使用bind()函数让socket执行体登记一个协议端口。

也就是说,程序告诉socket执行体使用哪-个协议端口进行数据传送。

Socket执行体接着告诉传输层某个特定协议端口已被使用,并将其收到的所有数据传送给SocketAPI。

使用无连接协议的程序和使用面向连接协议的服务器程序之间的主要相似之处是它们都必须对一个协议端口进行侦听。

例如,无连接和连接服务器程序必须在协议端口侦听客户请求。

同样,由于无连接客户程序没有和远地主机建立直接连接,所以它也必须对协议端口进行侦听,以便接收以对它服务请求产生的数据报应答。

SocketAPI中的bind()函数让程序将一个本地地址(包括主机地址和协议端口)和一个Socket联系起来。

下面程序行显示了一个典型的函数调用:

result=bind(socket_handle,local_structure,socket_address,address_length)

无连接客户程序也对一个协议端口进行侦听。

使用无连接协议的程序不和远地主机建立直接连接。

无连接客户程序使用数据报发送网络服务请求,它不建立点到点连接。

因此无连接客户程序必须在一个协议端口,对应答数据报进行侦听。

与服务器程序一样,无连接客户程序也使用bind函数让Socket执行体登记协议端口。

也就是说,类似服务器程序,无连接客户程序告诉Socket执行体使用哪个协议端口进行数据传输。

Socket执行体处理传输层UDP软件模块和客户程序之间的接口。

 

图2-5无连接协议的套接字调用时序图

 

图2:

面向连接的套接字系统调用时序图

 

图2-6面向连接的套接字系统调用时序图

2.6TCP/IP协议

TCP/IP是国际互联网所采用进行网际互连的通信协议。

实际所称的TCP/IP协议包括了在国际互联网络应用的一组协议,互联网协议族是此协议族的另一个名字。

这个协议族包括几种工作在不同层次上的网络协议,IP互连协议(InternetProtocol),负责主机之间的传输数据。

TCP传输控制协议(TransmissionControlProtocol),负责在应用程序之间传递数据。

UDP用户数据报协议(UserDatagramProtocol),提供给用户进程的无连接协议,也负责在应用程序之间无连接传递数据,但不执行正确性检查。

ICMP互连网控制报文协议(InternetControlMessageProtocol),处理主机间的差错和传送控制。

ARP地址解析协议(AddressResolutionProtocol),负责将网络层地址转换成链路层地址。

RARP反向地址解析协(ReverseAddressResolutionProtocol),负责将链路层地址转换成网络层地址。

TCP/IP协议的核心是传输层协议(TCP、UDP)、网络层协议(IP)和物理接口层,这三层通常在操作系统的核中实现。

TCP/IP网络环境下的应用程序设计是通过网络系统编程界面Socket实现的,Socket提供应用程序与系统核之间的网络编程接口。

协议可以是可靠的可以是不可靠的。

可靠的协议意味着当数据通过协议传递时,协议保证数据正确传输。

可靠传输包括几个特征。

首先,为了确保数据正确传送,协议在通信应用程序之间互相交换确认信息。

也就是说,程序每次发送-个报文时,都期望对方发送一个相当于说:

“我得到这个报文”的确认信息。

如果发送程序没有收到这样一个确认信息,程序将自动重新发送此报文,直到得到应答信息为止。

其次,为了确保传输的数据有效,可靠协议在每次传输时,都包含一个或更多的校验和(CRC)。

接收计算机重新计算校验和,与收到的校验和进行比较。

如果不匹配,就表明在传输过程中发生了错误。

传输控制协议TCP是一个使用校验和确认信息以及其它可靠数据传输技术的可靠协议。

相比之下,不可靠协议不能确保数据正确传输。

协议试图传输数据,但不保证成功。

而且,不可靠协议在传输失败后,并不通知发送方应用程序。

可将不可靠数据传输比作没有返回地址的信件。

如果发送地址是锗误的,由于邮递系统不能将信退回给你,所以你就不知道信件有没有送到。

即使发送地址是正确的,也不能保证邮递系统不丢失你的信件。

TCP/IP协议组中存在的两个基本数据服务是:

字节流服务和数据报服务,使用字节流的协议将信息看作一串字节流进行传输。

协议不管要求发送或接收数据的长度和传送数目,只是将数据看作一个简单的字节串流。

使用数据报的协议将信息视作一个独立单元进行传输。

协议单独发送每个数据报——数据报之间不相互依赖。

例如,假设你使用字节流协议发送5个数据段(每个有10字节)和一个包含50字节的数据段(总共100字节)。

连接的接收方可以按每次20字节读数据(要读5次)。

传输控制协议是字节流协议。

字节流协议不关心每个数据段的长度。

如果应用程序使用字节流协议发送数据,则协议能够保证连接的另一端按照发送的顺序接收数据。

相比之下,传输到同一目的地的多个数据报可能不会按发送顺序到达。

如果接收方应用程序要求数据顺序一致,应用程序必须在数据到达后,校对这些数据。

用户数据报协议和互连网协议使用数据报传输数据。

数据报类似于信件。

如果你在同一天给同一个人邮寄两封信,你无法知道那个人先收到那封信。

同样,如果连续两天给两个人邮信,你也不能知道哪封信先收到。

收到信的顺序和发送顺序可能相反。

在TCP/IP术语中,端口类(Port)似于IP地址,IP地址与主机地址是相联系的,端口和协议相联系。

IP数据报保存目的和源IP地址,同样传输协议也保存源和目的端口号。

如果端口这个概念对你来说很陌生,请考虑计算机上的硬件端口。

你可能编写过往硬件端口送数据的程序。

例如为了打印,如果没有其它程序的话,必须向串或并端口发送数据。

PC机给它的端口命名和编号。

例如,PC机的并行打印端口称为LPTl和LPT2,串行端口称为COM1和COM2。

在Internet上,网络只是简单地对协议端口编号。

在PC机,LPT1表示并行端口1。

成千个PC机应用程序使用此方案。

多年来,程序员编写PC程序时都假定LPT1表示并行打印端口1。

同样,程序员将每个Internet协议端口与一个特定的应用程序和功能联系在一起。

Internet包括像FTP、Telnet和Mail这样广泛使用的应用程序采用的应用协议,在Internet上,这些应用程序使用一

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 高等教育 > 医学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1