基于加密的tcpip网络聊天软件的设计与实现

上传人:xins****2008 文档编号:116426662 上传时间:2019-11-16 格式:DOC 页数:18 大小:98.09KB
返回 下载 相关 举报
基于加密的tcpip网络聊天软件的设计与实现_第1页
第1页 / 共18页
基于加密的tcpip网络聊天软件的设计与实现_第2页
第2页 / 共18页
基于加密的tcpip网络聊天软件的设计与实现_第3页
第3页 / 共18页
基于加密的tcpip网络聊天软件的设计与实现_第4页
第4页 / 共18页
基于加密的tcpip网络聊天软件的设计与实现_第5页
第5页 / 共18页
点击查看更多>>
资源描述

《基于加密的tcpip网络聊天软件的设计与实现》由会员分享,可在线阅读,更多相关《基于加密的tcpip网络聊天软件的设计与实现(18页珍藏版)》请在金锄头文库上搜索。

1、C#网络编程课程设计报告基于加密的TCP/IP网络聊天软件的设计与实现1绪 论本课题是一个基于加密的TCP/IP网络聊天软件的设计与实现。通过基于网络方面的编程设计,深入理解C#语言的基础理论知识,更深刻地领会使用C#实现网络编程的精髓!TCP/IP协议是当前广域网和局域网通用的网络协议,因此,基于TCP/IP的编程就格外重要。从应用上来说,现在直接利用C层次Socket API进行TCP/IP编程的人确实越来越少了,各种现成的框架(如ACE、Java、.NET FCL)和控件(如IP*Works)大大简化了TCP/IP编程的难度。但是,如果想要在这个领域达到融会贯通的地步,不打下坚实的基础是

2、不可想象的。正如Richard Stevens在TCP/IP Illustrated中所说,在网络编程领域,开发者所遇到的实际问题中,大约有90%都与开发者对于TCP/IP的理解相关。高层的框架和控件总结了TCP/IP的主要使用模式,并且进行了抽象和封装,这固然非常好,但是想要真正掌握TCP/IP网络编程的真谛,还得靠自己一不一个脚印从基础的开始。诚然C#语言的抽象、封装给我们使用带来方便,但是我觉得弄清楚其底层实现是非常重要的! 信息化的发展使得丰富的资源共享,而有的人就喜欢贪得无厌去窃取别人的隐私,所以加密技术也不断的发展。本课题是使用对称加密算法才加密数据。 信息时代计算机技术的发展给整

3、个社会的生活、工作方式带来了一次革命。因此网络编程设计是很有意义的!2 系统原理分析1、 服务器和客户端连接基于TCP/IP套接字编程三个步骤:服务器监听,客户端请求,连接确认。所谓服务器监听,是服务器端套接字并不定位具体的客户端套接字,而是处于等待连接的状态,实时监控网络状态。客户端请求,是指由客户端的套接字提出连接请求,要连接的目标是服务器端的套接字。为此,客户端的套接字必须首先描述它要连接的服务器的套接字,指出服务器端套接字的地址和端口号,然后就向服务器端套接字提出连接请求。连接确认,是指当服务器端套接字监听到或者说接收到客户端套接字的连接请求,它就响应客户端套接字的请求,建立一个新的线

4、程,把服务器端套接字的描述发给客户端,一旦客户端确认了此描述,连接就建立好了。而服务器端套接字继续处于监听状态,继续接收其他客户端套接字的连接请求。所以Socket接口的网络通讯原理:首先,服务端有一个进程(或多个进程)在指定的端口等待客户来连接,服务程序等待客户的连接信息,一旦连接上之后,就可以按设计的数据交换方法和格式进行数据传输。在使用TCP协议时,一般服务端进程先使用socket调用得到一个描述符,然后使用bind调用将一个名字与socket描述符连接起来,对于Internet域就是将Internet地址联编到socket。对于实例服务端用TcpListener监听,然后把连接的对象实

5、例化为一个TcpClient,调用TcpClient.GetStream()方法,返回网络流实例化为一个NetworlStream流,然后进行Send,Receive。2、 使用对称加密传输流程分析本程序使用DESCryptoServiceProvider类 实现DES对称加密运算。服务器端:首先从客户端接收共密钥,然后使用公共密钥加密未来使用的对称密钥,再将加密了的对称密钥发给客户端,最后才给客户端发送加密了的信息!客户端:首先建立和发送公共密钥给服务器,然后从服务器接受加密的对称密钥,再解密该对称密钥将它作为自己私有的不对称密钥,最后才接收信息!3 详细代码设计服务器端开发的详细代码:/添

6、加的命名空间引用(原始生成的略)using System.Net;using System.Net.Sockets;using System.Threading;using System.IO;using System.Security.Cryptography;namespace EncryptedTcpServer public partial class FormServer : Form /连接的用户 System.Collections.Generic.List userList = new List(); private delegate void SetListBoxCallba

7、ck(string str); private SetListBoxCallback setListBoxCallback; private delegate void SetComboBoxCallback(User user); private SetComboBoxCallback setComboBoxCallback; /使用的本机IP地址 IPAddress localAddress; /监听端口 private int port = 6788;/和书上一样 private TcpListener myListener; public FormServer() Initialize

8、Component(); listBoxStatus.HorizontalScrollbar = true; setListBoxCallback = new SetListBoxCallback(SetListBox); setComboBoxCallback = new SetComboBoxCallback(AddComboBoxitem); IPAddress addrIP = Dns.GetHostAddresses(Dns.GetHostName(); localAddress = addrIP0; buttonStop.Enabled = false; /开始监听 private

9、 void buttonStart_Click(object sender, EventArgs e) myListener = new TcpListener(localAddress, port); myListener.Start(); SetListBox(string.Format(开始在0:1监听客户连接, localAddress, port); /创建一个线程监听客户端连接请求 ThreadStart ts = new ThreadStart(ListenClientConnect); Thread myThread = new Thread(ts); myThread.Sta

10、rt(); buttonStart.Enabled = false; buttonStop.Enabled = true; /接收客户端连接的线程 private void ListenClientConnect() while (true) TcpClient newClient = null; try /等待用户进入 newClient = myListener.AcceptTcpClient(); catch /当单击“停止监听”或者退出此窗体时AcceptTcpClient()会产生异常,因此可以利用此异常退出循环 break; /每接受一个客户端连接,就创建一个对应的线程循环接收该客

11、户端发来的信息 ParameterizedThreadStart pts = new ParameterizedThreadStart(ReceiveData); Thread threadReceive = new Thread(pts); User user = new User(newClient); threadReceive.Start(user); userList.Add(user); AddComboBoxitem(user); SetListBox(string.Format(0进入, newClient.Client.RemoteEndPoint); SetListBox(

12、string.Format(当前连接用户数:0, userList.Count); /接收、处理客户端信息的线程,每客户1个线程,参数用于区分是哪个客户 private void ReceiveData(object obj) User user = (User)obj; TcpClient client = user.client; /是否正常退出接收线程 bool normalExit = false; /用于控制是否退出循环 bool exitWhile = false; while (exitWhile = false) /保存接收的命令字符串 string receiveString = null; /每条命令均带有一个参数,值为true或者false,表示是否有紧跟的字节数组 string splitString = null; byte receiveBytes = null; try /从网络流中读出命令字符串 /此方法会自动判断字符串长度前缀,并根据长

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 大杂烩/其它

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号