




已阅读5页,还剩19页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
。 计算机网络编程综合程序设计项目基于UDP协议的网络聊天程序设计 院(系、部): 信 息 工 程 学 院 姓 名: 班 级: 指导教师签名: 2011年 4 月 16 日北京目 录1 需求分析21.1 课程设计目的21.2 课程设计内容21.3 课程设计要求22 概要设计22.1 原理概述22.2功能模块调用流程设计33 详细设计43.1 流程图43.2 运行效果图53.3 主要源代码124 项目分析与总结174.1 遇到的问题和解决方法174.2 心得体会181、需求分析1.1课程设计目的开发一个专用于实现两台计算机之间即时通讯的软件,以方便两台计算机之间信息的交流。,在连接并通信时,尤其是近程的即时通讯,彻底的脱离了远程的服务器,避免了和远程服务器连接时过多的浪费网络资源。并且避免了服务器忙或与服务器无法连接时,浪费过多时间用于和服务器建立连接!因此,这个软件是极具适应性和实用性的即时通讯软件!本次课程设计的目的是学习基于UDP协议实现网络聊天程序,已达到学会面向无连接方式的程序设计方法,并理解网络编程中面向无连接的概念。1.2课程设计的内容用户数据报(UDP)是一个无连接协议,使用这种协议时,并不需要在两台计算机之间建立固定的连接,也就是说,通信双方没有服务器和客户机之分,它们之间进行的是对等通信,所以它的优势很明显,是现代通信不可或缺的一部分。所以,利用它的优势设计一个可以实现私聊和群聊的软件,实现两台计算机间的即时通讯。1.3 课程设计要求基于UDP协议实现一对一的聊天和一对多的聊天,提供友好的用户界面,便于用户进行操作。根据目前使用聊天程序的用户需求显示,用户对于聊天程序主要有以下几点要求:(1)聊天功能:可以实现实时接收和发送文字信息,并能支持公聊和私聊的方式。(2)用户功能:可以查看对方的开放信息,以及发送方的IP。2 概要设计2.1 原理概述采用UDP协议,通过服务器中转方式。因此,现在的IP侦探在你仅仅跟对方发送聊天消息的时候是无法获取到IP的。UDP 协议是不可靠协议,它只管发送,不管对方是否收到。但它的传输很高效,因为UDP协议排除了信息可靠传递机制,将安全和排序等功能移交给上层应用来完成,极大降低了执行时间,使速度得到了保证。例如,腾讯采用了上层协议来保证可靠传输:如果客户端使用UDP协议发出消息后,服务器收到该包,需要使用UDP协议发回一个应答包。如此来保证消息可以无遗漏传输。2.2功能模块调用流程设计:输入组播地址及段口号 开始初始化各个控件不可发送消息点击”开始聊天”按钮进行群聊判断是否进行群聊判断是否进行私聊输入IP地址及段口号点击”开始聊天”按钮进行私聊选择在线的私聊对象输入发送信息点击”发送”按钮在”接收发信息”框中显示聊天记录在”接收发信息”框中接收信息点击”清屏”按钮在”接收发信息”框中清除聊天记录点击”断开”按钮断开连接,不可发送信息点击”退出”按钮 结束NYYYYYYY退出程序NNNNN3 详细设计3.1流程图3.2界面设计与运行效果图:/界面设计/测试程序:初始化界面,组播地址为,端口号为6553。/测试程序:点击开始聊天,组播地址为,端口号为6553,开始群聊。/测试程序:界面显示群聊接收发消息。/测试程序:选择在线的私聊对象。/测试程序:输入对方IP地址,进行固定的私聊。/测试程序:不正确的情况端口号为空时。/测试程序:不正确的情况超出端口号范围时。/测试程序:不正确的情况端口号不合法时。/测试程序:以上情况均不能正确发送信息。/测试程序:不正确的情况组播地址非法时。/测试程序:不正确的情况发送的输入信息为空。/测试程序:点击清屏按钮接收发消息框清空。/电脑桌面程序栏中托盘图标3.3主要源代码:namespace chat public partial class chat : Form private static IPAddress m_GroupAddress; private bool isExit = false; private bool isShow = true; private bool m_bFlag; NotifyIcon myNotifyIcon; /委托类delegate delegate void AppendStringCallback(string text); AppendStringCallback appendStringCallback; private static UdpClient udpClient; private delegate void SetComboBoxCallback(string str); SetComboBoxCallback set_combobox_callback; public chat() InitializeComponent(); appendStringCallback = new AppendStringCallback(AppendString); set_combobox_callback = new SetComboBoxCallback(SetComboBox); m_GroupAddress = IPAddress.Parse(groupIPaddress.Text); try m_Icon1 = new Icon(20005.ico);/导入图标文件 m_Icon2 = new Icon(20060.ico); catch (Exception e) MessageBox.Show(Error + e.Message, Animate Tray - Error); m_bFlag = true; #region connect_and_stop private void btnChat_Click(object sender, EventArgs e) Thread receiveThread = new Thread(new ThreadStart(ReceiveData); /将线程设为后台运行 receiveThread.IsBackground = true; receiveThread.Start(); btnChat.Enabled = false; btnStop.Enabled = true; txbSend.Enabled = true; private void btnStop_Click(object sender, EventArgs e) /必须使用组播的地址范围内的地址 Terminate(); string HostName = Dns.GetHostName(); IPHostEntry MyEntry = Dns.GetHostByName(Dns.GetHostName(); IPAddress MyAddress = new IPAddress(MyEntry.AddressList0.Address); string address = MyAddress.ToString(); RemComboBox(address); udpClient.Close(); btnChat.Enabled = true; btnStop.Enabled = false; txbSend.Enabled = false; #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, address, str); catch /退出循环,结束线程 break; #endregion #region Send_events private void send(string IPadd, string Port) UdpClient myUdpClient = new UdpClient(); try IPAddress add = IPAddress.Parse(IPadd); int port = int.Parse(Port); IPEndPoint iep = new IPEndPoint(add, port); int retry = 0; while (true) try /将发送内容转换为字节数组 byte bytes = Encoding.UTF8.GetBytes(txbSend.Text); /向子网发送信息 myUdpClient.Send(bytes, bytes.Length, iep); AppendString(string.Format(发给0:1, iep, txbSend.Text); txbSend.Clear(); txbSend.Focus(); break; catch if (retry 3) retry+; continue; else MessageBox.Show(发送失败!); finally myUdpClient.Close(); catch private void btnSend_Click(object sender, EventArgs e) /检测发送框的信息是不是为空 if (txbSend.Text = ) MessageBox.Show(发送信息不能为空); return; IsValidPort(txtPort.Text); UdpClient myUdpClient = new UdpClient(); int index = cbxChoose.SelectedIndex; /组播 if (txtIPaddree.Text = & (index = 0 | index = -1) IsValidIP(groupIPaddress.Text); try IPAddress add = IPAddress.Parse(groupIPaddress.Text); int port = Convert.ToInt32(txtPort.Text); IPEndPoint iep = new IPEndPoint(add, port); /将发送内容转换为字节数组 byte bytes = Encoding.UTF8.GetBytes(txbSend.Text); /向子网发送信息 myUdpClient.Send(bytes, bytes.Length, iep); txbSend.Clear(); txbSend.Focus(); catch MessageBox.Show(发送失败); finally myUdpClient.Close(); else if (index = 0 | index = -1) IsValidIP(txtIPaddree.Text); send(txtIPaddree.Text, txtPort.Text); else send(cbxChoose.Text, txtPort.Text); #endregion #region IsValid_field 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 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(ponents); /指定托盘图标 myNotifyIcon.Icon = new Icon(1644.ico); /鼠标悬停在托盘图标上方时显示的内容 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(); 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; else notifyIcon1.Icon = m_Icon1; m_bFlag = true; #endregion #region control_delegate_method private void AppendString(string text) if (rtbMessage.InvokeRequired) rtbMessage.Invoke(appendStringCallback, text); else rtbMessage.AppendText(text + rn); 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.Itemsi.ToString() = this.cbxChoose.Itemsj.ToString() this.cbxChoose.Items.Remove(this.cbxChoose.Itemsj); /删除combobox里的地址 private void RemComboBox(string str) for (int i = 0; i this.cbxChoose.Items.Count; i+) if (this.cbxChoose.Itemsi.ToString() = str.ToString() this.cbxChoose.Items.Remove(str.ToString(); #endregion private void btnClear_Click(object sender, EventArgs e) rtbMessage.Clear(); private void
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2024年秋新北师大版数学一年级上册教学课件 第五单元 有趣的立体图形 第2课时 我说你做
- 永州消防知识培训课件培训班
- 永城消防知识培训课件
- 水质分析基础知识培训课件
- 混凝土施工期间噪音控制方案
- 设备设施验收与交付方案
- 混凝土工程施工阶段设备保障方案
- 智算中心数据隐私保护技术方案
- 水禽基础知识培训心得
- 中医儿科学湖北中医药高等专科学校07课件
- Q-GDW12562-2024超特高压盘形悬式瓷绝缘子用瓷件原材料、工艺和检验规则
- 一线员工执行力培训内容
- 幼教拍摄培训
- 船舶公司内务管理制度
- 护理职业素养课件
- 2025年云南中考数学试卷真题解读及复习备考指导
- 数字身份认证伦理-洞察及研究
- 七年级道德与法治第九课增强安全意识
- 乡村振兴培训试题及答案
- 冻伤急救护理
- 跨境电商代运营合同协议
评论
0/150
提交评论