C#课程设计Word文件下载.docx
- 文档编号:4053002
- 上传时间:2023-05-02
- 格式:DOCX
- 页数:18
- 大小:244.31KB
C#课程设计Word文件下载.docx
《C#课程设计Word文件下载.docx》由会员分享,可在线阅读,更多相关《C#课程设计Word文件下载.docx(18页珍藏版)》请在冰点文库上搜索。
6网络编程实训小结16
1概述
课程设计时间:
2011.6.27—2011.6.29
课程设计题目:
课程设计要求:
1.能够熟练使用VS2008编程平台,熟悉平台菜单栏、工具栏和各种窗口的使用,掌握不同项目类型创建步骤和平台类库的使用。
2.熟练掌握C#创建程序功能所需的类、对象、接口等,并通过派生与继承实现代码重用,通过事件与消息实现对象之间的交互。
4.按照软件工程的要求的功能分析、程序设计、代码编写、程序调试、功能测试等步骤,完成群讨论工具的设计,并在基于UDPClient的基础上实现对发送消息进行加解密的功能。
2功能分析
2.1程序功能描述
参加讨论者可以利用UDPClient客户端程序加入讨论群组,并从服务器端获取加密密钥;
然后可以利用该密钥对其与服务器端的传送数据进行加密;
服务器会将每个参加讨论者发送过来的信息根据其与每个讨论者约定的密钥进行加密然后转发给对应的讨论者。
群组讨论工具客户程序采用了基于Windows的实现方案。
而服务器程序还是基于命令行的实现方式。
2.2程序功能分析
群组讨论工具的交互流程如图1所示。
其中申请加入群组的命令ADD和服务器接收请求并返回密钥的信息KEY都是以明文形式传递,在此基础上其他信息都是以密文形式传递。
并且服务器与每个连接客户都单独维持着一个密钥。
图1
3程序设计
通过程序的设计加深对课本知识的理解运用,在实际的设计中找到自己的不足,有助于我们今后的工作和生活,程序设计又是一个团体的工程,可以加深团队的合作意识,在相互帮助中扎实自己的知识体系。
3.1程序总体设计
在实现中,系统设计了六个类通过各个类的相互作用和交互进行通信,其中客户端程序包括主程序类UDPClient和窗口类w_main;
服务器程序主要包括服务器类UDPServer和客户端信息类ClientItem,UDPComm类包括SymCryptography和数据编解码类UDPComm。
3.2各模块功能设计
客户端程序包括主程序类UDPClient和窗口类w_main实现客户端的发送消息功能和界面的设计。
服务器程序类中ClientItem类中描述了客户端的IP地址和端口,以及加密实例信息。
UDPComm类中实现了客户端程序和服务器程序所需要的共性操作,包括对称加密类SymCryptography和数据编解码类UDPComm,其中UDPComm类中的编码函数EncodingASCII和解码函数DecodingASCII实现了重载,以支持数据加密和解密。
3.3主要数据设计
整个程序包含了3个项目,即基于命令行的服务器程序项目UDPServer、基于动态类库的公共程序类库项目UDPComm,以及基于Windows的客户端程序项目UDPClient。
运行时首先启动服务器程序,然后不同计算机上的参与者便可以通过客户端程序加入讨论组,利用该讨论工具进行讨论。
3.4主要函数设计
基于动态类库的公共程序类库项目UDPComm中的对称加密类SymCryptography中的初始向量采用固定值,而密钥则由程序随机生成,同时也可以通过属性Key进行设置。
以便确保在服务器和客户端程序中使用时两端的加密实例具有相同的初始向量和密钥。
客户端程序在申请加入讨论组时,采用明文方式发送请求,同时服务器也以明文形式将密钥发送给客户端程序。
在此基础上所有的传送信息都以密文形式传递。
同时,客户端程序中引入了多线程技术实现对服务器所发送过来数据的接收、处理和显示,以方便用户与操作窗口的交互。
服务器程序采用命令行方式运行,其中引入了C里恩他Item和ArrayList来实现对所有连接的客户程序的管理。
每个不同的客户程序对应不同的加密实例和密钥,以及加密实例都在服务器程序中保留,即不同的客户程序对应不同的加密实例和密钥。
4程序编码实现
4.1程序运行步骤
首先服务器端启动服务,等待客户端的接入连接,如果没有客户端的请求服务,则服务器一直处于运行状态,一直等待客户端的连接请求,直到有客户端发送连接请求,服务端接受客户端发送来的请求,客户端加入讨论组,从服务器获取加密密钥;
然后利用该密钥对其和服务器端的传送数据进行加密;
服务端将每个参加讨论者发送过来的信息根据与其讨论者约定的密钥进行加密然后转发给对应的讨论者。
讨论组建立,有讨论者离开的时候服务器给出提示。
4.2主要功能函数实现
公共程序类库UDPComm:
publicstringEncrypt(stringplainText)//加密
publicstringDecrypt(stringcryptoText)//解密
客户端程序:
privatevoidListener(
)//接收数据
privatevoidDisplayReceiveMessage(
)//显示接收数据
privatevoidbutton_Send_Click()//发送数据
privatevoidbutton_Add_Click()//加入讨论组
privatevoidbutton_Del_Click()//离开讨论组
服务器程序:
staticboolAddMember(IPEndPointrep)//加入组
staticvoidDelMember(IPEndPointrep)//离开组
staticvoidSendToMember(stringbuf)//组内转发数据
4.2.1UDPComm的实现
对称加密类SymCryptography初始向量为固定值,在系统中随机生成密钥,保证在服务器和客户端程序中使用是两端具有相同的初始向量和密钥;
加解密函数对消息进行加解密操作。
publicclassSymCryptography
{privatestringm_IV=string.Empty;
publicSymmetricAlgorithmm_CryptoService;
privatebyte[]GetLegalIV()//获取合法初始向量
{stringm_iv=m_IV.Substring(0,m_IV.Length);
intn=m_CryptoService.BlockSize/8;
if(m_iv.Length<
n)
{m_iv=m_iv.PadRight(n,'
0'
);
}
returnASCIIEncoding.ASCII.GetBytes(m_iv);
publicSymCryptography()
{m_CryptoService=newRijndaelManaged();
m_CryptoService.Mode=CipherMode.CBC;
m_CryptoService.GenerateKey();
//生成随机密钥
{byte[]plainByte=ASCIIEncoding.ASCII.GetBytes(plainText);
//初始化参数
m_CryptoService.IV=GetLegalIV();
//创建加密实例
ICryptoTransformcryptoTransform=m_CryptoService.CreateEncryptor();
//创建内存流
MemoryStreamms=newMemoryStream();
//创建加密流
CryptoStreamcs=newCryptoStream(ms,cryptoTransform,CryptoStreamMode.Write);
//通过加密流加密数据
cs.Write(plainByte,0,plainByte.Length);
cs.FlushFinalBlock();
//返回密文
byte[]cryptoByte=ms.ToArray();
returnConvert.ToBase64String(cryptoByte,0,cryptoByte.GetLength(0));
publicstringDecrypt(stringcryptoText)//解密
{byte[]cryptoByte=Convert.FromBase64String(cryptoText);
//设置初始向量
//创建解密对象
ICryptoTransformcryptoTransform=m_CryptoService.CreateDecryptor();
try
{//创建内存流
MemoryStreamms=newMemoryStream(cryptoByte,0,cryptoByte.Length);
//创建密文流
CryptoStreamcs=newCryptoStream(ms,cryptoTransform,CryptoStreamMode.Read);
//解密并返回明文
StreamReadersr=newStreamReader(cs);
returnsr.ReadToEnd();
}catch{returnnull;
publicstringKey
{get
{
returnConvert.ToBase64String(m_CryptoService.Key,0,m_CryptoService.Key.GetLength(0));
set{m_CryptoService.Key=Convert.FromBase64String(value);
4.2.2客户端程序
publicpartialclassw_main:
Form
{stringm_hostIP="
127.0.0.1"
;
intm_port=6666;
UdpClientm_client;
volatilebooldone=false;
byte[]data;
stringm_SendData,m_ReturnData;
IPEndPointm_EndPoint;
Threadm_ReceiveThread;
privateSymCryptographym_SymCrypt;
publicw_main()
{InitializeComponent();
//初始化
m_client=null;
textBox_HostIP.Text=m_hostIP;
textBox_Port.Text=m_port.ToString();
m_SymCrypt=null;
//接收数据
privatevoidListener()
{done=false;
{while(!
done)
{IPEndPointm_ep=null;
byte[]buf=m_client.Receive(refm_ep);
m_ReturnData=UDPComm.UDPComm.DecodingASCII(buf,m_SymCrypt);
this.Invoke(newMethodInvoker(DisplayReceiveMessage));
catch
{return;
m_client.Close();
//显示接收数据
privatevoidDisplayReceiveMessage()
{stringtime=DateTime.Now.ToString("
t"
textBox_Msg.Text=time+"
"
+m_ReturnData+"
\r\n"
+textBox_Msg.Text;
//发送数据
privatevoidbutton_Send_Click(objectsender,EventArgse)
{if(m_client!
=null)
{m_SendData=textBox_Input.Text;
data=UDPComm.UDPComm.EncodingASCII(m_SendData,m_SymCrypt);
m_client.Send(data,data.Length);
4.2.3服务器端程序
classClientItem
{privateIPEndPointm_IPEndPoint;
publicClientItem(){m_IPEndPoint=null;
}
publicIPEndPointEndPoint
{get{returnm_IPEndPoint;
set{m_IPEndPoint=value;
publicSymCryptographySymCrypt
{get{returnm_SymCrypt;
set{m_SymCrypt=value;
publicoverrideboolEquals(objectobj)
{return(m_IPEndPoint.ToString()==(objasClientItem).EndPoint.ToString());
staticvoidMain(string[]args)
intm_port=6666;
ArrayListmemberlist=newArrayList();
boolrt=true;
stringm_ReturnData;
//从命令行提取主机IP和端口
if(args.Length<
2)
{Console.WriteLine("
Usage:
UDPServerhostIPport"
else
{m_hostIP=args[0].ToString();
m_port=int.Parse(args[1].ToString());
rt=true;
if(rt)
{mblist=newArrayList();
//组成员列表
IPAddressm_ipA=IPAddress.Parse(m_hostIP);
m_EndPoint=newIPEndPoint(m_ipA,m_port);
m_server=newUdpClient(m_EndPoint);
Console.WriteLine("
ReadyforConnect......"
while(true)
{data=m_server.Receive(refm_EndPoint);
//接收数据
m_ReturnData=UDPComm.UDPComm.DecodingASCII(data);
if((m_ReturnData.IndexOf("
ADD"
)>
-1)&
&
(AddMember(m_EndPoint)))//加入组
{Console.WriteLine(m_EndPoint.ToString()+"
hasaddedtogroup!
"
else{
m_ReturnData=UDPComm.UDPComm.DecodingASCII(data,FindItem(m_EndPoint).SymCrypt);
if(m_ReturnData.IndexOf("
DEL"
-1)//退出组
{DelMember(m_EndPoint);
Console.WriteLine(m_EndPoint.ToString()+"
hasdeletedfromgroup!
{if(FindItem(m_EndPoint)!
=null)//转发数据
{SendToMember(m_ReturnData+"
["
+m_EndPoint.ToString()+"
]"
Console.WriteLine(m_ReturnData+"
+m_EndPoint.ToString()+"
+
hasresentedtomembers!
}m_server.Close();
4.3核心数据结构
图2
程序的三个类库即基于命令行的服务器程序项目UDPServer、基于动态类库的公共程序类库项目UDPComm,以及基于Windows的客户端程序项目UDPClient。
5程序测试
首先运行服务器程序图3
图3
然后启动客户端图4
图4
客户端加入服务器,服务器和客户端的显示:
图5和图6
图5
图6
客户端发送消息如图7
图7
服务器显示图8
图8
客户端离开讨论组
客户端显示图9
图9
服务器端图10
图10
客户端退出服务器等待新的客户请求,图11
图11
6网络编程实训小结
一周的时间就这样结束了,我们的课程设计这样结束了,在这次的课程设计中不仅检验了我所学习的知识,也培养了我如何去把握一件事情,如何去做一件事情,又如何完成一件事情。
在设计过程中,与同学相互合作、相互探讨,相互学习,相互监督。
学会了合作,学会了运筹帷幄,学会了宽容,学会了理解,也学会了做人与处世。
课程设计是我们课本知识综合应用的实践训练,是我们迈向社会,从事工作前一个必不少的过程。
“千里之行始于足下”,通过这次课程设计,我深深体会到这句千古名言的真正含义.我们今天认真的进行课程设计,学会脚踏实地迈开这一步,就是为明天能稳健地在社会大潮中奔跑打下坚实的基础。
的
通过这次专业课程设计提高了我C#编程的能力,通过实际例子的编程设计,增加我们的实际动手编程的能力,把平时学到的知识运用到实际的应用中去,从中发现了自己平时学习的不足和薄弱环节,从而加以弥补。
在此感谢我们的指导老师熊老师,由于个人水平原因,在设计终于到了不少的问题,经过熊老师的耐心讲解,我慢慢的改正了最初的错误,在老师的讲解中是我进一步加深了对课本知识的理解。
同时感谢对我帮助过的同学们,谢谢你们对我的帮助和支持,让我感受到同学的友谊。
在今后我一定会更加努力的学习,首先掌握好课本的基础知识,然后多多动手进行程序设计,只有这样才能够提高编程的能力。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- C# 课程设计