课程设计报告基于udp协议的网络聊天程序设计.doc

上传人:wj 文档编号:1301291 上传时间:2023-04-30 格式:DOC 页数:22 大小:525KB
下载 相关 举报
课程设计报告基于udp协议的网络聊天程序设计.doc_第1页
第1页 / 共22页
课程设计报告基于udp协议的网络聊天程序设计.doc_第2页
第2页 / 共22页
课程设计报告基于udp协议的网络聊天程序设计.doc_第3页
第3页 / 共22页
课程设计报告基于udp协议的网络聊天程序设计.doc_第4页
第4页 / 共22页
课程设计报告基于udp协议的网络聊天程序设计.doc_第5页
第5页 / 共22页
课程设计报告基于udp协议的网络聊天程序设计.doc_第6页
第6页 / 共22页
课程设计报告基于udp协议的网络聊天程序设计.doc_第7页
第7页 / 共22页
课程设计报告基于udp协议的网络聊天程序设计.doc_第8页
第8页 / 共22页
课程设计报告基于udp协议的网络聊天程序设计.doc_第9页
第9页 / 共22页
课程设计报告基于udp协议的网络聊天程序设计.doc_第10页
第10页 / 共22页
课程设计报告基于udp协议的网络聊天程序设计.doc_第11页
第11页 / 共22页
课程设计报告基于udp协议的网络聊天程序设计.doc_第12页
第12页 / 共22页
课程设计报告基于udp协议的网络聊天程序设计.doc_第13页
第13页 / 共22页
课程设计报告基于udp协议的网络聊天程序设计.doc_第14页
第14页 / 共22页
课程设计报告基于udp协议的网络聊天程序设计.doc_第15页
第15页 / 共22页
课程设计报告基于udp协议的网络聊天程序设计.doc_第16页
第16页 / 共22页
课程设计报告基于udp协议的网络聊天程序设计.doc_第17页
第17页 / 共22页
课程设计报告基于udp协议的网络聊天程序设计.doc_第18页
第18页 / 共22页
课程设计报告基于udp协议的网络聊天程序设计.doc_第19页
第19页 / 共22页
课程设计报告基于udp协议的网络聊天程序设计.doc_第20页
第20页 / 共22页
亲,该文档总共22页,到这儿已超出免费预览范围,如果喜欢就下载吧!
下载资源
资源描述

课程设计报告基于udp协议的网络聊天程序设计.doc

《课程设计报告基于udp协议的网络聊天程序设计.doc》由会员分享,可在线阅读,更多相关《课程设计报告基于udp协议的网络聊天程序设计.doc(22页珍藏版)》请在冰点文库上搜索。

课程设计报告基于udp协议的网络聊天程序设计.doc

《计算机网络编程》综合程序设计项目

基于UDP协议的网络聊天程序设计

院(系、部):

信息工程学院

姓名:

班级:

指导教师签名:

2011年4月16日·北京

目录

1需求分析 2

1.1课程设计目的 2

1.2课程设计内容 2

1.3课程设计要求 2

2概要设计 2

2.1原理概述 2

2.2功能模块调用流程设计 3

3详细设计 4

3.1流程图 4

3.2运行效果图 5

3.3主要源代码 12

4项目分析与总结 17

4.1遇到的问题和解决方法 17

4.2心得体会 18

1、需求分析

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地址及段口号

点击”开始聊天”按钮

进行私聊

选择在线的私聊对象

输入发送信息

点击”发送”按钮

在”接收发信息”框中显示聊天记录

在”接收发信息”框中接收信息

点击”清屏”按钮

在”接收发信息”框中清除聊天记录

点击”断开”按钮

断开连接,不可发送信息

点击”退出”按钮

结束

N

Y

Y

Y

Y

Y

Y

Y

退出程序

N

N

N

N

N

3详细设计

3.1流程图

3.2界面设计与运行效果图:

//界面设计

//测试程序:

初始化界面,组播地址为224.100.0.1,端口号为6553。

//测试程序:

点击开始聊天,组播地址为224.100.0.1,端口号为6553,开始群聊。

//测试程序:

界面显示群聊接收发消息。

//测试程序:

选择在线的私聊对象。

//测试程序:

输入对方IP地址,进行固定的私聊。

//测试程序:

不正确的情况——端口号为空时。

//测试程序:

不正确的情况——超出端口号范围时。

//测试程序:

不正确的情况——端口号不合法时。

//测试程序:

以上情况均不能正确发送信息。

//测试程序:

不正确的情况——组播地址非法时。

//测试程序:

不正确的情况——发送的输入信息为空。

//测试程序:

点击清屏按钮接收发消息框清空。

//电脑桌面程序栏中托盘图标

3.3主要源代码:

namespacechat

