下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、网络编程课程设计说明书题目名称: 基于TCP/IP的网络文字聊天程序设计专 业:网络工程班 级:1201班学 号:1220140105姓 名:蒋星指导老师:陈利平完成日期:2014 年12月13日目录一、实验基本信息概要31 . 题目要求32 .题目内容33 .开发环境3二、流程图 4三、系统简介 51 .界面 52 .软件功能53 .系统设计94 .优点与缺点9四、系统详细设计111. ChatServer 类 112. ChatClient 类 133. SocketException 类 155 . 命令协议 156 .消息格式16五、系统测试167 .服务器使用错误168 .客户端使用
2、错误179 .启动服务器1710 启动客户端1711 关闭客户端1712 启动服务器错误提示1813 公开聊天1814 私聊1815 错误的私聊1916 .更名2017 .帮助2018 .非法指令2019 .非法的指令参数2020 .连接服务器失败21六、心得体会21七、完整代码21Charserverd.cpp 服务器main函数文件 21ChatServer.h 服务器类头文件 22ChatServer.cpp服务器类 23ClientInfo.h 客户信息类33Charclientd.cpp 客户端 main 函数 34ChatClient.h客户端头文件34ChatClient.cpp
3、客户端类 35InitSock.cpp 初始化 WINSOC糜 41SockException.h 异常类 41八、参考文献42教育资料、实验基本信息概要1.题目要求1 、开发平台Visual C+ 6.0。2 、对设计方法的要求使用Visual C+ 6.0开发出在 Windows控制台或图形界面下运行的程序。3 、对设计内容的要求实现网络文字聊天程序的服务器端。实现网络文字聊天程序的客户端。主程序的结构和流程。 程序运行过程的截图。网络文字聊天程序的实现原理。网络文字聊天程序实现代码的分析。4、对课程设计说明书的要求设计思路与开发过程。对主要代码段要有较详细的注释。 对本次设计的评价、设计
4、的收获与建议。5、说明书为打印件2 .题目内容内容概要:实现网络文字聊天程序的基本功能3 .开发环境操作系统:Windows 7开发语言:C+集成开发环境:Microsoft Visual Studio 2010启动客户端登录服务器发送消息显示在线用户启动服务器: 等待客户请求j 处理客户翱抿显示私聊信息显示对所有人信息发送ID和IP等待客户端登陆登录失败连接上客户端创建子套接字发送 messahgeMessageMes sage找到客户端并显示三、系统简介1.界面本软件使用DOS$制台界面,界面风格较为朴素。服务器:ffliC:v/indowssystem52cmd.exe - ChatSe
5、rverexe 6789c : >ChatServei'_exe 6789Syten 1 nF。1 成功绑定端口二 678yStem Id】用务器在6 789端口开始监听客户端:127*0操作指南:ABC<i2?>e.enBC(127t系统消ABC<127,::XXhatClicnt *exe 6789J疝ag:ChatCli/nt*K/ Ip Port"*1HMi欢迎使用茴Zlx$t你白1昵甘: “对方in。消B zh« Ip命令指南: 1退出USAGE2法理在统用户USRGE3更改昵称USAGE43私聊U£RGE5)帮即信息US
6、ftGEChatClierrt l?7.a.Q,l 67892.软件功能本软件实现了聊天室基本的功能,包括公开聊天,私聊,获取在线用户,更改昵称,获 得帮助等。1) 公开聊天在光标处直接输入消息后按回车即为发送公开聊天,如下图所示。pBC127g.l, UID:128 说: ahcRBCa27-0.0-l> UID:128 说:ABCfiBC<127.0.0.1> UID:128 说工 ACBSB 管理员:C:v* ndowssystemS2L-nd eKDFGH<127.0.0.1> UID:136 说:我了名字修改了!fiSDC<127.0.0,l>
7、; UID:132 说;SADASDKK<127_0.0_l> UID:128 说: hahahflSDC<127-0-0,1> UID:132 说士 henhaoDFGH<127.0.0.1> U1D:136 说:快点快点快点快点快点开2) 私聊使用命令1/m对方UID消息】即可发送私聊,私聊只有对方可以看到,如下图所示:客户端1,密聊UID为132的用户。1系统消息昵称已修改为:Tom<127-0.0.1> U1D:128 说: 大家后Jack<127.0.0.1> UID:132 说: 你好,,强高强到他人132你好,疆祀韶单独
8、聊聊吗?1系统消息昵称已修改为rDn<i2?.e.e.i> uid:128 说大家好、Jack<127.0.0.1> UID:132 年沐好,很高兴见到你除肖悄地对Jack UID: 132 % 椽算,莪们能单独聊聊吗?发送后客户端2, UID为132的用户收到私聊消息。tlon<12?.0.0.1> UID:128大家好、JacP<127_0.0.l> UID;132 说*你好,很高举为到你Ton UID:128悄悄地对你说工你好,我们能罩独聊聊吗?I半:3) 获取在线用户列表使用命令1/list】即可获得在线用户列表,用户列表会议系统消息的方
9、式返回,如下图所示。命令【系统消息】昵称已修改为:JARHY<127.0.0.1> UIB:128 说:KK/list半二发送后1系统消息】昵称已修改为二的RRY<127.0.0.1> UID:128 说;KM系统消息J在线人数共3人:MK 127.0-0.1 UID:12SJack 127_0_0_1 U1D:132JARRY 127.0.0.1 UrD=1364) 更改昵称使用命令1/name你的新昵称】即可立即更改昵称,成功修改后服务器会以系统消息 的方式返回成功修改的提示。命令SB 莒理员:C :w n doW5sy e m 3 2cm dBC<127,0
10、.0,1> UTD:136 说:看看我叫什么名字?n a(DE DFGH命令发送后&B 管理良ind。w式士m3-BCC12770.0.1>1JID:136看餐期4什么五字工一 系疏消息昵粽已修改为:DFGHIFGH(127.0.0.1> UID:13G 说我了名字修改了!5) 帮助信息使用命令1/help 即可查看服务器的欢迎信息,里面包含了该聊天室的使用帮助,如 下图所示。命令S3 管理员:C:vjindowssy5tem 32cmd.exe - CIfiSDC<127.0.0.1) UID:132SADASB/he Ip命令发送后加 营理员:Cwindow
11、j$5ystetn32cmd.exe - ChatClient.exe 127 0 01 6789SDC<12?/0.0.15 11:132 1: SADASB* 欢迎使 桑作指南,1)在控制台中 2)饮斜杠(/)易聊天室*命令指南二出骂US在用户 昵称USAGE: USAGE: USAGE: USAGE: USAGE:/exit/list/nanc你的昵称/"对方UID消息/help人蛊 按回车即畔送公共聊天消息 5消息将会当做命令处理3 .系统设计开发本软件时,我使用了面向对象的思想,把服务器和客户端封装成对应的类,类设计将会在下一节做详细介绍。通行方面我在服务器接受客户端
12、消息,和客户端接受服务器消息时使用了 select模型,发送信息我使用的是普通的socket原语。基本原理为服务器与客户端建立TCP连接,然后服务器负责路由消息到各个客户端。4 .优点与缺点本软件对流程复杂的SELECT莫型进行了细致的拆分与抽象,做到了逻辑流程清晰,每个函数简洁易懂,层次分明。例如服务器启动函数:void ChatServer:Start()InitListenSocket();Bind();Listen。;InitFDSocket(); while (true) DoSelect(); trycharServer.Start();catch(SockException e)
13、cout << e.GetErrorInfo () << endl;cout << "System Error Error Code:" << e.GetErrorCode () << endl; 它其实就完成了一个简单的流程,初始化 socket ,绑定,监听,初始化 fd_socket集 合,死循环调用select。通过合理的封装底层原语和加入异常处理(异常交给顶层处理), 使得代码专注于业务流程而不是繁杂的异常判断语句,在看下面这个函数DoSelect()。void ChatServer:DoSelect (
14、)m_fdRead = m_fdSocket;int nRet = Select。;if(nRet > 0)for(int i = 0;i < m_fdRead.fd_count; i+)DoFDRead(m_fdRead.fd_arrayi);它也只完成一个简单的流程,调用select ,然后循环处理有读事件的socket。void ChatServer:DoRead (SOCKET sRead)if (sRead = m_sListen)RecvNewConnect();elsem_sNowClient = sRead;RecvNewConnect();socket 是监听 s
15、ocket接下来的DoFDRead()函数完成的事情也非常直接,如果有事件的 的话,那么就是接收到了一个新的连接,否则是接收到了新的小。从上面这个简单的例子中可以看到,本软件最大的优点就是 精心设计的类和函数。避免了使用select模型常见的反复嵌套的循环和判断,每个函数清晰明了。本系统还存在以下不足,首先是没有对界面做更深入的优化,只是做了最基本的调整,让输入输出更加雅观,其次是底层原语的封装并没有考虑到泛用性。四、系统详细设计这部分的文档在编码之前已经基本完成,由于时间较为仓促,部分内容可能和实际有所出入。1. ChatServer 类该类负责完成服务器所有操作。1)类图2)成员变量Map
16、<SOCKET, stringm_clients聊天者的 SOCKET!昵称的映射fd_set m_fdSocket可用套接字集合fd_set m_fdRead 有事件发生的套接字集合SOCKET m_sListen 监听 SocketSOCKET m_sNowClient当前处理的客户套接字int m_nPort 监听端口3)方法设计void Bind()void Listen()void Select()int Recv()SOCKET Accept()封装底层原语,并加入异常机制,使得外部调用简约明了。构造函数传入监听端口,初始化 m_nPortStart()1)初始化监听套接字:
17、void InitListenSocket()2)绑定套接字至本地机器:void Bind()3)进入监听模式(设置为非阻塞): void Listen()4)初始化可用套接字集合void InitFDSocket()5)死循环,调用 select方法 DoSelect()6)结束DoSelect()1)令 m_fdRead = m_fdSocket2)调用 Select()3)循环处理 Select 的结果 DoFdRead(Socket sRead)4)结束DoFdRead(int iReadIndex)1)判断是否为m_sListen2)是 m_sListen RecvNewConnec
18、t()3)否贝U 令 m_sNowClient = m_fdReadiReadIndex ,调用 RecvNewMessage() RecvNewConnect()1)判断是否达到套接字上线2)调用Accept。,接收连接 sClient3)添力口 sCilent 至 m_fdSocket4)添加套接字至 m_clients AddClientToInfoMap(string name)AddClientToInfoMap(string name)1)以SOKCE伪键,name为值加入MAPRecvNewMessage()1)调用Recv函数2)是否为命令 IsCommand(string s
19、tr)3)是,贝U DoCommand(string cmd)4)否,贝U DoMessage(string msg)5)结束IsCommand(string str)1)判断是否以"/" 开头DoCommand(string cmd)1)判断指令,并解析命令与参数( argc, argv )2)调用指令处理函数3)假设只有SetName命令,那么则将对应的套接字的名称设置DoMessage(string msg)1)拼接消息与名字 BuildMsg(string msg)2)在服务器上输出3)消息路由 DispatchMessage(string msg)BuildMsg
20、(string msg)1)从m_clients中取出用户昵称2)拼接字符串,形成格式如下超人君(127.0.0.1) 23:49:48 说:大家好!即为:昵称(IP地址)时间说:消息正文3)返回DispatchMessage(string msg)1)构造迭代器2. 遍历m_clients,若不是自身,则派送消息Send()3. ChatClient 类该类负责处理客户端的所有操作。1)类图2)字段设计SOCKET msClient客户端自身的socketSOCKET msServer服务器socketstring m_name昵称sockaddr_in m_ServerAddr;服务器地址
21、3)方法设计构造函数 根据端口号和服务器IP初始化m_serverConnect。void Select()int Recv()void Send()int Select。封装底层原语,加入异常处理,使得外部调用节约优雅void Start()1)初始化套接字 InitClientSocket()2)连接服务器Connect。设置为非阻塞模式3)获取名字并发送至服务器InitName()RecvMsgThread()4)创建新线程并显示替他用户发言线程函数5)循环 SendMsg()6)关闭客户端CloseClient()InitName()1)提示输入昵称2)获取昵称3)合法性判断 判断重复
22、4)添加命令格式5)发送至服务器SendMsg()1)读取一行消息2)判断是否为命令IsCommand(string str)3)命令:处理命令DoCommand(string cmd)4)消息:处理消息DoMessage(string msg)DoMessage(string msg)1)发送消息Send()2)本地回显RecvMsgThread()1)初始化 fdSocket,将 m_sClient 加入2)创建 fdRead3)死循环,将m_sClient拷贝至fdRead4)调用 Select5)循环,并输出收到的消息Recv()4. SocketException 类该类负责记录SO
23、KCET昔误的代码以及错误信息。5.命令协议命令格式为/命令参数1参数21 .退出:/exit2 .获取在线用户列表:/getuser3 .私聊:/m UID信息4 .清屏:/clear5 .帮助:/help处理方式IsCommand(string str)负责解析是否为命令判断首字母是否为斜杠"/" str.at(0) = '/'ResoveCommand(string cmd, int & argc, string argv) 若是命令将命令解析为 argc,argvDoCommand(string cmd) 处理命令,调用具体的XXX命令处理函
24、数 DoCmdXXXX()6 .消息格式7 )公共消息超人君(127.0.0.1) UID:100 说:大家好!李四(127.0.0.1) UID:101 说:你好! !8 )私聊你悄悄地对 ABC UID : 100说:你好CDF UID:101悄悄地对你说:你好9 )服务器消息【系统消息】 XXXXXXXXXXXXXXXXXXXXXXXXXX XXXX10 程序内部提示System Infoxxxxxxxxxxxxxxxxxxxxxxxxx五、系统测试1 .服务器使用错误t- ,K>ChfltServer .amc t CMtSfiPort22 .客户端使用错误te : X>C
25、liatClient. exeUsa9e:ChatCLient _exe Ip Port3 .启动服务器c : ShatServcr.exe 6?89System In"成功绑定端口 :6789System Info I服务器在678g端口开始监听4 .启动客户端客户端出现欢迎信息以及昵称输入提示。kr : X>ChatCllent -exe 127.0.0.1 67®9IrSystem Inf nl连接围务器127aH.1:67H成功操作指南'H滕寓欢迎使用面易聊天室MM除瀛据嬲修其聊天会出暑爵退茨¥犁> > > > >
26、;在线用户信息USAGE: ISRGE: USAGE: USAGE: USAGE:/exit /list zn«M你的昵称 "时方UID稍息 /help清输入呢称,一 k .ij服务器出现连接提示System TnF型务蛰在67B9师口开始监System In£。1接受乘百127.BL0.1的连省5 .关闭客户端服务器出现断开连接提示W号七 e耕口r并 ex翦受t:>ChatServer . System Info成 CSysten Info月月 CSysten Info System InFo乘6 .启动服务器错误提示给出错误提示信息和提示代码c:>
27、ChatSe rue r.e xe 6789System E”oiJ无法绑定端口System Error-JError Code :100497 .公开聊天所有客户端以及服务器都会显示。H VSjRr C:i ndowsVivstem3H 首二 UtwiKjowiVyiLe'MmJVmd;i X>CIwitS<?rver. cxe 6789ISctzen SysteiR Svsten (Systert tSysten System绑定我 器在6? 泵首1 Info1乘直127M Imf oJ槎号率§12Inf d ) Info) InFolffi帝学指南,o退出咻
28、2遂耍在线用户K3展武服称据4>O0昭D懒信息咻命令指南i ”退出USACE力塞舱在绪用户USfiGE J 丁田小睨称USflCEOg聊USACE5需助信息USAGEBCI27-> UIDU.32asdasdsd 234<127,W.a.l>4sdaedasdl234<i27.e.B.l>a$d.ASd234<127.e.Ba>ASdASd234<127-M.H.15 asdAds234027.0.0.1> AfitlAtd.1234<127.0.B.1> asd1234<127.e.B.l7A£dAdU
29、IB:128UH>:12S【争统消息】E£件已修改为:由BCnuc<127.0T0,1J UID:1J2 说:雄与d*窜dS34门UtO: 128 说:asdasdAd12H<127.B.0.1> ULD:128 说t avd«sdl123<127.00-1> UIDI128 说雄*d覆器d2J4<127.».e.l> UtD: 128 说ii3i<ir?xa.a.i) uiD:i2t 说上心d。#出12l4(127.A.a.l> ULD;128 说.usd1234<127.a,a.l> II
30、DilW 说F«>d«sd半工工壬统酒鼠】既称己修西为"2“ftBC<12?.0.H.1> UIDE132 说:A£41A=das.d1234(12?J0.8,1> asdaadAsd1234<127.0.8.1> asd&ad1234<127.B.Ba> 4sdiusdU234<127.e.0.1>«s;<ladlti1234(l?7+aT0Hl> Afdasdl1234<127»B.8a> 4htd1234<127j0,0.1>
31、 5 d.jfid111ml28 说 UID;12S 说iU1DU29 脱rV】加12g说:WIB:12B 说rUII>:123 说:UIVH2H 说:8.私聊只有私聊的二人才能看到聊天信息,其他用户和服务器无法看到。dciaas1234(127.0,0.1> II1D:128 说: asdAsd1234<127.0.B,1> UID:128 说; asd1234(127.0W,1> UID:12B 说;Jack UID:136悄悄地对你说;你好!半:XJJX 地! 肖子ABC UID:132说:半:asdasdasd1234<127.0.B.1> U
32、IDS120 说: asddsd1234<127.0.0.1> UID:128 说: asdasd1234<127.0.B.1> 1113:1 辅说工 asdads1234C127.0.0.l> UID:128 说; asdasd1234<127.0.0.1> UID:128 说: asd1234C127.0.0-1) UID:128 说工 asdasdI 半=J4±£ < . U .«< £ / U1JLI>1U asdasdtSystem Iirf。1接受来自127.3.8.1的连接9.错误
33、的私聊私聊自己会得到一个错误提示【系统消息】昵称已修改为二MCKJACKC127.0.0.1> U1D:128 说;r失豪好、128快快快快看 用;工系统消息)昵称已修改为川口CKJACK<127.0,0,1> UID:128 说;t囊1息】您不能和自己私聊私聊不存在的用户也会得到一个错误提示霸髓饕嬲饿警AAA 12?.0.0.1 UID:128as das das d 127. ti,0.1 UI D: 132Jack 127.0.0.1 UID:136n 1在吗?充充系系u fi息息AA人U 为3/12已入.0翼2?11a&da&dasd 127.0.0.
34、1UID:132Jack 127-0.0.1 UID:136【系统消息】该用户不存在10.更名E3 管理员:C:windowsystem32cmd.exe *hBC327.®,g1IHD±136 说;看看我叫什么竞字文【票藐消息J昵标已修改为:dfghPFGH<127.H.0.1> UID:136 说;我r名字修改ri11.帮助*欢迎使用简 兼作指南;1)在控制台中直科|按回车即可发送公共聊天消息2)以斜杠(Q开头的消息将会当做命令处理命令指南;八退出2)获取在线用户昵称5帮助信息USAGE: /exitUSAGE: /listUSAGE: /name你的昵称U
35、SAGE:八it对方UID消息USAGE: /heIp12.非法指令非法指令会给出错误提示。一令令更中-11-息息- ,IV 7-统统系系雁起造俅用R存在.请使用/he Ip/he Ip群群小!?qT叩查查人Tv$13.非法的指令参数/name sss sss ssst系统箱照j怖令格我惜漠 M i 祢的破源14.连接服务器失败c:S>ChatClient »exe6789System Evm门连接服务器二触失败 等tem Eppnr JEpror Co de:B六、心得体会这次实现我深入研究了select模型的使用,完成了一个简易的聊天室。这次试验也使我在编程技巧方面也有了很
36、大的提高。七、完整代码Charserverd.cpp 服务器main函数文件#include "ChatServer.h"#include "SockException.h"#include "InitSock.h"#include <iostream>using namespace std;InitSock initSock;int main(int argc, char* argv)if (argc < 2)cout << "Usage:" << argv0 <&
37、lt; " Port " << endl;return 1;ChatServer charServer(atoi(argv1);trycharServer.Start();catch (SockException& e)cout << e.GetErrorInfo() << endl;cout << "System ErrorError Code:" << e.GetErrorCode() << endl; ChatServer.h服务器类头文件#ifndef CHAT_SE
38、RVER_H#define CHAT_SERVER_H#include <WinSock2.h>#include <string>#include <map>#include "ClientInfo.h" using namespace std;class ChatServerpublic:void Start();void End();ChatServer(int nPort);ChatServer(void);private:void InitFDSocket();void DoSelect();void DoFDRead(SOCKE
39、T sRead);void RecvNewConnect();string IPAddrToString(sockaddr_in sin);void AddClientToInfoMap(ClientInfo info);void RecvNewMessage();bool IsCommand(string str);void DoCommand(string cmd);void ResoveCommand(string cmd, int& argc, string argv);void DoCmdName(int argc, string argv);void DoCmdGetUse
40、rs(int argc, string argv);void DoMessage(string msg);void DoCmdPrivateMsg(int argc, string argv);string BuildMessage(string str, bool bisPublic);string BuildSystemMsg(string str);void DispatchMessage(string msg);void CloseConnect();string IntToString(int nNum);/=简单封装底层原语=void InitListenSocket();void
41、 Bind();void Listen();int Select。;int Recv(char msgBuff);void Send(string msg, SOCKET client);SOCKET Accept(sockaddr_in& sin);/=private:map<SOCKET, ClientInfo> m_clients;fd_set m_fdSocket;fd_set m_fdRead;SOCKET m_sListen;SOCKET m_sNowClient;int m_nPort;#endif CHAT_SERVER_HChatServer.cpp服务器
42、类#include <WinSock2.h>#include <iostream>#include "ChatServer.h"#include "SockException.h"#pragma comment(lib, "ws2_32.lib")using namespace std;#define MAX_BUFF_SIZE 500typedef map<SOCKET, ClientInfo>:iterator map_it;ChatServer:ChatServer(int nPort)thi
43、s->m_nPort = nPort;void ChatServer:Start()InitListenSocket();Bind();Listen。;InitFDSocket();while (true)DoSelect();void ChatServer:DoSelect()m_fdRead = m_fdSocket;int nRet = Select();if (nRet > 0)for (int i = 0; i < m_fdRead.fd_count; i+)DoFDRead(m_fdRead.fd_arrayi);void ChatServer:DoFDRead(
44、SOCKET sRead)if (sRead = m_sListen)RecvNewConnect();elsem_sNowClient = sRead;RecvNewMessage();void ChatServer:RecvNewConnect()if (m_fdSocket.fd_count >= FD_SETSIZE)cout << "System Info 接受连接达到上限,拒绝连接 "<< endl; return;sockaddr_in clientAddr;m_sNowClient = Accept(clientAddr);Cl
45、ientInfo clientInfo(clientAddr);cout << "System Info 接受来自"<< clientInfo.GetIp() << " 的连接"<< endl;FD_SET(m_sNowClient, &m_fdSocket);AddClientToInfoMap(clientInfo);string ChatServer:IPAddrToString(sockaddr_in sin)string str = inet_ntoa(sin.sin_addr);str.
46、append(":");char szFormat20;str.append(ltoa( ntohs(sin.sin_port),szFormat,10);return str;void ChatServer:AddClientToInfoMap(ClientInfo info)m_clientsm_sNowClient = info;void ChatServer:RecvNewMessage()char msgBuffMAX_BUFF_SIZE;int nRet = Recv(msgBuff);string msg(msgBuff);if (nRet <= 0)
47、return;if (IsCommand(msg)DoCommand(msg); else DoMessage(msg);void ChatServer:DoCommand(string cmd)int argc;string argv100;ResoveCommand(cmd, argc, argv); if (argv0 = "name") DoCmdName(argc, argv);else if (argv0 = "list") DoCmdGetUsers(argc, argv);else if(argv0 = "m") Do
48、CmdPrivateMsg(argc, argv); elseSend("【系统消息】命令不存在,请使用/help 命令查看命令帮助”, m_sNowClient);void ChatServer:ResoveCommand(string cmd, int& argc, string argv) int count = 0;for(int i = 1; i < cmd.size(); i+) char c = cmd.at(i); if (c !='') argvcount += c;elsecount +;argc = +count;void Chat
49、Server:DoCmdGetUsers(int argc, string argv)if (argc != 1)return;string msg;string online = IntToString(m_clients.size();msg.append("【系统消息】在线人数共 "+ online + " 人:");msg.append( "nr");map_it begin = m_clients.begin();map_it end = m_clients.end();for (; begin != end; +begin
50、)msg.append("t" + begin->second.GetName() + " " + begin->second.GetIp();msg.append(" UID:" + IntToString(int)begin->first);msg.append("nr");Send(msg, m_sNowClient);void ChatServer:DoCmdName(int argc, string argv口)if (argc != 2)Send("【系统消息】命令格式错误U
51、SAGE: /name你的昵称",m_sNowClient);return;string name = argv1;m_clientsm_sNowClient.SetName(name);Send("【系统消息】昵称已修改为 :"+ name, m_sNowClient);void ChatServer:DoMessage(string str)string msg = BuildMessage(str, true);cout << msg << endl;DispatchMessage(msg); /*string ChatServer二
52、BuildMssage(string str) Clientinfo info = m_clientsm_sNowClient;string name = info.GetName();string ip = info.GetIp();string msg = name; if (name != ip) msg.append("(" + ip + ")");char buff10;string id(itoa(int)m_sNowClient, buff, 10);msg.append(" UID:" + id);msg.append
53、("说:");msg.append("nr ");msg.append(str);return msg;*/string ChatServer二BuildSystemMsg(string str) string msg("【系统消息】");msg.append(str);return msg;string ChatServer二BuildMessage(string str, bool bisPublic)Clientinfo info = m_clientsm_sNowClient;string name = info.GetNam
54、e();string ip = info.Getip();string uid = IntToString(int)m_sNowClient);string msg(name);if (ip != name && bisPublic = true) msg.append("(" + ip + ")");msg.append("");msg.append("UiD:" + uid);msg.append("");bisPublic ? msg.append(" 说:&qu
55、ot;):msg.append("悄悄地对你说:");msg.append("nr");msg.append(""); msg.append(str); return msg;void ChatServer:DoCmdPrivateMsg(int argc, string argv) if (argc < 3)Send("【系统消息】命令格式错误 USAGE: /m目标UID私聊内容", m_sNowClient);return;SOCKET s = (SOCKET)atoi(argv1.c_str();ma
56、p_it it = m_clients.find(s);if (it = m_clients.end()Send("【系统消息】该用户不存在 ",m_sNowClient);return;if (it->first = m_sNowClient)Send("【系统消息】您不能和自己私聊 ",m_sNowClient);return;string name = it->second.GetName();string uid = IntToString(s);string toDest = BuildMessage("", fal
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 凉山2025上半年四川凉山昭觉县招聘中学教师80人笔试历年参考题库附带答案详解
- 2025年高三生物期末震古烁今测试卷
- 2025年大学建筑映射设计期末试卷
- 中央国家自然科学基金委员会选聘流动75人笔试历年参考题库附带答案详解
- 上海上海市公共卫生临床中心招聘61人笔试历年参考题库附带答案详解
- 2025广西河池市都安瑶族自治县公开招聘县属国有企业领导班子人员1人笔试历年参考题库附带答案详解
- 2025年大学建筑参量放大期末试卷
- 2025年中职护理(母婴护理实务)试题及答案
- 2025至2030全球及中国酒吧POS系统行业调研及市场前景预测评估报告
- 2025年大学一年级(人力资源管理)人力资源规划试题及答案
- 中国痤疮治疗指南
- 居民自建桩安装告知书回执
- 老同学聚会群主的讲话发言稿
- 国家开放大学最新《监督学》形考任务(1-4)试题解析和答案
- 天然气输气管线阴极保护施工方案
- 高血压问卷调查表
- GB/T 25156-2010橡胶塑料注射成型机通用技术条件
- GB/T 25085.3-2020道路车辆汽车电缆第3部分:交流30 V或直流60 V单芯铜导体电缆的尺寸和要求
- GB/T 242-2007金属管扩口试验方法
- GB/T 21776-2008粉末涂料及其涂层的检测标准指南
- 全新版尹定邦设计学概论1课件
评论
0/150
提交评论