ImageVerifierCode 换一换
格式:DOCX , 页数:24 ,大小:169.57KB ,
资源ID:11156785      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/11156785.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(C#聊天软件解析.docx)为本站会员(b****7)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

C#聊天软件解析.docx

1、C#聊天软件解析C# FREECHAT聊天程序报告学院: 信息学院 班级: 计算机113 学号: 1108010305 姓名: 卢庆乐 目录一 作品设计概述: 31.背景意义 3二 作品分析设计 31.主要功能及分析 32.层次结构及各层通信协议 4三 作品主要功能使用说明及演示 15四结论 19五参考文献 20一 作品设计概述:1.背景意义在网络信息技术高速发展的今天,传统的通信方式已然满足不了人们的需求。利用网络资源实现多机通信可以最大程度地满足人们对通信的需求,而不限制于距离地点。而如今流行着很多种网络聊天工具,如QQ,MSN等,都是集成的多功能聊天工具。所以,我利用这学期所学的关于C#

2、的相关知识及网络资源,利用.NET平台实现了一个简单的聊天工具。具备了和聊天相关的基本功能,而开发这个软件的最大意义我认为在于巩固和加深对C#相关知识的学习。二 作品分析设计1.主要功能及分析(1)进行即时通信该功能主要指服务器和多个客户端进行即时通信。该功能实现的主要是文本传输。而对于发送即时消息的过程中,用户可以自定义设置发送文本的字体大小,清空输入框,保存聊天记录,导出聊天记录等功能。只要成功与服务器端连接,可以实现多个客户端与服务器进行即时通信。2.层次结构及各层通信协议 层次结构可以大体分为服务器和客户端两大部分,下面对其进行具体说明:(1) 服务器模块A. 实现框图:B. 主要类设

3、计:(server的设计)调用到的主要类及方法属性:1.线程类: ThreadStar Thread (线程同步)2.IP地址: IPAddress IPAddress.Parse()3.监听: TcpListener netStream4.信息传送(流):ReadWriteObjectC. 附上主要部分程序(利用多线程实现监听和建立通信连接部分)private void SetServerIPAndPort() FileStream fs = new FileStream(ServerIPAndPort.txt, FileMode.Open); StreamReader sr = new S

4、treamReader(fs); string IPAndPort = sr.ReadLine(); ServerIP = IPAndPort.Split(:)0; /设定IP port = int.Parse(IPAndPort.Split(:)1); /设定端口 sr.Close(); fs.Close(); private void button1_Click(object sender, EventArgs e) myListener = new TcpListener(IPAddress.Parse(ServerIP), port); myListener.Start(); AddI

5、temToListBox(string.Format(开始在0:1监听客户连接, ServerIP, port); /创建一个线程监客户端连接请求 Thread myThread = new Thread(ListenClientConnect); myThread.Start(); button1.Enabled = false; button2.Enabled = true; private void ListenClientConnect() TcpClient newClient = null; while (true) try newClient = myListener.Accep

6、tTcpClient(); catch /当单击停止监听或者退出此窗体时 AcceptTcpClient() 会产生异常 /因此可以利用此异常退出循环 break; /每接收一个客户端连接,就创建一个对应的线程循环接收该客户端发来的信息; User user = new User(newClient); Thread threadReceive = new Thread(ReceiveData); threadReceive.Start(user); userList.Add(user); AddItemToListBox(string.Format(0进入, newClient.Client

7、.RemoteEndPoint); AddItemToListBox(string.Format(当前连接用户数:0, userList.Count); / / 处理接收的客户端信息 / / 客户端信息 private void ReceiveData(object userState) User user = (User)userState; TcpClient client = user.client; while (isNormalExit = false) string receiveString = null; try /从网络流中读出字符串,此方法会自动判断字符串长度前缀 rece

8、iveString = 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 = receiv

9、eString.Split(,); switch (splitString0) case Login: user.userName = splitString1; SendToAllClient(user, receiveString); break; case Logout: SendToAllClient(user, receiveString); RemoveUser(user); return; case Talk: string talkString = receiveString.Substring(splitString0.Length + splitString1.Length

10、 + 2); AddItemToListBox(string.Format(0对1说:2, user.userName, splitString1, talkString); SendToClient(user, talk, + user.userName + , + talkString); foreach (User target in userList) if (target.userName = splitString1 & user.userName != splitString1) SendToClient(target, talk, + user.userName + , + t

11、alkString); break; break; default: AddItemToListBox(什么意思啊: + receiveString); break; / / 发送消息给所有客户 / / 指定发给哪个用户 / 信息内容 private void SendToAllClient(User user, string message) string command = message.Split(,)0.ToLower(); if (command = login) /获取所有客户端在线信息到当前登录用户 for (int i = 0; i userList.Count; i+) S

12、endToClient(user, login, + userListi.userName); /把自己上线,发送给所有客户端 for (int i = 0; i userList.Count; i+) if (user.userName != userListi.userName) SendToClient(userListi, login, + user.userName); else if (command = logout) for (int i = 0; i userList.Count; i+) if (userListi.userName != user.userName) Se

13、ndToClient(userListi, message); / / 发送 message 给 user / / 指定发给哪个用户 / 信息内容 private void SendToClient(User user, string message) try /将字符串写入网络流,此方法会自动附加字符串长度前缀 user.bw.Write(message); user.bw.Flush(); AddItemToListBox(string.Format(向0发送:1, user.userName, message); catch AddItemToListBox(string.Format(

14、向0发送信息失败, user.userName); / / 移除用户 / / 指定要移除的用户 private void RemoveUser(User user) userList.Remove(user); user.Close(); AddItemToListBox(string.Format(当前连接用户数:0, userList.Count); private delegate void AddItemToListBoxDelegate(string str); / / 在ListBox中追加状态信息 / / 要追加的信息 private void AddItemToListBox(

15、string str) if (listBox1.InvokeRequired) AddItemToListBoxDelegate d = AddItemToListBox; listBox1.Invoke(d, str); else listBox1.Items.Add(str); listBox1.SelectedIndex = listBox1.Items.Count - 1; listBox1.ClearSelected(); private void button2_Click(object sender, EventArgs e) AddItemToListBox(开始停止服务,并

16、依次使用户退出!); isNormalExit = true; for (int i = userList.Count - 1; i = 0; i-) RemoveUser(userListi); /通过停止监听让 myListener.AcceptTcpClient() 产生异常退出监听线程 myListener.Stop(); button1.Enabled = true; button2.Enabled = false; (2) 客户端模块A.实现框图:B.主要类设计:(client类)调用的主要类及方法成员:1.启动连接: TcpClient2.IP地址: IPAddress IPAd

17、dress.Parse()3.监听: TcpListener netStream4.信息传送(流):ReadWriteObject5.委托:AsyncCallbackC. 附上主要部分程序(利用多线程实现监听和建立通信连接部分)private void SetServerIPAndPort() try FileStream fs = new FileStream(ServerIPAndPort.txt, FileMode.Open); StreamReader sr = new StreamReader(fs); string IPAndPort = sr.ReadLine(); Server

18、IP = IPAndPort.Split(:)0; /设定IP port = int.Parse(IPAndPort.Split(:)1); /设定端口 sr.Close(); fs.Close(); catch (Exception ex) MessageBox.Show(配置IP与端口失败,错误原因: + ex.Message); Application.Exit(); private void ReceiveData() string receiveString = null; while (isExit = false) try /从网络流中读出字符串 /此方法会自动判断字符串长度前缀

19、,并根据长度前缀读出字符串 receiveString = br.ReadString(); catch if (isExit = false) MessageBox.Show(与服务器失去连接); break; string splitString = receiveString.Split(,); string command = splitString0.ToLower(); switch (command) case login: /格式: login,用户名 AddOnline(splitString1); break; case logout: /格式: logout,用户名 Re

20、moveUserName(splitString1); break; case talk: /格式: talk,用户名,对话信息 AddTalkMessage(splitString1 + :rn); AddTalkMessage(receiveString.Substring(splitString0.Length + splitString1.Length + 2); break; default: AddTalkMessage(什么意思啊: + receiveString); break; Application.Exit(); / / 向服务端发送消息 / / private void

21、 SendMessage(string message) try /将字符串写入网络流,此方法会自动附加字符串长度前缀 bw.Write(message); bw.Flush(); catch AddTalkMessage(发送失败); private delegate void AddTalkMessageDelegate(string message); / / 在聊天对话框(txt_Message)中追加聊天信息 / / private void AddTalkMessage(string message) if (txt_Message.InvokeRequired) AddTalkM

22、essageDelegate d = new AddTalkMessageDelegate(AddTalkMessage); txt_Message.Invoke(d, new object message ); else txt_Message.AppendText(message + Environment.NewLine); txt_Message.ScrollToCaret(); private delegate void AddOnlineDelegate(string message); / / 在在线框(lst_Online)中添加其他客户端信息 / / private void

23、 AddOnline(string userName) if (lst_OnlineUser.InvokeRequired) AddOnlineDelegate d = new AddOnlineDelegate(AddOnline); lst_OnlineUser.Invoke(d, new object userName ); else lst_OnlineUser.Items.Add(userName); lst_OnlineUser.SelectedIndex = lst_OnlineUser.Items.Count - 1; lst_OnlineUser.ClearSelected(

24、); private delegate void RemoveUserNameDelegate(string userName); / / 在在线框(lst_Online)中移除不在线的客户端信息 / / private void RemoveUserName(string userName) if (lst_OnlineUser.InvokeRequired) RemoveUserNameDelegate d = new RemoveUserNameDelegate(RemoveUserName); lst_OnlineUser.Invoke(d, userName); else lst_O

25、nlineUser.Items.Remove(userName); lst_OnlineUser.SelectedIndex = lst_OnlineUser.Items.Count - 1; lst_OnlineUser.ClearSelected(); private void btn_Send_Click(object sender, EventArgs e) if (lst_OnlineUser.SelectedIndex != -1) SendMessage(Talk, + lst_OnlineUser.SelectedItem + , + txt_SendText.Text + r

26、n); txt_SendText.Clear(); else MessageBox.Show(请先在【当前在线】中选择一个对话着); private void txt_SendText_KeyPress(object sender, KeyPressEventArgs e) if (e.KeyChar = (char)Keys.Return) /触发【发送】按钮的单击事件 btn_Send.PerformClick(); private void btn_Login_Click(object sender, EventArgs e) btn_Login.Enabled = false; try /此处为方便演示,实际使用时要将Dns.GetHostName()改为服务器域名 /IPAddress ipAd = IPAddress.Parse(182.150.193.7); client = new TcpClient(); client.Connect(IPAddress.Parse(ServerIP), port); AddTalkMessage(连接成功); catch (Exception ex) AddTalkMessage(连接失败,原因: + ex.Message); btn_Login.Enabled = true; return;

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1