




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、目 录摘 要1关键词1abstract1key words1第一章 软件功能需求分析21.1 软件功能需求21.2 总体性能需求21.3 测试环境需求31.4 其他需求31.5 本章小结3第二章软件开发所使用的技术42.1 c语言42.2 tcp/ip协议52.3 socket72.4 gtk+92.5 本章总结9第三章软件详细设计及代码实现103.1 软件界面设计103.2 软件主要代码实现133.3 数据库的设计223.4 本章小结:22第四章软件的测试234.1 测试步骤234.2 本章小结23参考文献24致谢25基于linux环境下的聊天程序的设计与开发摘 要:网络,对于现在社会上的人
2、已经不在陌生。伴随着计算机以及的普及,计算机网络也渐渐被人们所熟悉。随之而来的问题也就出现网络交流工具。当然,大家所熟悉的windows操作系统下的网络交流工具很多,例如,腾讯qq,微软msn,新浪uc,网易popo,oicq,飞信,甚至是yy语音等等。但是随着linux操作系统的逐渐流行。基于linux操作系统的网络交流软件还是很少。本文就是对于一个基于linux下的聊天程序的设计与开发的阐述。关键词:linux c语言 tcp/ip协议 聊天程序abstract:network, for now, people in society have not unfamiliar. with th
3、e popularity of computers and computer network has gradually been familiar. attendant problems will arise - the network communication tools. of course, everyone is familiar with windows operating system a lot of network communication tools, for example, tencent qq, microsofts msn, sina uc, netease p
4、opo, oicq, flying letters, or even yy voice and so on. but with the increasingly popular linux operating system. linux-based operating system, network communication software, or very little. this article is for a linux-based chat program under design and development of elaboration.key words:linux c
5、tcp/ip chat program第一章 软件功能需求分析想要做出一个令人满意的聊天工具,就必须先得了解使用者对它的要求。只有深入了解了使用者的要求,才能开发出一个令使用者满意的聊天工具。1.1 软件功能需求:(1)登录功能。(2)注册新用户的功能。(3)客户可以通过服务器转发,实现一对一,一对多,多对一,多对多的聊天功能。(4)服务器端可以保存用户信息的功能。(5)客户端程序可以显示在线好友的功能。(6)应该具有简单、容易操作、美观的图形界面。1.2 总体性能需求:(1)服务器端性能需求服务器需要同时连接很多个用户,并能提供给这些连接用户所需要的任务处理请求,这就要求服务器能同时处理多个
6、socket连接。服务器模型一般分为循环服务器和并发服务器,循环服务器一次只能处理一个连接,也就是说同一时间只能由一个用户连接到服务器进行消息处理,这种情况是不被允许的。因此我们将采用多线程方式的并发服务器来设计服务器端,这样将能从很大程度上提高服务器的运行效率。(2)客户端性能需求客户端只需要连接到服务器便可以进行任务的处理工作,因此客户端的主要性能要求为图形界面运行的稳定性和对出错信息的及时反映。当一个窗体出现问题时能够及时的处理,让主程序不受影响。(3)错误处理需求所有的应用程序在运行过程中都会出现出错的情况,这种错误可能来自于程序本身的bug也可能是用户操作的失误所造成的。当有错误发生
7、时,我们应该有一个很好的机制来保障错误能够及时地被排除。因此,当应用程序出现了错误的时候我们就需要程序能提供给我们出错的信息,这样用户就能够很快的找出具体的出错原因,以便寻找合理的途径去解决它。1.3 测试环境需求:因为这是一个基于linux的聊天程序的开发,所以测试环境必须在linux c环境下测试。1.4 其他需求:(1)体系结构模型需求这个是基于tcp/ip协议的osi的体系结构。(2)功能模块设计需求这个软件包含客户端和服务器端。1.5 本章小结:需求是开发的前提,只有明确了需求才能开发出一个符合用户期望的优质软件。上面已经总体上列出该聊天程序的基本功能需求,接下来的工作就是如何将这些
8、功能开发的尽量完善,使得界面清晰简单,方便易用。第二章 软件开发所使用的技术开发一个软件是需要一些基本的技术,只有熟悉这些技术,才能更有效的开发出自己所想要的软件。2.1 c语言:c语言是一种成功的系统描述语言,用c语言开发的unix操作系统就是一个成功的范例;同时c语言又是一种通用的程序设计语言,在国际上广泛流行。世界上很多著名的计算公司都成功的开发了不同版本的c语言,很多优秀的应用程序也都使用c语言开发的,它是一种很有发展前途的高级程序设计语言。(1)c是中级语言。它把高级语言的基本结构和语句与低级语言的实用性结合起来。c语言可以像汇编语言一样对位、字节和地址进行操作,而这三者是计算机最基
9、本的工作单元。(2)c是结构式语言。结构式语言的显著特点是代码及数据的分隔化,即程序的各个部分除了必要的信息交流外彼此独立。这种结构化方式可使程序层次清晰,便于使用、维护以及调试。c语言是以函数形式提供给用户的,这些函数可方便的调用,并具有多种循环、条件语句控制程序流向,从而使程序完全结构化。(3)c语言功能齐全。具有各种各样的数据类型,并引入了指针概念,可使程序效率更高。另外c语言也具有强大的图形功能,支持多种显示器和驱动器。而且计算功能、逻辑判断功能也比较强大,可以实现决策目的的游戏。(4)c语言适用范围大。适合于多种操作系统,如windows、dos、unix等等;也适用于多种机型。c语
10、言对编写需要硬件进行操作的场合,明显优于其它解释型高级语言,有一些大型应用软件也是用c语言编写的。c语言具有绘图能力强,可移植性,并具备很强的数据处理能力,因此适于编写系统软件,三维,二维图形和动画。它是数值计算的高级语言。(5)c语言文件由数据序列组成,可以构成二进制文件或文本文件。常用的c语言ide(集成开发环境)有microsoft visual c+,dev-c+,code:blocks,borland c+,watcom c+ ,borland c+ builder,gnu djgpp c+ ,lccwin32 c compiler 3.1,high c,turbo c,c-free
11、,win-tc 等等2.2 tcp/ip协议:tcp/ip(传输控制协议/网际协议)是互联网中的基本通信语言或协议。在私网中,它也被用作通信协议。当你直接网络连接时,你的计算机应提供一个tcp/ip程序的副本,此时接收你所发送的信息的计算机也应有一个tcp/ip程序的副本。 tcp/ip是一个四层的分层体系结构。高层为传输控制协议(tcp,transmission control protocol),它负责聚集信息或把文件拆分成更小的包。这些包通过网络传送到接收端的tcp层,接收端的tcp层把包还原为原始文件。低层是网际协议(ip,internet protocol),它处理每个包的地址部分,
12、使这些包正确的到达目的地。网络上的网关计算机根据信息的地址来进行路由选择。即使来自同一文件的分包路由也有可能不同,但最后会在目的地汇合。tcp/ip使用客户端/服务器模式进行通信。tcp/ip通信是点对点的,意思是通信是网络中的一台主机与另一台主机之间的。tcp/ip与上层应用程序之间可以说是“没有国籍的”,因为每个客户请求都被看做是与上一个请求无关的。正是它们之间的“无国籍的”释放了网络路径,才是每个人都可以连续不断的使用网络。许多用户熟悉使用tcp/ip协议的高层应用协议。包括万维网(www,world wide web)的超文本传输协议(http),文件传输协议(ftp),远程网络访问协
13、议(telnet)和简单邮件传输协议(smtp)。这些协议通常和tcp/ip协议打包在一起。 使用模拟电话调制解调器连接网络的个人电脑通常是使用串行线路接口协议(slip)和点对点协议(p2p)。这些协议压缩ip包后通过拨号电话线发送到对方的调制解调器中。与tcp/ip协议相关的协议还包括用户数据包协议(udp),它代替tcp/ip协议来达到特殊的目的。其他协议是网络主机用来交换路由信息的,包括internet控制信息协议(icmp),内部网关协议(igp),外部网关协议(egp),边界网关协议(bgp)。(1)tcp如果ip数据包中有已经封好的tcp数据包,那么ip将把它们向上传送到tcp层
14、。tcp将包排序并进行错误检查,同时实现虚电路间的连接。tcp数据包中包括序号和确认,所以未按照顺序收到的包可以被排序,而损坏的包可以被重传。tcp将它的信息送到更高层的应用程序,例如telnet的服务程序和客户程序。应用程序轮流将信息送回tcp层,tcp层便将它们向下传送到ip层,设备驱动程序和物理介质,最后到接收方。面向连接的服务(例如telnet、ftp、rlogin、x windows和smtp)需要高度的可靠性,所以它们使用了tcp。dns在某些情况下使用tcp(发送和接收域名数据库),但使用udp传送有关单个主机的信息。(2)udpudp与tcp位于同一层,但它不管数据包的顺序、错
15、误或重发。因此,udp不被应用于那些使用虚电路的面向连接的服务,udp主要用于那些面向查询-应答的服务,例如nfs。相对于ftp或telnet,这些服务需要交换的信息量较小。使用udp的服务包括ntp(网络时间协议)和dns(dns也使用tcp)。 欺骗udp包比欺骗tcp包更容易,因为udp没有建立初始化连接(也可以称为握手)(因为在两个系统间没有虚电路),也就是说,与udp相关的服务面临着更大的危险。(3)tcp连接的建立tcp协议通过三个报文段完成连接的建立,这个过程称为三次握手(three-way handshake),过程如图1-1所示。图1-1tcp连接的建立(4)tcp连接的终止
16、建立一个连接需要三次握手,而终止一个连接要经过四次握手,这是由tcp的半关闭(half-close)造成的。具体过程如图1-2所示。图1-2tcp连接的终止2.3 socket:通常也称作套接字,用于描述ip地址和端口,是一个通信链的句柄。应用程序通常通过套接字向网络发出请求或者应答网络请求。以j2sdk-1.3为例,socket和serversocket类库位于java .net包中。serversocket用于服务器端,socket是建立网络连接时使用的。在连接成功时,应用程序两端都会产生一个socket实例,操作这个实例,完成所需的会话。对于一个网络连接来说,套接字是平等的,并没有差别,
17、不因为在服务器端或在客户端而产生不同级别。不管是socket还是serversocket它们的工作都是通过socketimpl类及其子类完成的。(1)socket通信模式面向cs方式的socket通信原理要建立一个套接字socket连接必须具有四个基本信息:本地系统的地址、本地应用程序使用的端口号;远程系统的ip地址;远程系统中应用程序使用的端口号而在tcpip协议的规定中,端口号的分配采用两种方式,将端口号分为两部分少量的作为保留端口,这些端口以全局方式分配给服务进程,一个标准的服务器都拥有一个全局公认的端口,即使在不同的系统上其端口号也相同,剩余的为自由端口,以本地方式进行分配。作为唯一标
18、识通信连接的套接字之问是不能重复的,作为服务器的应用程序只能同时绑定一个端口号,但是,服务器程序在同一个端口上可以响应若干个客户端请求,因为客户端对应于不同的主机地址和端口号,所以这仍有套接字的唯一性。socket是面向cs模型来设计的,网络上的两个程序通过一个双向的通讯连接实现数据的交换,这个双向链路的一端称为一个socket。socket通常用来实现客户端和服务器端的连接。客户端程序可以向socket写请求,服务器端将处理此请求,然后通过socket将结果返回给用户。(2)socket函数应用程序调用socket函数来创建一个能够进行网络通信的套接字。第一个参数指定应用程序使用的通信协议的
19、协议族,对于tcp/ip协议族,该参数置af_inet;第二个参数指定要创建的套接字类型,流套接字类型为sock_stream、数据报套接字类型为sock_dgram;第三个参数指定应用程序所使用的通信协议。该函数如果调用成功就返回新创建的套接字的描述符,如果失败就返回invalid_socket。套接字描述符是一个整数类型的值。每个进程的进程空间里都有一个套接字描述符表,该表中存放着套接字描述符和套接字数据结构的对应关系。该表中有一个字段存放新创建的套接字的描述符,另一个字段存放套接字数据结构的地址,因此根据套接字描述符就可以找到其对应的套接字数据结构。每个进程在自己的进程空间里都有一个套接
20、字描述符表但是套接字数据结构都是在操作系统的内核缓冲里。下面是一个创建流套接字的例子:struct protoent *ppe; ppe=getprotobyname(tcp);socket listensocket=socket(pf_inet,sock_stream,ppe-p_proto);2.4 gtk+:gtk+ 是一种图形用户界面(gui)工具包。也就是说,它是一个库(或者,实际上是若干个密切相关的库的集合),它支持创建基于 gui 的应用程序。可以把 gtk+ 想像成一个工具包,从这个工具包中可以找到用来创建 gui 的许多已经准备好的构造块。最初,gtk+ 是作为另一个著名的开
21、放源码项目gnu image manipulation program (gimp)的副产品而创建的。在开发早期的gimp版本时,peter mattis和spencer kimball创建了gtk(它代表gimp toolkit),作为motif工具包的替代,后者在那个时候不是免费的。(当这个工具包获得了面向对象特性和可扩展性之后,才在名称后面加上了一个加号。)这差不多已经10年过去了。今天,在gtk+的最新稳定版本2.8版上(3.0测试中),仍然在进行许多活动,同时,gimp无疑仍然是使用gtk+的最著名的程序之一,不过现在它已经不是惟一的使用gtk+的程序了。已经为gtk+编写了成百上千
22、的应用程序,而且至少有两个主要的桌面环境(xfce和gnome)用gtk+为用户提供完整的工作环境。gtk+虽然是用c语言写的,但是您可以使用你熟悉的语言来使用gtk+,因为gtk+已经被绑定到几乎所有流行的语言上,如:c+,php, guile,perl, python, tom, ada95, objective c, free pascal, and eiffel。2.5 本章总结:技术是开发的基础,只有熟练掌握了这些技术,才能高效、快速的完成所设计的软件。上面已经总体上列出聊天程序的基本技术,接下来的工作就是利用这些技术实现所需要的功能。第三章 软件详细设计及代码实现我们所看到的软件是
23、这个软件的图形界面,这些界面要容易被大众所接受,而实现软件的功能就是代码了。3.1 软件界面设计:(1)服务器端如图3-1图3-1服务器端(2)登录界面如图3-2图3-2登录界面(3)注册界面如图3-3图3-3注册界面(4)注册成功如图3-4图3-4注册成功(5)客户端窗口如图3-5图3-5客户端(6)用户2对用户3聊天如图3-6图3-6聊天示意图(7)系统发布消息如图3-7图3-7系统发布消息3.2 软件主要代码实现:int initial_server (char *ip, int server_listen_port)int sockfd;if (sockfd=socket(af_ine
24、t, sock_stream,0)0) printf(服务器不能创建套接字!n);fflush(stdout);return(0);printf(sockfd is %dn,sockfd);bzero(char*)&server_address, sizeof(server_address);server_address.sin_family=af_inet;server_address.sin_addr.s_addr=inet_addr(ip);server_address.sin_port=htons(server_listen_port);setsockopt(sockfd, sol_s
25、ocket, so_reuseaddr, &flag, len);if(bind(sockfd,(structsockaddr*)&server_address,sizeof(server_address)0)printf(服务器不能绑定本地ip地址!n);fflush(stdout);return(0);printf(服务器端口号为:%dn,server_listen_port);return(sockfd);void set_address(fd_set *sockset, int sockfd)int i;fd_zero(sockset);fd_set(sockfd, sockset);
26、for(i=0;i b ? a : b;int user_free()int i=0;while (user_clienti.state!=0)&(imax_client) i+;if (i=max_client) return(-1);return(i);void init_user_client (void)int i;for(i=0;imax_client;i+)bzero(user_clienti.id,max_name);bzero(user_,max_name);user_clienti.socketfd=0;user_clienti.state=0;voi
27、d textviewclear (gtkwidget * text_view)/清空textview gtktextbuffer *buffer; gtktextiter start, end; buffer = gtk_text_view_get_buffer (gtk_text_view (text_view); gtk_text_buffer_get_bounds (buffer, &start, &end); gtk_text_buffer_delete (buffer, &start, &end);(1)treeiew信号处理函数gboolean selection_changed(
28、gtkwidget * widget, gpointer data)gtktreeiter iter;gtktreemodel *model;char *value,*token;if (gtk_tree_selection_get_selected(gtk_tree_selection(widget), &model, &iter) gtk_tree_model_get(model, &iter, 0, &value, -1);show_foot(label1_to,value);strcpy(to_man,value);if(strcmp(value,飞鸽传书)=0)sprintf(to_
29、id,all);/点击飞鸽elsetoken = strtok(value, ( );token = strtok(null, );/bzero(del_comm,max_row);sprintf(to_id,%s,token);printf(value=%s,to_id%sn, value,to_id);/*if (strcmp(value, 在线好友) != 0 & strcmp(value, 离线好友) != 0) strtok(value, -);strcpy(sid, value + (strlen(value) + 2);printf(%sn, sid);/gtkwidget *t
30、o_to;/to_to=create_toto(1);/gtk_widget_show_all(to_to); int i;for (i = 0; i max_client; i+) if (strcmp(listi.id, sid) = 0) printf(i=%dn, i);printf(id=%sn, listi.id);if (listi.state = 0) /g_thread_create(g_thread_func(dialog),null,false, null) ;break; else printf(id=%sn, listi.id);if (listi.p = 0) g_
31、thread_create(g_thread_func(func_action), (void*)i, false, null);break;*/(2)显示好友列表gtktreemodel *createmodel()int unline;int online;const gchar *files = , , ;gtkwidget *cellview;gdkpixbuf *pixbuf;gtktreeiter iter1, iter2;gint i, j, s, k = 0;char to_treemax_clientmax_name,flymax_name;store = gtk_tree_
32、store_new(2, gdk_type_pixbuf, g_type_string);cellview = gtk_cell_view_new();sprintf(fly,飞鸽传书0);pixbuf = gdk_pixbuf_new_from_file(files1, null);gtk_tree_store_append(store, &iter1, null);gtk_tree_store_set(store, &iter1, pixbuf_col, pixbuf, text_col, fly, -1);printf(tree_cont=%sn,fly);gdk_pixbuf_unre
33、f(pixbuf);for (i = 0; i max_client; i+) if(strlen(user_clienti.id)!=0)/my_friendi.f_name/my_friendi.f_idsprintf(to_treei,%s( %s ),user_,user_clienti.id);pixbuf = gdk_pixbuf_new_from_file(files1, null);gtk_tree_store_append(store, &iter1, null);gtk_tree_store_set(store, &iter1, pixbuf_col
34、, pixbuf, text_col, to_treei, -1);printf(tree_cont=%sn,to_treei);gdk_pixbuf_unref(pixbuf);/*listmesscountif (i = 0) for (j = 0; j max_client; j+) if (listj.state = 1) bzero(tables, max_name);sprintf(tables, %s-%s, , listj.id);printf(%sn, );s = rand() % 5;pixbuf = gdk_pixbuf_new_f
35、rom_file(filei, null);/pixbuf=gtk_widget_render_icon(cellview,stockss,gtk_icon_size_button, null);gtk_tree_store_append(store, &iter2, &iter1);gtk_tree_store_set(store, &iter2, pixbuf_col, pixbuf, text_col, tables, -1);printf(%sn, );/online=unline;gdk_pixbuf_unref(pixbuf); else for (j = 0;
36、 j max_client; j+) if (listj.state = 0) bzero(tables, max_name);sprintf(tables, %s-%s, , listj.id);printf(%sn, );s = rand() % 5;pixbuf = gdk_pixbuf_new_from_file(files, null);/pixbuf = gtk_widget_render_icon(cellview,filess,gtk_icon_size_button, null);gtk_tree_store_append(store,
37、 &iter2, &iter1);gtk_tree_store_set(store, &iter2, pixbuf_col, pixbuf, text_col, tables, -1);gdk_pixbuf_unref(pixbuf);printf(%sn, );*/return gtk_tree_model(store);*/(3)遍历treeview并对比,查找下线用户在treeview的位置并删除void treeview_contrast(char *str)int i;gtktreeiter iter;/定义一个迭代器gtktreemodel *pmodel; g
38、tkliststore *store;char *control; char *pitem; printf(str=%sn,str); store = gtk_list_store(gtk_tree_view_get_model( gtk_tree_view (treeview);pmodel=gtk_tree_view_get_model(gtk_tree_view(treeview);/得到treeview的modelgtk_tree_model_get_iter_first(pmodel,&iter);/迭代器定位到第一行int columns=gtk_tree_model_get_n_
39、columns(pmodel);/获取行数printf(行数columns=%dn,columns); for(i=0;icolumns;i+) gtktreeviewcolumn*column=gtk_tree_view_get_column(gtk_tree_view(treeview),i);/遍历header control=(char *)gtk_tree_view_column_get_title(column); printf(列名control=%sn,control);/输出列名 do/开始遍历内容for(i=0;i0) return atoi(row0);/返回qq号 el
40、se return -1; (5)生成在线用户列表,登录成功后调用char *on_line (int j)int i;char bufmax_size,write_msgmax_size,*s;strcpy(buf,-);for(i=0;imax_client;i+)if(user_clienti.state&i!=j)sprintf(write_msg,up-%s-%s-over,user_clientj.id,user_);write(user_clienti.socketfd,write_msg, strlen(write_msg);/strcat(buf,-%
41、s-%s,user_clienti.id,user_);strcat(buf,user_clienti.id);strcat(buf,-);strcat(buf,user_);strcat(buf,-);printf(buf=%sn,buf);printf(buf=%sn,buf);s=buf;return s;(6)服务器线程,监听客户端的一切请求,并分析处理void listen_client (void)int length,j=0,i;char read_msgmax_size,write_msgmax_size,to_textviewm
42、ax_size;char *token;char *buf;for(;)printf(开始监听!n);bzero(read_msg,max_size);select(maxfd, &sockset, null, null, null);if (fd_isset(sockfd, &sockset)new_sockfd = accept(sockfd, (struct sockaddr *)&client_address, &cli_len);printf(new_sockfd=%dn,new_sockfd);if (new_sockfd 0) printf(无新的连接!n); else bzer
43、o(read_msg, max_size);length=read(new_sockfd, read_msg, max_size);token=strtok(read_msg,-);if(strcmp(token,login)=0)j=login(token+(strlen(token)+1);printf(j=%dn,j);if(j0)write(new_sockfd,loginfail, 10);elseprintf(guodn);buf=on_line(j);printf(guodn);printf(buf=%sn,buf);sprintf(write_msg,loginok-%s%so
44、ver,user_,buf);write(new_sockfd,write_msg, strlen(write_msg);printf(write_msg=%sn,write_msg);/fd_set(new_sockfd, &sockset);user_clientj.socketfd=new_sockfd;maxfd=max(maxfd, new_sockfd+1);elseif(strcmp(token,reg)=0)int reg_id=reg(token+(strlen(token)+1);if(reg_id!=-1)sprintf(write_msg,reg
45、ok-%d,reg_id);write(new_sockfd,write_msg,strlen(write_msg);elsewrite(new_sockfd,regfail, 10);set_address(&sockset,sockfd);printf(完成!n);elsefor(i=0;imax_client;i+)bzero(read_msg, max_size);if(fd_isset(user_clienti.socketfd, &sockset)length=read(user_clienti.socketfd, read_msg, max_size);if(length=0)c
46、har deletmax_size;sprintf(delet,%s( %s ),user_,user_clienti.id);treeview_contrast(delet);sprintf(write_msg,down-%s-over,user_clienti.id);fd_clr(user_clienti.socketfd, &sockset);user_clienti.socketfd = 0;user_clienti.state = 0;printf(1n);for (j = 0; j max_client; j+) if (user_clientj.stat
47、e != 0) write(user_clientj.socketfd,write_msg,strlen(write_msg);elseprintf(read_msg=%sn,read_msg);token=strtok(read_msg,-);if(strcmp(token,all)=0)sprintf(to_textview,%s(%s)对大家说:nt%s,user_,user_clienti.id,token+(strlen(token)+1);sprintf(write_msg,all-%s-%s,user_clienti.id,token+(strlen(token)+1);for (j = 0; j max_client; j+) if (user_clientj.state != 0&j!=i) write(user_clientj.socketfd,write_msg,strlen(write_msg);combochange_log(%s,to_text
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 【正版授权】 ISO/IEC 30129:2015/AMD2:2025 EN Amendment 2 - Information technology - Telecommunications bonding networks for buildings and other structures
- 【正版授权】 ISO 18193:2021/Amd 1:2025 EN Cardiovascular implants and artificial organs - Cannulae for extracorporeal circulation - Amendment 1
- 【正版授权】 ISO 18374:2025 EN Dentistry - Artificial intelligence (AI) and augmented intelligence (AuI) based 2D radiograph analysis - Data generation,data annotation and data processi
- 【正版授权】 ISO 10934:2025 EN Microscopes - Vocabulary for light microscopy
- 糖尿病足考试试题及答案
- 官方兽医试题及答案
- 阿里巴巴考试题及答案
- 北京购房专业知识培训课件
- 人行清算面试题及答案
- pte考试题型及答案
- 2025-2030中国家政服务从业人员培训体系与职业发展白皮书
- 营养指导员试题附答案
- 初中英语新人教版八年级上册全册单词(2025秋)
- 2025年广西中考道德与法治试题答案详解讲评课件
- 传染病防治法培训课件
- 富血小板血浆治疗讲课件
- 代建公司内部管理制度
- 2025至2030中国女士内衣行业发展趋势分析与未来投资战略咨询研究报告
- 花卉大棚可行性研究报告
- 制造业生产线上岗证书证明书(6篇)
- 烹饪技术基础知识单选题100道及答案
评论
0/150
提交评论