{

publicpartialclasschat:

Form

{

privatestaticIPAddressm_GroupAddress;

privateboolisExit=false;

privateboolisShow=true;

privateboolm_bFlag;

NotifyIconmyNotifyIcon;

//委托类delegate

delegatevoidAppendStringCallback(stringtext);

AppendStringCallbackappendStringCallback;

privatestaticUdpClientudpClient;

privatedelegatevoidSetComboBoxCallback(stringstr);

SetComboBoxCallbackset_combobox_callback;

publicchat()

{

InitializeComponent();

appendStringCallback=newAppendStringCallback(AppendString);

set_combobox_callback=newSetComboBoxCallback(SetComboBox);

m_GroupAddress=IPAddress.Parse(groupIPaddress.Text);

try

{

m_Icon1=newIcon("20005.ico");//导入图标文件

m_Icon2=newIcon("20060.ico");

}

catch(Exceptione)

{

MessageBox.Show("Error"+e.Message,"AnimateTray-Error");

}

m_bFlag=true;

}

#regionconnect_and_stop

privatevoidbtnChat_Click(objectsender,EventArgse)

{

ThreadreceiveThread=newThread(newThreadStart(ReceiveData));

//将线程设为后台运行

receiveThread.IsBackground=true;

receiveThread.Start();

btnChat.Enabled=false;

btnStop.Enabled=true;

txbSend.Enabled=true;

}

privatevoidbtnStop_Click(objectsender,EventArgse)

{

//必须使用组播的地址范围内的地址

Terminate();

stringHostName=Dns.GetHostName();

IPHostEntryMyEntry=Dns.GetHostByName(Dns.GetHostName());

IPAddressMyAddress=newIPAddress(MyEntry.AddressList[0].Address);

stringaddress=MyAddress.ToString();

RemComboBox(address);

udpClient.Close();

btnChat.Enabled=true;

btnStop.Enabled=false;

txbSend.Enabled=false;

}

#endregion

#regionReceive_events

privatevoidReceiveData()

{

IsValidPort(txtPort.Text);

try

{

//使用的接收端口号

intport=int.Parse(txtPort.Text);

udpClient=newUdpClient(port);

//必须使用组播的地址范围内的地址

IPAddressgroupIP=IPAddress.Parse(groupIPaddress.Text);

//50为生存时间,超时被丢弃

udpClient.JoinMulticastGroup(groupIP,50);

}

catch

{

}

IPEndPointremote=null;

//接收从远程主机发送过来的信息

while(true)

{

try

{

//关闭udpClient时此句会产生异常

byte[]bytes=udpClient.Receive(refremote);

stringaddress=remote.ToString();

intatIndex=address.IndexOf(":

");

stringmemberaddress=address.Substring(0,atIndex);

//执行委托

cbxChoose.Invoke(set_combobox_callback,memberaddress);

stringstr=Encoding.UTF8.GetString(bytes,0,bytes.Length);

AppendString(string.Format("来自{0}:

{1}",address,str));

}

catch

{

//退出循环,结束线程

break;

}

}

}

#endregion

#regionSend_events

privatevoidsend(stringIPadd,stringPort)

{

UdpClientmyUdpClient=newUdpClient();

try

{

IPAddressadd=IPAddress.Parse(IPadd);

intport=int.Parse(Port);

IPEndPointiep=newIPEndPoint(add,port);

intretry=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

{

}

}

privatevoidbtnSend_Click(objectsender,EventArgse)

{

//检测发送框的信息是不是为空

if(txbSend.Text=="")

{

MessageBox.Show("发送信息不能为空");

return;

}

IsValidPort(txtPort.Text);

UdpClientmyUdpClient=newUdpClient();

intindex=cbxChoose.SelectedIndex;

//组播

if(txtIPaddree.Text==""&&(index==0||index==-1))

{

IsValidIP(groupIPaddress.Text);

try

{

IPAddressadd=IPAddress.Parse(groupIPaddress.Text);

intport=Convert.ToInt32(txtPort.Text);

IPEndPointiep=newIPEndPoint(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();

}

}

elseif(index==0||index==-1)

{

IsValidIP(txtIPaddree.Text);

send(txtIPaddree.Text,txtPort.Text);

}

else

{

send(cbxChoose.Text,txtPort.Text);

}

}

#endregion

#regionIsValid_field

publicvoidTerminate()

{

udpClient.DropMulticastGroup(m_GroupAddress);

}

//检测输入对方IP有没有效

privatevoidIsValidIP(stringstr)

{

IPAddressip;

if(!

IPAddress.TryParse(str,outip))

{

MessageBox.Show("非法IP地址");

return;

}

}

//检测端口号有没有效

privatevoidIsValidPort(stringstr)

{

intisPort;

if(txtPort.Text=="")

{

MessageBox.Show("端口号不能为空");

return;

}

elseif(!

int.TryParse(str,outisPort))

{

MessageBox.Show("端口号无效");

return;

}

elseif((isPort<1024)||(isPort>65335))

{

Me

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 求职职场 > 简历

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2