基于TCP协议网上聊天程序

上传人:沈*** 文档编号:120480144 上传时间:2022-07-17 格式:DOC 页数:22 大小:213.50KB
返回 下载 相关 举报
基于TCP协议网上聊天程序_第1页
第1页 / 共22页
基于TCP协议网上聊天程序_第2页
第2页 / 共22页
基于TCP协议网上聊天程序_第3页
第3页 / 共22页
点击查看更多>>
资源描述
编号: 计算机网络课程设计说明书 题 目: 基于TCP协议网上 聊天程序 系 别: 专 业: 学生姓名: 学 号: 指导教师: 2021 年 3 月 27 日 目 录1 设计任务21.1 系统设计目标21.2 聊天程序的功能22 系统分析22.1系统理论根底22.2 客户机/效劳器模式32.3 Sokect介绍42.4 系统开发环境52.5 系统结构设计53 总体设计53.1 体系结构设计53.2 网络通信设计63.3 模块设计8 3.31效劳器8 3.32客户端94 详细设计104.1 设计效劳器和客户端的界面104.2 实现效劳器和客户端通过网络通信114.3 实现多个客户端之间的实时聊天功能115 总结166 使用说明16参考文献201 设计任务1.1 系统设计目标 深入理解计算机网络根本原理,将书本上抽象的概念与具体的实现技术相结合,体会网络协议的设计与实现过程,以及专业技术人员所使用的根本方法和技巧。基于TCP协议网上聊天程序实现一简单的聊天程序,实现网上聊天,包括效劳器和客户端。要求: 1支持多人聊天。2客户端具有图形化用户界面。1.2 聊天程序的功能客户端使用简便,效劳器端运行稳定。客户端与效劳器端可运行在多种系统平台,具有良好的兼容性能。客户端与效劳器端功能独立,可独立运行在不同的计算机上或运行在同一台计算机上,具有最大的灵活性。 根据任课教师的要求及我自己的编程能力,写出以下的功能: 1、 登录时只需要提供用户名即可,无需输入密码。 2、 允许多人在线聊天。 3、 聊天发送的消息包括:用户名称、发送时间及正文。 4、 某用户刚登录效劳器时,效劳器需对其发送实时在线用户列表。 5、 某用户登录或退出程序时都需要给效劳器发送一个消息以通知其他用户。 6、 能够查看聊天记录。 2 系统分析2.1 系统理论根底TCP/IP的特点 TCP/IP协议的核心局部是传输层协议(TCP、UDP),网络层协议(IP)和物理接口层,这三层通常是在操作系统内核中设计。因此用户一般不涉及。TCP是面向连接的,通信双方保持一条通路,好比目前的 线,使用telnet登陆BBS,用的就是TCP协议;UDP是无连接的,通信双方都不保持对方的状态,浏览器访问Internet时使用的 协议就是基于UDP协议的。编程时,编程界面有两种形式:一、是由内核心直接提供的系统调用;二、使用以库函数方式提供的各种函数。前者为核内设计,后者为核外设计。用户效劳要通过核外的应用程序才能设计,所以要使用套接字(socket)来设计。2.2 客户机/效劳器模式 C/S结构Client/Server结构是大家熟知的客户机和效劳器结构。它是软件系统体系结构,通过它可以充分利用两端硬件环境的优势,将任务合理分配到Client端和Server端来实现,降低了系统的通讯开销。目前大多数应用软件系统都是Client/Server形式的两层结构,由于现在的软件应用系统正在向分布式的Web应用开展,Web和Client/Server 应用都可以进行同样的业务处理,应用不同的模块共享逻辑组件;因此,内部的和外部的用户都可以访问新的和现有的应用系统,通过现有应用系统中的逻辑可以扩展出新的应用系统。这也就是目前应用系统的开展方向。 首先效劳器方要启动,并根据请求提供相应效劳: 1翻开一通信通道并告知本地主机,它在某一公认地址端口上(如 为80)接受客户请求。 2等待客户请求到达该端口。 3接收到重复效劳请求,处理该请求并发送应答信号。接收并发效劳请求,要激活一新进程来处理这个客户请求。新进程处理此客户请求,并不需要对其他请求做出应答。效劳完成后,关闭此新进程与客户的通信链路,并终止。 4返回第二步,等待另外的客户请求 5关闭效劳器。 客户方: 1翻开一通信通道,并连接到效劳器所在主机的特定端口。 2向效劳器发出效劳请求报文,等待并接收应答;继续提出请求。 3请求结束后关闭通信通道并终止。 从上面的描述过程可知: 1客户与效劳器进程的作用是非对称的。因此编码不同。 2效劳进程一般是先于客户请求启动的。只要系统运行,该进程一直存在,直到正常终止或者强迫终止。 在TCP/IP网络中两个进程间的相互作用的主机模式是客户机/效劳器模式(Client/Server model)。该模式的建立基于以下两点:1、非对等作用;2、通信完全是异步的。客户机/效劳器模式在操作过程中采取的是主动请求效劳响应的方式。2.3 Socket介绍Socket是建立在传输层协议(主要是TCP和UDP)上的一种套接字标准,最初是由美国加州Berkley大学提出,它定义两台计算机间进行通信的标准也是一种编程标准,如果说两台计算机是利用一个“通道进行通信,那么这个“通道的两端就是两个套接字。套接字屏蔽了底层通信软件和具体操作系统的差异,使得任何两台安装了TCP协议软件和实现了套接字标准的计算机之间的通信成为可能。微软的Windows Socket标准(简称Winsock)对Berkley的套接字标准进行了扩展,利用标准的Socket的方法,可以同任何平台上的Socket进行通信;利用其扩展,可以更有效地实现在Windows平台上计算机间的通信。Socket减轻了编写计算机间通信软件的难度;标准的Socket的应用程序框架如下:Server方:Socket()新建一个SocketBind()同效劳器地址绑定Listen()Accept()block waitread()接受消息,在windows平台中,方法为send(TCP),或者是send to(UDP)处理效劳请求Write()发送消息,在windows平台中,方法为send(TCP),或者为send to(UDP)。Client方相对简单:Socket()Connect()通过一定的port连接特定的效劳器,这是与效劳器建立连接Write()Read()。Socket可以是基于TCP的,也可以是基于UDP,同时Socket甚至建立在其他的协议,比方IPX/SPX,DECNet等。在新建一个Socket时,可以指定新建何类Socket。Bind()用来同效劳器的地址绑定,如果一个主机只有一个IP地址,实际上绑定的作用就相对多余了。Listen()开始监听网络,Accept()用于接受连接,其返回值是保持同客户机联系的Socket。在VC+ 2021中,其底层的Socket也应该是Windows的Socket。Inprise在VC+2021中对Windows Socket进行了有效的封装,使得用户可以很方便地编写网络通信程序。Socket系统调用包括创立Socket、将创立的Socket与本地端口绑定、建立Socket连接效劳器、监听是否有连接、请求数据的可控缓冲发送和可控缓冲接收,到最后关闭Socket。首先在效劳器方,利用socket()函数建立流式套接字,返回套接字号s,接着利用bind()函数将套接字s与本地地址绑定,紧接着利用listen()函数通知TCP,监听客户方,效劳器准备接收连接,没有连接的话,效劳器方通过closesocket()关闭套接字s,效劳结束。有连接的话,在客户方,通过socket()函数建立流式套接字s,此时在效劳器方,建立连接,通过accept()返回,得到新的套接字ns,客户方通过connect()将套接字s与远程地址连接,此时效劳器方/客户方在ns/s上读/写数据,直到交换完成。交换完成后,效劳器方/客户方关闭套接字ns/s,最后效劳器方通过closesocket()关闭最初套接字s,效劳结束。2.4系统开发环境本系统开发环境采用Visual Studio 2021。编译语言采用C+。2.5系统结构设计本系统采用C/S结构,最重要的特点是非对等相互作用,即客户与效劳器处于不平等的地位,效劳器拥有客户所不具备的硬软件资源,客户和效劳器分别是效劳的请求者和提供者。网络中各个机器的资源是不平等的,网络的真正目的就是共享这些不均等资源源,非对等相互作用特点也正好表达和适应了客观现实中资源的不均等现象。局域网上不同主机进程间通信完全是异步的,通信时机具有随机性,所以必须用这种为通信双方的数据交换提供同步的机制。3 总体设计3.1体系结构设计通常的通信工具,都采用客户机/效劳器(C/S)体系结构,C/S结构是这样的一种结构:它包括一个客户机(或前端),一个效劳器(或称后端),客户机的作用是访问和处理远程效劳器上的数据,效劳器的作用是接收和处理客户机的数据请求。有时,可能有多个客户向同一个效劳器同时请求效劳,这就需要效劳器决定怎样处理这些请求。Client/Server结构是当前数据库应用程序中极为流行的一种方式。尤其是网络技术的开展,使得当前很多系统都采用这种方式进行构造,其最大的优点是将计算机工作任务分别由客户端和效劳器端来共同完成,这样有利于充分合理的利用系统资源。另外它的效劳器端还可以将信息集中起来,任何客户机都可以通过访问效劳器而获得所需的信息。Client/Server模型最终可归结为一种“请求/应答关系。一个请求总是首先被客户发出,然后效劳器总是被动地接收请求,返回客户需要的结果。在客户发出一个请求之前,效劳进程一直处于休眠状态。一个客户提出请求后,效劳进程被“唤醒并且为客户提供效劳,对客户的请求做出所需要的应答。如下列图所示: 图3.1客户机效劳器通信结构示图在客户端启动后,客户端计算得到本地网络的播送地址,进行播送查找效劳器端,效劳器接收到客户端的播送信息后返回效劳器地址,那么客户端接收、验证信息并记录效劳器端地址,然后客户端启动定时期,定时发送信息到效劳器,以告知效劳器自己在线,然后效劳器返回在线用户列表,效劳器依靠客户端发送的信息来更新维护在线用户列表。在客户端与效劳器尽心数据交换,拥有了在线用户列表后,就可以选择IP进行客户端之间的点对点信息交流了。如果效劳器不在线,那么客户端会提示用户退出,在一定的时间后自动退出。3.2网络通信设计在调用了Windows sockets 的启动函数WSACleanup()之后才能进行其他的Socket系统调用,但启动函数WSAStartup()是为了建立与Windows Sockets DLL的连接,因此在Visual Studio 2021所建立工程的工程设置中的连接的库模块必须进行设置,在其中的link栏内的对象/库模块中参加“Ws2_32.lib,才能真正建立建立与Windows Sockets DLL的连接。其他的Socket系统调用包括创立Socket、将创立的Socket与本地端口绑定、建立Socket连接效劳器、监听是否有连接、请求数据的可控缓冲发送和可控缓冲接收,到最后关闭Socket。具体流程图如1所示。首先在效劳器方,利用socket()函数建立流式套接字,返回套接字号s,接着利用bind()函数将套接字s与本地地址绑定,紧接着利用listen(0函数通知TCP,监听客户方,效劳器准备接收连接,没有连接的话,效劳器方通过closesocket()关闭套接字s,效劳结束。有连接的话,在客户方,通过socket()函数建立流式套接字s,此时在效劳器方,建立连接,通过accept()返回,得到新的套接字ns,客户方通过connect()将套接字s与远程地址连接,此时效劳器方/客户方在ns/s上读/写数据,直到交换完成。交换完成后,效劳器方/客户方关闭套接字ns/s,最后效劳器方通过closesocket()关闭最初套接字s,效劳结束。具体设计过程如图3.2所示。效劳器方Socket()建立流式接字,返回套接字号s客户方bind()套接字s与本地地址绑定listen()通知TCP效劳器准备接收连接accept()接收连接,等待客户端的连接建立连接,accept()返回,得到新套接nsRecv()/send()在ns上读/写数据,直到完成交换closesocket(),关闭套接字nsclosesocket()关闭最初套接字s,效劳结束Socket()建立流式套接字号sconnect()将套接字s与远程地址连接Recv()/send()在s上读/写数据,直到完成交换closesocket()关闭套接字s,结束TCP 图3.2 面向连接的套接字的系统调用流程图3.3 模块设计 3.31 效劳器 首先运行效劳器,效劳器侦听端口消息,等待客户端向其建立连接的申请,一旦接收到客户端的连接请求,效劳器将返回一个新的套接字描述符,通过该描述符调用数据传输函数即可与客户端进行数据的收发。效劳器假设接收的是登陆信息,向该用户发送在线用户列表,并更新效劳器的在线用户列表;假设收到的是发送信息,效劳器解析信息,然后通过播送消息,向其所有线用户列表发送消息。效劳器端流程图如下。 向该用户发送在线用户列表 开始侦听端口消息 解析消息向其所有在线用户发送消息首次登陆更新效劳器在线用户列表收到消息 运行效劳器 是 否 是 播送消息 图3.31 效劳器流程图 3.32 客户端 在运行效劳器之后,运行客户端。客户端首先向效劳器提出建立连接请求,然后建立一个套接字描述符,通过该描述符调用数据传输函数即可与效劳端进行数据的收发。用户登录成功后,向效劳器发送登陆消息,并更新本地在线用户列表,然后通过效劳器实现与其他客户聊天;当客户退出,向效劳器发送下线消息。客户端流程图如下。 开始 开始 开始 运行客户端 运行客户端 运行客户端 用户登陆 用户登陆 用户登陆给效劳器发送登陆消息登陆成功登陆成功向该用户发送在线用户列表登陆成功向该用户发送在线用户列表 否 是 显示主页面 显示主页面 显示主页面 是给效劳器发送下线消息向其所有在线用户发送消息向其所有在线用户发送消息 是更新本地在线用户列表更新本地在线用户列表更新本地在线用户列表与其他用户进行聊天与其他用户进行聊天与其他用户进行聊天 退出 退出 退出 图3.32 客户端流程图 4 详细设计4.1 设计效劳器和客户端的界面分别为客户端和效劳器创立基于对话框的MFC工程。分别为其添加显示信息和输入信息的文本控件和按钮,并为其指定适当的属性。效劳器和客户端的运行界面分别如图4.14.3所示。 图4.1 效劳器运行界面设计 图4.2 客户端登陆界面设计 图4.3 客户端运行界面设计4.2实现效劳器和客户端通过网络通信效劳器和客户端通过定义CSocket 类的子类来重载CSocket 类中的成员函数完成效劳器与客户端之间的网络通信。效劳器和客户端的交互包括客户端登录效劳器,效劳器将客户名添加至客户列表中,以及客户下线后,效劳器和在线客户将下线客户从客户列表中删除等。4.3实现多个客户端之间的实时聊天功能 由于客户端/效劳器模式,客户在进行聊天时,需要把待发送的消息发送至效劳器;效劳器接收到消息后,经过查询客户列表,寻找接受的客户名后,将消息转发至在线客户处。由于效劳器与客户端交互时,还需接收客户端的登录信息,故将接收客户端的登录信息和接收消息发在同一个接收函数中。 根据以上步骤,对实现聊天工具的效劳器和客户端的关键代码解说如下。 1效劳器初始化,开始监听客户端的连接请求,具体代码如下:BOOL CChatServerApp:InitInstance()if (!AfxSocketInit() /套接字初始化失败AfxMessageBox(IDP_SOCKETS_INIT_FAILED);return FALSE;AfxEnableControlContainer();CServerSocket *m_pSocket; /自定义的CSocket类的子类 m_pSocket = new CServerSocket;if(!m_pSocket-Create(9999) /创立套接字AfxMessageBox(_T(创立Socket失败!);return FALSE;if(!m_pSocket-Listen() /监听客户端的连接请求AfxMessageBox(_T(创立侦听发生错误!);return FALSE;(2客户端登陆至效劳器,具体代码如下: void CLoginDlg:OnOK() UpdateData(); /获取文本框中数据if(!m_pSocket-Create() /创立套接字AfxMessageBox(_T(网络创立错误!);m_pSocket-Close();return;if(!m_pSocket-Connect(m_strServer,9999) /连接至效劳器AfxMessageBox(_T(连接效劳器失败!);m_pSocket-Close();return;Header head;head.type = LOGIN_IO;head.len = m_strName.GetLength();m_pSocket-Send(char *)&head,sizeof(Header); /发送客户信息至效劳器m_pSocket-Send(m_strName,m_strName.GetLength();theApp.m_strName = m_strName;CDialog:OnOK(); 3效劳器接收新登录客户的信息,具体代码如下:void CClientSocket:OnReceive(int nErrorCode) char buff1sizeof(Header);memset(buff1, 0, sizeof(buff1);Receive(buff1,sizeof(buff1);Header *header = (Header*)buff1;int length = header-len;char type = header-type;if(type = LOGIN_IO) /如果收到的是登录信息char buff1000; memset(buff,0,sizeof(buff); Receive(buff,length); /接受客户登录信息CTime time = CTime:GetCurrentTime(); /获取当前系统时间 CString t = time.Format(%Y-%m-%d %H:%M:%S); /时间格式CEdit *p_Edit = (CEdit *):AfxGetMainWnd()-GetDlgItem(IDC_EDIT_INFO);CString strTemp = t + : + CString(buff) + 进入rn; /显示登录信息p_Edit-ReplaceSel(strTemp); /更新在线客户列表 m_strName = buff; m_dlgServer-UpdateUser(this);if(type = SEND_MESSAGE) /如果接受的是客户发送信息char buff1000; memset(buff,0,sizeof(buff); Receive(buff,sizeof(buff); /接收消息内容CClientSocket *curr = NULL;POSITION pos = clist-GetHeadPosition();while (pos != NULL) /将消息发至在线客户curr = (CClientSocket *)clist-GetNext(pos);curr-Send(char *)header,sizeof(Header);curr-Send(buff, sizeof(buff);CSocket:OnReceive(nErrorCode); 4客户发送消息,先将消息发至效劳器,具体代码如下:void CMyChatDlg:OnSend() UpdateData();if(m_strMessage = )AfxMessageBox(_T(不能发送空消息!);CEdit *pEdit = (CEdit*)GetDlgItem(IDC_EDIT_MESSAGE);pEdit-SetFocus();return;Header head;head.type = SEND_MESSAGE;head.len = m_strMessage.GetLength();CTime time = CTime:GetCurrentTime();CString t = time.Format(%H:%M:%S);CString nikeName = theApp.m_strName;CString str = nikeName + + t + rn + +m_strMessage;m_pSocket-Send(char *)&head,sizeof(Header); /将发送时间和收信客户信息发至效劳器if(m_pSocket-Send(LPCTSTR)str, str.GetLength() /发送信息内容m_strMessage = ;UpdateData(FALSE);CEdit *pEdit = (CEdit*)GetDlgItem(IDC_EDIT_MESSAGE);pEdit-SetFocus();elseAfxMessageBox(_T(网络传输错误!); 5效劳器接收消息并转发,具体代码如下:void CClientSocket:OnReceive(int nErrorCode) char buff1sizeof(Header);memset(buff1, 0, sizeof(buff1);Receive(buff1,sizeof(buff1);Header *header = (Header*)buff1;int length = header-len;char type = header-type;if(type = LOGIN_IO) /如果收到的是登录信息char buff1000; memset(buff,0,sizeof(buff); Receive(buff,length); /接受客户登录信息CTime time = CTime:GetCurrentTime(); /获取当前系统时间 CString t = time.Format(%Y-%m-%d %H:%M:%S); /时间格式CEdit *p_Edit = (CEdit *):AfxGetMainWnd()-GetDlgItem(IDC_EDIT_INFO);CString strTemp = t + : + CString(buff) + 进入rn; /显示登录信息p_Edit-ReplaceSel(strTemp); /更新在线客户列表 m_strName = buff; m_dlgServer-UpdateUser(this);if(type = SEND_MESSAGE) /如果接受的是客户发送信息char buff1000; memset(buff,0,sizeof(buff); Receive(buff,sizeof(buff); /接收消息内容CClientSocket *curr = NULL;POSITION pos = clist-GetHeadPosition();while (pos != NULL) /将消息发至在线客户curr = (CClientSocket *)clist-GetNext(pos);curr-Send(char *)header,sizeof(Header);curr-Send(buff, sizeof(buff);CSocket:OnReceive(nErrorCode); 6客户端接收效劳器转发的消息,具体代码如下: BOOL CMyChatDlg:GetMessage() /接受效劳器转发的信息char buff1000;memset(buff,0,sizeof(buff);m_pSocket-Receive(buff, sizeof(buff),0);CString strTemp = buff;strTemp += _T(rn);m_MessageList.ReplaceSel(strTemp); /显示接受到的信息return TRUE; (7客户下线后,效劳器将下线的客户从客户列表中删除,具体代码如下: void CClientSocket:OnClose(int nErrorCode) /效劳器通过失去连接错误码获知下线的客户POSITION pos = clist-Find(this);if(pos != NULL)clist-RemoveAt(pos); /将下线客户信息从列表中删除CTime time = CTime:GetCurrentTime();CString t = time.Format(%Y-%m-%d %H:%M:%S);CEdit *p_Edit = (CEdit *)m_dlgServer-GetDlgItem(IDC_EDIT_INFO);CString strTemp = t + : + this-m_strName + 离开rn;p_Edit-ReplaceSel(strTemp); /显示客户下线信息m_dlgServer-UpdateUser(this);this-Close(); /关闭与下线客户连接的套接字delete this;CSocket:OnClose(nErrorCode); 8其他客户下线后,客户端更新在线用户列表,具体代码如下:void CMyChatDlg:UpdateUser()char buff1000;memset(buff,0,sizeof(buff);m_pSocket-Receive(buff, sizeof(buff),0); /接收用户下线信息CString user_info = buff;CString array100;int b = 0;for( int i=0; iuser_info.GetLength(); i+ ) /查找当前在线用户if(i != (user_info.GetLength() - 1)if ( user_infoi=& )b +;elsearrayb = arrayb + user_infoi;m_UserList.ResetContent();for(int j=0; jb+1; j+) /更新在线用户列表m_UserList.AddString(arrayj);5总结 经过了整整3个星期的忙碌,终于完成了课程设计。在这段时间里体验了无数的酸甜苦辣,从解决不了细小问题的苦恼到问题最终解决的喜悦。一直伴随着整个设计过程。整个设计过程是不断学习,不断发现问题、分析问题、解决问题的过程。使我受益良多。设计期间有许多的感触、想法、经验、教训,对以后的学习、工作有很大的益处。 这次的课程设计是简单聊天程序,在平日的生活学习中,可以说QQ等即时通讯软件已占据重要的位置,也深受大家的喜爱,所以这个课程设计很有现实意义,做起来也比拟感兴趣。在具体做的过程中,参考了资料书还有学长的一些程序,虽然这个聊天室的界面及功能比拟简单,但从代码的编写及结果的调试成功还是花了很多的心思。尤其是刚开始用Visual Studio 2021软件的时候,从完全陌生到慢慢的了解,这其中的过程对应用方面知识的提高有很大的帮助。 课程设计工程的虽然要求是独立完成,但还是很多问题的解决离不开老师的指导及同学之间的探讨,这些在做工程的时候都是必不可少的。学校提供了设计的机房还有老师的悉心指导,这些跟课程设计的顺利完成都是密不可分的,在这里感谢大家带来的帮助。 另外就是知识方面的问题,计算机网络和windows Sockets 有很多方面的知识还是很不熟悉,具体用到的时候就感觉生疏,或者还是缺乏设计方面的实践。课程设计的时机不是很多,由于所学的知识包含了太多的方面,所以实践方面还是远远不够,希望在学校期间能够多一些类似的时机。此次课设用的是C+语言编程完成,程序代码到达了老师的要求,代码长度有400多行,实现了基于TCP协议网上聊天程序,该程序并具有如下的功能:1、 登录时只需要提供用户名即可,无需输入密码。 2、 允许多人在线聊天。 3、 聊天发送的消息包括:用户名称、发送时间及正文。 4、 某用户刚登录效劳器时,效劳器需对其发送实时在线用户列表。 5、 某用户登录或退出程序时都需要给效劳器发送一个消息以通知其他用户。 6、 能够查看聊天记录虽然课程设计顺利的完成了,但由于水平有限,还是有很多的欠缺跟缺乏之处,如在实现功能上只是实现了群聊的功能,却没能实现私聊的功能;图形界面有点简单。希望老师给予指正。6使用说明(1) 首先运行效劳器,运行结果如图6.1所示。 图6.1 效劳器初始化运行结果(2) 再运行两个用户端,分别用客户名是“kitty 和“lucy登陆,登陆界面运行结果如图6.2和6.3所示。 图6.2“kitty客户端登陆界面 图6.3“luly客户端登陆界面(3) 登陆后。效劳器和两个用户端进行通信的结果如图6.46.6所示。 图6.4 登陆后效劳器运行结果 图6.5“kitty客户端运行结果 图6.6“luly客户端运行结果(4) 当客户“lucy下线后,效劳器的运行结果如图6.6,客户“kitty的运行结果如图6.7所示。 图6.6 “lucy客户下线后,效劳器运行结果 图6.7 “lucy客户下线后,“kitty客户运行结果参考文献 1任泰明.TCP/IP协议与网络编程,西安:西安电子科技大学出版社,2004.3 2H.M.Deitel P.J.Deitel.C+程序设计教程,北京:机械工业出版社,2006.6 3吴功宜.计算机网络第2版,北京:清华大学出版社,2007.3 4 谭浩强.C程序设计第二版,清华大学出版社 5 郎锐 罗发根.Visual C+ 网络通信程序开发指南,北京:机械工业出版社,2004.3
展开阅读全文
相关资源
相关搜索

最新文档


当前位置:首页 > 办公文档 > 工作计划


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!