您好,欢迎访问三七文档
C#FREECHAT聊天程序报告学院:信息学院班级:计算机113学号:1108010305姓名:卢庆乐目录一.作品设计概述:...................................................31.背景意义................................................................3二.作品分析设计.......................................................31.主要功能及分析.....................................................32.层次结构及各层通信协议.....................................4三.作品主要功能使用说明及演示.........................15四.结论......................................................................19五.参考文献..............................................................20一.作品设计概述:1.背景意义在网络信息技术高速发展的今天,传统的通信方式已然满足不了人们的需求。利用网络资源实现多机通信可以最大程度地满足人们对通信的需求,而不限制于距离地点。而如今流行着很多种网络聊天工具,如QQ,MSN等,都是集成的多功能聊天工具。所以,我利用这学期所学的关于C#的相关知识及网络资源,利用.NET平台实现了一个简单的聊天工具。具备了和聊天相关的基本功能,而开发这个软件的最大意义我认为在于巩固和加深对C#相关知识的学习。二.作品分析设计1.主要功能及分析(1)进行即时通信该功能主要指服务器和多个客户端进行即时通信。该功能实现的主要是文本传输。而对于发送即时消息的过程中,用户可以自定义设置发送文本的字体大小,清空输入框,保存聊天记录,导出聊天记录等功能。只要成功与服务器端连接,可以实现多个客户端与服务器进行即时通信。2.层次结构及各层通信协议层次结构可以大体分为服务器和客户端两大部分,下面对其进行具体说明:(1)服务器模块A.实现框图:B.主要类设计:(server的设计)调用到的主要类及方法属性:1.线程类:ThreadStarThread(线程同步)2.IP地址:IPAddressIPAddress.Parse()3.监听:TcpListenernetStream4.信息传送(流):ReadWriteObjectC.附上主要部分程序(利用多线程实现监听和建立通信连接部分)privatevoidSetServerIPAndPort(){FileStreamfs=newFileStream(ServerIPAndPort.txt,FileMode.Open);StreamReadersr=newStreamReader(fs);stringIPAndPort=sr.ReadLine();ServerIP=IPAndPort.Split(':')[0];//设定IPport=int.Parse(IPAndPort.Split(':')[1]);//设定端口sr.Close();fs.Close();}privatevoidbutton1_Click(objectsender,EventArgse){myListener=newTcpListener(IPAddress.Parse(ServerIP),port);myListener.Start();AddItemToListBox(string.Format(开始在{0}:{1}监听客户连接,ServerIP,port));//创建一个线程监客户端连接请求ThreadmyThread=newThread(ListenClientConnect);myThread.Start();button1.Enabled=false;button2.Enabled=true;}privatevoidListenClientConnect(){TcpClientnewClient=null;while(true){try{newClient=myListener.AcceptTcpClient();}catch{//当单击‘停止监听’或者退出此窗体时AcceptTcpClient()会产生异常//因此可以利用此异常退出循环break;}//每接收一个客户端连接,就创建一个对应的线程循环接收该客户端发来的信息;Useruser=newUser(newClient);ThreadthreadReceive=newThread(ReceiveData);threadReceive.Start(user);userList.Add(user);AddItemToListBox(string.Format([{0}]进入,newClient.Client.RemoteEndPoint));AddItemToListBox(string.Format(当前连接用户数:{0},userList.Count));}}///summary///处理接收的客户端信息////summary///paramname=userState客户端信息/paramprivatevoidReceiveData(objectuserState){Useruser=(User)userState;TcpClientclient=user.client;while(isNormalExit==false){stringreceiveString=null;try{//从网络流中读出字符串,此方法会自动判断字符串长度前缀receiveString=user.br.ReadString();}catch(Exception){if(isNormalExit==false){AddItemToListBox(string.Format(与[{0}]失去联系,已终止接收该用户信息,client.Client.RemoteEndPoint));RemoveUser(user);}break;}AddItemToListBox(string.Format(来自[{0}]:{1},user.client.Client.RemoteEndPoint,receiveString));string[]splitString=receiveString.Split(',');switch(splitString[0]){caseLogin:user.userName=splitString[1];SendToAllClient(user,receiveString);break;caseLogout:SendToAllClient(user,receiveString);RemoveUser(user);return;caseTalk:stringtalkString=receiveString.Substring(splitString[0].Length+splitString[1].Length+2);AddItemToListBox(string.Format({0}对{1}说:{2},user.userName,splitString[1],talkString));SendToClient(user,talk,+user.userName+,+talkString);foreach(UsertargetinuserList){if(target.userName==splitString[1]&&user.userName!=splitString[1]){SendToClient(target,talk,+user.userName+,+talkString);break;}}break;default:AddItemToListBox(什么意思啊:+receiveString);break;}}}///summary///发送消息给所有客户////summary///paramname=user指定发给哪个用户/param///paramname=message信息内容/paramprivatevoidSendToAllClient(Useruser,stringmessage){stringcommand=message.Split(',')[0].ToLower();if(command==login){//获取所有客户端在线信息到当前登录用户for(inti=0;iuserList.Count;i++){SendToClient(user,login,+userList[i].userName);}//把自己上线,发送给所有客户端for(inti=0;iuserList.Count;i++){if(user.userName!=userList[i].userName){SendToClient(userList[i],login,+user.userName);}}}elseif(command==logout){for(inti=0;iuserList.Count;i++){if(userList[i].userName!=user.userName){SendToClient(userList[i],message);}}}}///summary///发送message给user////summary///paramname=user指定发给哪个用户/param///paramname=message信息内容/paramprivatevoidSendToClient(Useruser,stringmessage){try{//将字符串写入网络流,此方法会自动附加字符串长度前缀user.bw.Write(message);user.bw.Flush();AddItemToListBox(string.Format(向[{0}]发送:{1},user.userName,message));}catch{AddItemToListBox(string.Format(向[{0}]发送信息失败,user.userName));}}///summary///移除用户////summary///paramname=user指定要移除的用户/paramprivatevoidRemoveUser(Useruser){userList.Remove(user);user.Close();AddItemToListBox(string.Format(当前连接用户数:{0},userList.Count));}privatedelegatevoidAddItemToListBoxDelegate(stringstr);///summary///在ListBox中追加状态信息////summary///paramname=str要追加的信息/paramprivatevoidAddItemToListBox(stringstr){if(listBox1.InvokeRequired){AddItemToListBoxDelegated=AddItemToListBox;listBox1.Invoke(d,str);}else{listBox1.Items.Add(str);listBox1.SelectedIndex=listBox1.Items.Count-1;listBox1.ClearSelected();}}privatevoidbutton2_Click(objectsender,EventArgse){AddItemToLi
本文标题:C#聊天软件解析
链接地址:https://www.777doc.com/doc-3699706 .html