局域网聊天上传

更新时间:2024-06-28 20:46:01 阅读量: 综合文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

………………… 四川师范大学成都学院

课程考查(论文/作业)专用封面

作业(论文)题目: 局域网聊天软件

_…__…_号……学… ) _线_(_ … … …_…_名…姓… … … …业…专…_…__)程封工(信…通…_…_级……__…_ … … … _…__…系…_)__密__(_ … … …__……………………… 所修课程名称: 计算机网络编程实训 修课程时间: 年 月至 年 月 完成论文(作业)日期: 年 月 评阅成绩: 评阅意见:

成绩考核采用百分制,评分细则: 序号 评分内容与要求 比例 得分 1 平时卫生、考勤、平时练习 40% 2 完成基于网络功能的软件设计,30% 网络、线程、界面等基本得以实现,以及程序的创新功能。 3 完成设计文档编写,包括程序流30% 程图、功能结构框图、系统运行效果图、技术简介、参考文献等。

评阅教师签名: 年 月 日

四川师范大学成都学院计算机网络编程实训报告

局域网聊天软件

学生姓名 学 号 所在学院 专业名称 班 级 指导教师

XXX 247589373 通信工程学院 通信工程 XXXXXX

成 绩

四川师范大学成都学院

二○一三年六月

四川师范大学成都学院计算机网络编程实训报告

关于局域网聊天软件的设计

内容摘要:如今网络的飞速发展,网络世界这一概念早已不再陌生,正是因为

即时通讯软件的诞生,网络世界才蓬勃发展。即时通讯软件给人们提供了一个交流的平台,这种平台逐渐衍生发展成为一种特殊的社区,但是脱离这样的社区就会影响到人们的正常生活,工作和学习。随着通信,网络的整合,即时通讯软件将进一步发展成为新一代的通讯软件,有着巨大的发展前景。腾讯QQ是深圳腾讯计算机系统有限公司开发的一款著名的基于Internet的即时通信(IM)软件。它是一种使人们能在网上识别在线用户并与他们实时交换消息的技术,为网络用户提供一个实时交流聊天的平台。

本系统主要是仿照QQ实现用户通过网络相互交流的功能,为进一步开发即时通信技术应用奠定基础。开发此软件的目的是综合以往软件开发知识,进一步熟悉面向对象开发方法,以便得到实用软件开发经验。

本论文将介绍与该系统相关的关键技术,重点介绍该系统的相关功能、设计思路,通过相关的插图详细介绍整个系统的开发过程及其实现,并总结开发过程中的经验,分析错误原因,提出解决方案。

关键词:即时通讯 QQ 聊天软件

III

四川师范大学成都学院计算机网络编程实训报告

LAN chat software design

Abstract: Today, with the rapid development of the network, the network

concept is no longer new to the world. Because of the birth of instant messaging software, precisely, the online world was booming. Instant messaging software to provide people with a communication platform that gradually developed into a special kind of derivative of community, but from such a community will affect people's normal life, work and study and so on. As communications, network integration, instant messaging software will be further developed into a new generation of communications software, has great prospects for development. QQ is Shenzhen Tencent computer system company limited for the development of a famous Internet based instant messaging ( IM ) software. It is a way for people to identify the Internet online users and exchange information with them in real-time technology, network users to provide a real-time chat platform.

Imitation QQ chat software is modelled on the QQ users through the network communication function, for the further development of the instant communication technology applied to lay the foundation. The development of this software is designed to summarize the previous software development knowledge, be familiar with the object oriented development method, in order to obtain practical experience in software development.

This paper will introduce the system and the related key technology, introduces the system function, design ideas, through the relevant illustrations introduce in detail the whole process of system development and implementation, and to summarize the experience in the development process, analyzes the cause of error, put forward solutions.

Keywords: Instant communication QQ chat system

IV

四川师范大学成都学院计算机网络编程实训报告

目 录

前 言 ............................................................... 1 1 需求分析 .......................................................... 2

1.1 课程设计目的 ................................................. 2 1.2课程设计的内容 ............................................... 2 1.3 课程设计要求 ................................................. 2 1.4.UDP协议的理解 ............................................... 3 1.5基于C/S的多客服端相互通信原理分析 ........................... 4 1.6套接字编程原理分析 ........................................... 4 2 概要设计 .......................................................... 5

2.2 设计概述 ..................................................... 6 2.2.1创建套接字 ................................................. 6

2.2.3 服务器套接字置为监听模式 ............................. 6 2.2.4建立连接,进行文件传输 ............................... 7

3 详细设计 .......................................................... 7

3.1流程图 ....................................................... 7 4界面设计与运行效果图 ............................................... 8

4.1用户登录界面 ................................................. 8 4.2用户运行界面 ................................................. 9 5总结与展望 ........................................................ 11

5.1总结 ........................................................ 11 参考文献 ........................................................... 19

V

四川师范大学成都学院计算机网络编程实训报告

局域网聊天软件

前 言

聊天工具的出现,促进了网络社会的形成,人们的生活世界也逐渐的划分为真实世界和虚拟世界。这里的虚拟世界就是指以网络为载体的生活,人们通常并不需要知道对方是谁,也不需要了解网络上的资源是谁提供的,便可以遨游于这个虚拟的世界,寻找属于自己的天空。虚拟世界从某种程度上促进了社会各个方面的发展,无论从经济上,文化上,教育上都有着举足轻重的地位。而作为网络社会的交通工具之一聊天工具扮演着极为重要的角色,它促进了人们思想交流,加快了信息流通的速度,使这个信息化的世界高速的运转着。在社会方面,聊天工具提供了一个交流的平台,就好比一个虚拟的社会,广大的使用者可以通过这个社会里畅所欲言,以特殊的方式营造出了一种社会属性。在教育方面,聊天工具带给我们新式的教学体验,使在线文字,语音,视频教学成为了可能,更重要的是,人们可以分享彼此的思想和经验,促进精神和教育文化的发展。在工作方面,人们利用聊天室和聊天群招开工作会议,利用聊天工具的文件服务实现文件共享和文件传输,提高了工作的效率。综观聊天工具的发展史,从单一的一对一聊天,到多对多的互动式聊天,聊天工具正在进行了一场人类思想交流观的革命。目前的主流聊天工具更是将工作、娱乐、购物整合在了一起,逐渐发展成了综合化的聊天软件。人们对聊天工具的开发与研究将不会懈怠,反而会更深入的探索其意义。在我看来,由于互联网的飞速发展,其必定会整合通信行业,而聊天工具将会取代电话,成为最流行普及的交流工具。

目前,用于实现单一的即时通讯的软件不多,因此,决定试着开发一个用于多台计算机之间即时通讯的软件,以方便多台计算机之间信息的交流。本系统使用VB软件编写。多点间快速传递信息。同时,它体积小,功能单一,界面简洁,易上手,特别是局域网聊天不可多得的好帮手。该专题简单介绍了TCP编程的一些知识,UDP与TCP地位相当的另一个传输层协议,它也是当下流行的很多主流网络应用(例如QQ、MSN和Skype等一些即时通信软件传输层都是应用UDP协议的)底层的传输基础,所以在本专题中就简单介绍下UDP的工作原理和UDP编程的只是,希望可以对刚接触网络编程的朋友起到入门的作用。

1

四川师范大学成都学院计算机网络编程实训报告

1 需求分析

理解基于UDP的网络编程技术,分析类似于QQ群聊程序设计原理和程序流程,选择合适的开发环境,参考已有的群聊程序功能,设计模拟实现基于UDP的群聊应用程序。

1.1 课程设计目的

开发一个专用于实现两台计算机之间即时通讯的软件,以方便两台计算机之间信息的交流。,在连接并通信时,尤其是近程的即时通讯,彻底的脱离了远程的服务器,避免了和远程服务器连接时过多的浪费网络资源。并且避免了服务器忙或与服务器无法连接时,浪费过多时间用于和服务器建立连接!因此,这个软件是极具适应性和实用性的即时通讯软件!本次课程设计的目的是学习基于UDP协议实现网络聊天程序,已达到学会面向无连接方式的程序设计方法,并理解网络编程中面向无连接的概念。 1.2课程设计的内容

用户数据报(UDP)是一个无连接协议,使用这种协议时,并不需要在两台计算机之间建立固定的连接,也就是说,通信双方没有服务器和客户机之分,它们之间进行的是对等通信,所以它的优势很明显,是现代通信不可或缺的一部分。所以,利用它的优势设计一个可以实现私聊和群聊的软件,实现两台计算机间的即时通讯。

1.3 课程设计要求

基于UDP协议实现一对一的聊天和一对多的聊天,提供友好的用户界面,便于用户进行操作。

根据目前使用聊天程序的用户需求显示,用户对于聊天程序主要有以下几点要求:

(1)聊天功能:可以实现实时接收和发送文字信息,并能支持公聊和私聊的方式。

(2)用户功能:可以查看对方的开放信息,以及发送方的IP。

(3)其他功能:用户具有注册、登录、聊天、查询好友、添加好友、删除好友、修改个人信息等功能。

2

四川师范大学成都学院计算机网络编程实训报告

1.4.UDP协议的理解

UDP协议是英文UserDatagramProtocol的缩写,即用户数据报协议,主要用来支持那些需要在计算机之间传输数据的网络应用。包括网络视频会议系统在内的众多的客户/服务器模式的网络应用都需要使用UDP协议。UDP协议从问世至今已经被使用了很多年,虽然其最初的光彩已经被一些类似协议所掩盖,但是即使是在今天,UDP仍然不失为一项非常实用和可行的网络传输层协议。UDP协议直接位于IP(网际协议)协议的顶层。UDP协议的主要作用是将网络数据流量压缩成数据报的形式。一个典型的数据报就是一个二进制数据的传输单位。每一个数据报的前8个字节用来包含报头信息,剩余字节则用来包含具体的传输数据。UDP协议使用端口号为不同的应用保留其各自的数据传输通道。正是采用这一机制实现对同一时刻内多项应用同时发送和接收数据的支持。数据发送一方(可以是客户端或服务器端)将UDP数据报通过源端口发送出去,而数据接收一方则通过目标端口接收数据。有的网络应用只能使用预先为其预留或注册的静态端口;而另外一些网络应用则可以使用未被注册的动态端口。因为UDP报头使用两个字节存放端口号,所以端口号的有效范围是从0到65535。一般来说,大于49151的端口号都代表动态端口。数据报的长度是指包括报头和数据部分在内的总的字节数。因为报头的长度是固定的,所以该域主要被用来计算可变长度的数据部分(又称为数据负载)。数据报的最大长度根据操作环境的不同而各异。从理论上说,包含报头在内的数据报的最大长度为65535字节。不过,一些实际应用往往会限制数据报的大小,有时会降低到8192字节。UDP协议使用报头中的校验值来保证数据的安全。校验值首先在数据发送方通过特殊的算法计算得出,在传递到接收方之后,还需要再重新计算。如果某个数据报在传输过程中被第三方篡改或者由于线路噪音等原因受到损坏,发送和接收方的校验计算值将不会相符,由此UDP协议可以检测是否出错。UDP协议并不提供数据传送的保证机制。如果在从发送方到接收方的传递过程中出现数据报的丢失,协议本身并不能做出任何检测或提示,由于排除了信息可靠传递机制,将安全和排序等功能移交给上层应用来完成,极大降低了执行时间,使速度得到了保证。如图1.4-1

3

四川师范大学成都学院计算机网络编程实训报告

图1.4-1 UDP报头

图1.4-2 TCP报文

1.5基于C/S的多客服端相互通信原理分析

在C/S模式中,数据的分发采用专门的服务器,多个客户端都从此服务器获取数据。这种模式的优点是:数据的一致性容易控制,系统也容易管理。 1.6套接字编程原理分析

4

四川师范大学成都学院计算机网络编程实训报告

图1.6-1 套接字编程原理图

2 概要设计

注册 登录 查找好友 用户 添加好友 聊天 聊天记录 删除好友 修改信息

图2-1整体框架设计图

服务器端主要实现的功能是启动一个监听的进程,开放自己的端口号为6553,不断的监听是否有新的客服端进程向自己发送连接请求,为每一个主动连接自己的客户端设置一个ID号设置一个threads的容器用来管理客户端的线程。

5

四川师范大学成都学院计算机网络编程实训报告

与客户端建立连接,实现socket通信,对于服务器端是先接受数据流然后再发送数据流,客服端发送过来的信息经服务器端然后转发到其他所有的客户端,服务器端相当于中间的桥梁。

客户端要求主要实现的功能是建立一个图形的界面,用于显示聊天信息等,并且建立与服务器端的通信,主动的向服务器端发送连接请求,然后对输入文本框注册事件监听并且发送给客服端,不断的监听服务器端发来的信息,然后显示出来。

2.1 原理概述

采用UDP协议,通过服务器中转方式。因此,现在的IP侦探在你仅仅跟对方发送聊天消息的时候是无法获取到IP的。UDP 协议是不可靠协议,它只管发送,不管对方是否收到。但它的传输很高效,因为UDP协议排除了信息可靠传递机制,将安全和排序等功能移交给上层应用来完成,极大降低了执行时间,使速度得到了保证。例如,腾讯采用了上层协议来保证可靠传输:如果客户端使用UDP协议发出消息后,服务器收到该包,需要使用UDP协议发回一个应答包。如此来保证消息可以无遗漏传输。 2.2 设计概述

2.2.1创建套接字

服务进程和客户进程在实现通信前必须创建各自的套接字,然后才能用相应的套接字进行发送接收操作,服务进程总是先于客户端进程启动,服务器端进程和客户端进程创建套接字。Socket()函数实现代码如下:

SOCKET serSocket=socket(AF_INET,SOCK_STREAM,0);//创建了可识别套接字

2.2.2 地址绑定

当调用socket()创建套接字后,服务器必须把套接字与自己的地址显式地建立联系,以便客户端向该IP地址和端口号的服务进程请求服务,这个过程是通过调用函数bind()实现的。bind()函数原型如下:int bind(SOCKET s ,const struct sockaddr FAR*name ,int namelen)

2.2.3 服务器套接字置为监听模式

将服务器设置为监听工作方式后,使用API调用listen():int listen(SOCKET s, int backlog);第一个参数指定套接字。第二个参数指定了正在等待连接的最大队列长度。若无错误发生,则listen()函数返回0。

6

四川师范大学成都学院计算机网络编程实训报告

2.2.4建立连接,进行文件传输

调用gets(path)获得传输文件的路径和存放文件路径,这个过程中还需调用send()函数和recv()函数,共同协调实现文件传送。

3 详细设计

3.1流程图

登陆窗口 是否拥有账号 N 注册账号 N 输入信息是否合格 Y 注册成功 用已注册账号登陆 N 登陆是否成功 Y 登陆成功 好友是否在线 Y N 传送文字 添加好友 退出系统 图3.1-1 工作流程图

客户端建立一个seversocket的类,并且创建一个vector用来管理客户端的线程,然后就开始检测,如果有客户端请求与服务器连接就与其建立socket连接,

7

四川师范大学成都学院计算机网络编程实训报告

创建进程设置ID,告诉其他的客户端有新的客户端接入,然后开始监听所有的客户端线程如果有信息通过端口进入就接受然后再发送给其他客户端,如果有客户端退出,就会告诉其他的客户端并且关闭与该客户端的socket连接,然后在vector里面删除相应的线程.

4界面设计与运行效果图

4.1用户登录界面

图4.1-1 聊天登陆界面

注意点:

1. 如果用户没有输入用户名,系统将显示一条错误消息,指出错误并提示用户输入用户名;

2. 如果用户没有输入密码,系统将显示一条错误消息,指出错误并提示用户输入密码;

3. 如果用户输入的用户名未被注册,系统提示用户输入的用户名不存在。 4.如果用户输入的用户名密码错误,系统将显示一条错误消息,指出错误并

8

四川师范大学成都学院计算机网络编程实训报告

提示用户输入正确的用户名和密码; 4.2用户运行界面

在MyChat和Server中输入地址127.0.0.1,端口号5558,以及用户名和密码后点击服务器的”OK”键。

图4.2-1 用户运行界面

如果在Server中按下Cancle键后。

图4.2-2 用户运行界面

如果点击MyChat的登陆键后。

图4.2-3 用户运行界面

如果重新输入密码和用户名后点击登陆键后,先前的用户就处于离线状态,

9

四川师范大学成都学院计算机网络编程实训报告

重新输入的用户处于在线状态。

图4.2-4 用户运行界面

在Server的头像上点击鼠标右键按删除键后就会删除MyChat和Server的头像。

图4.2-5 用户运行界面

双击头像后在输入框内输入要说的内容。

10

四川师范大学成都学院计算机网络编程实训报告

图4.2-6 用户运行界面

5总结与展望

5.1总结

本文主要对局域网聊天系统的思考与设计做出了一些阐述,对总体思考到具体实现都做了比较详细的阐述,使用户能基本了解设计思路以及具体实现过程。

聊天软件的设计与开发不是单单我一个人所做,我们是一个组讨论做出来的,在这段时间,我们将老师那边学到的知识加上网上查阅这方面的知识,最终做出了这样类似的一个聊天软件,在这个设计过程中,我认识到设计和开发一个软件是一项复杂的工程,需要前期预研,前期设计,模块设计,编码,调试,再编码,再调试等复杂的流程,缺一不可。特别是当程序发生错误时,不停的修改和调试,其实是很无味的,但是事后想来又是很精彩的过程。我深刻的感受到由于前期设计不够系统化,不够细致,导致后期代码的开发与维护显得很费力,出现了大量的冗余代码,并且类与类的依赖性太强,扩展性不足,今后需要着重加强这些方面的学习与积累。

5.2展望

转眼学生阶段就要划上句号了。通过这次毕业设计,我更深刻的认识到了教学实践在大学课程中的重要性,同时也发觉到了自己在学习方面存在的不足之处,在以后的学习中我会努力改进这些不足、不断提高自己的动手实践能力!

11

四川师范大学成都学院计算机网络编程实训报告

这次实验是在边学习边实践的基础上完成的,通过学习“计算机网络编程”,我们对网络的基础知识打下了很好的基础。这次网络实验可以说是在理解网络的基础上对编程的一次学习过程,虽然做的不是很完善,但也学到了很多知识。例如,vs2008的使用和对c#语句的理解都有了很大的提高。这对自己以后进行网络开发有很大的帮助。

12

四川师范大学成都学院计算机网络编程实训报告

致谢

本软件从分析,到设计,最后到得以实施,非常感谢那些对该项目提供过帮助的人们。

首先,特别感谢我的导师王敏老师,在该软件的整个规划实施前给予了我悉心的指导和耐心的讲解,使我在设计中始终把握关键方向,最终完成整个系统。

其次,感谢各位老师和同学在我系统设计中给我提出的一些指导性建议及技术支持。

最后还要感谢学校各位领导对我这几年的悉心教育,给予我充分展现自我和发展自我的平台。

13

四川师范大学成都学院计算机网络编程实训报告

附录

#endregion

#region Receive_events

private void ReceiveData() {

IsValidPort(txtPort.Text); try {

int port = int.Parse(txtPort.Text); udpClient = new UdpClient(port); //必须使用组播的地址范围内的地址 IPAddress groupIP = IPAddress.Parse(groupIPaddress.Text);

//50为生存时间,超时被丢弃

udpClient.JoinMulticastGroup(groupIP, 50); } catch { }

IPEndPoint remote = null;

//接收从远程主机发送过来的信息 while (true) {

try {

//关闭udpClient时此句会产生异常

byte[] bytes = udpClient.Receive(ref remote); string address = remote.ToString(); int atIndex = address.IndexOf(\

string memberaddress = address.Substring(0, atIndex); //执行委托

cbxChoose.Invoke(set_combobox_callback, memberaddress); string str = Encoding.UTF8.GetString(bytes, 0, bytes.Length); AppendString(string.Format(\来自{0}:{1}\ } catch {

break; //退出循环,结束线程 } } }

#endregion

#region IsValid_field

14

四川师范大学成都学院计算机网络编程实训报告

public void Terminate() {

udpClient.DropMulticastGroup(m_GroupAddress); }

//检测输入对方IP有没有效

private void IsValidIP(string str) {

IPAddress ip;

if (!IPAddress.TryParse(str, out ip)) {

MessageBox.Show(\非法IP地址\ return; }

}//检测端口号有没有效

private void IsValidPort(string str) {

int isPort;

if (txtPort.Text == \ {

MessageBox.Show(\端口号不能为空\ return; }

else if (!int.TryParse(str, out isPort)) {

MessageBox.Show(\端口号无效\ return; }

else if ((isPort < 1024) || (isPort > 65335)) {

MessageBox.Show(\端口号应该大于或等于1024,小于或等于65535\

return; } }

#endregion

#region tray_field

private void chat_Load(object sender, EventArgs e) {

btnChat.Enabled = true; btnStop.Enabled = false; txbSend.Enabled = false;

cbxChoose.SelectedIndex = -1;

//在当前窗体的容器中创建托盘图标NotifyIcon的实例 myNotifyIcon = new NotifyIcon(this.components);

15

四川师范大学成都学院计算机网络编程实训报告

//指定托盘图标

myNotifyIcon.Icon = new Icon(\ //鼠标悬停在托盘图标上方时显示的内容 myNotifyIcon.Text = \我的聊天器\ //设置关联的上下文菜单

myNotifyIcon.ContextMenuStrip = this.contextMenuStrip1; //显示托盘图标

myNotifyIcon.Visible = true;

//添加用户双击任务栏中的托盘图标时触发的事件 myNotifyIcon.DoubleClick += new EventHandler(myNotifyIcon_DoubleClick); }

void myNotifyIcon_DoubleClick(object sender, EventArgs e) {

if (isShow) {

this.Hide(); isShow = false; } else {

this.Show(); isShow = true; } }

private void chat_FormClosing(object sender, FormClosingEventArgs e) {

if (isExit == false) {

//取消关闭窗体事件 e.Cancel = true; //隐藏窗体 this.Hide(); } else {

udpClient.Close(); } }

private void 显示窗口toolStripMenuItem1_Click(object sender, EventArgs e) {

this.Show(); }

16

四川师范大学成都学院计算机网络编程实训报告

private void 退出程序toolStripMenuItem2_Click(object sender, EventArgs e) {

isExit = true;

Application.Exit(); }

private void notifyIcon1_MouseDoubleClick(object sender, MouseEventArgs e) {

if (isShow) {

this.Hide(); isShow = false; } else {

this.Show(); isShow = true; } }

private Icon m_Icon1; private Icon m_Icon2;

private void 打开计时器ToolStripMenuItem_Click(object sender, EventArgs e) {

tmIcon.Start(); }

private void 停止计时器ToolStripMenuItem_Click(object sender, EventArgs e) {

tmIcon.Stop(); }

private void tmIcon_Tick(object sender, EventArgs e) {

if (m_Icon1 != null && m_Icon2 != null) //如果两个图标文件都被正确载入 {

//只要tmIcon被启动,则在两个图标之间不断进行选择变换,实现动画效果

if (m_bFlag == true) {

notifyIcon1.Icon = m_Icon2; m_bFlag = false; }

17

四川师范大学成都学院计算机网络编程实训报告

else {

notifyIcon1.Icon = m_Icon1; m_bFlag = true; } } }

#endregion

#region control_delegate_method

private void SetComboBox(string str) {

//去除掉cbxChoose控件选项的重复内容 cbxChoose.Items.Add(str);

for (int i = 0; i < this.cbxChoose.Items.Count; i++) {

for (int j = 0; j < this.cbxChoose.Items.Count; j++) {

if (i != j) {

if (this.cbxChoose.Items[i].ToString() == this.cbxChoose.Items[j].ToString()) {

this.cbxChoose.Items.Remove(this.cbxChoose.Items[j]); } } } } }

18

四川师范大学成都学院计算机网络编程实训报告

参考文献:

[1] (美)罗舒赫:计算机网络,清华大学出版社,2000 [2] 邓亚平:计算机网络,电子工业出版社,2001

[3] 徐武:计算机网络工程与实训教程,电子工业出版社,1997 [4] (美)克莱姆:网络管理技术构架,人民邮电出版社,1999 [5] 刘晓华:NET核心技术原理与架构,电子工业出版社,2002 [6] 王石:数据库系统开发、WEB开发,人民邮电出版社,2007 [7] 罗莉琴,詹祖桥:《Windows网络编程》,人民邮电出版社 [8] 范文庆:《Windows API开发详解》,人民邮电出版社 [9](美)杜飞:《Windows并发编程指南》,机械工业出版社

[10] David J. Kruglinski & Scot Wingo & George Shepherd:《Programming Microsoft Visual C++6.0技术内幕》,北京希望电子出版社

[11] Jeffrey Richter & Christophe Nasarre :《Windows核心编程(第五版)》,清华大学出版社

[12] 张文,赵子铭:《P2P网络技术原理与C++开发案例》,人民邮电出版社 [13] 陈坚,陈伟:《Visual C++网络高级编程》,人民邮电出版社

19

本文来源:https://www.bwwdw.com/article/q5g3.html

Top