基于CS程序设计--p2p课程设计.doc_第1页
基于CS程序设计--p2p课程设计.doc_第2页
基于CS程序设计--p2p课程设计.doc_第3页
基于CS程序设计--p2p课程设计.doc_第4页
基于CS程序设计--p2p课程设计.doc_第5页
已阅读5页,还剩11页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

辽 宁 工 业 大 学 基于C/S程序设计 课程设计(论文)题目: 院(系): 专业班级: 学 号: 学生姓名: 指导教师: 教师职称: 助 教 起止时间: 2010.6.21至2010.7.3 课程设计(报告)任务及评语院(系):软件学院 教研室:软件教研窒学 号学生姓名 专业班级程序设计(报告)题目程序设计(报告)任务程序设计的任务与要求:(1)掌握C#语言编程的基础知识。(2)较熟练地编写C#语言应用程序。(3)了解C#语言的常用类、网络编程技巧、异常处理。(5)联系已学过的内容,巩固所学的理论,增强独立工作能力。(6)通过设计主要使学生有一个独立编写程序的过程,对理论学习及动手能力都有一个很大的提高。(7)通过本次设计,进一步培养学生热爱专业的思想,同时对本专业综合素质的提高起一个积极的推动作用。课程设计过程中,要严格遵守实践环节的时间安排,听从指导教师的指导。正确地完成上述内容,记录实习日记,规范完整地撰写出课程设计报告。指导教师评语及成绩成绩: 指导教师签字: 2010 年 7月 6 日辽 宁 工 业 大 学 课 程 设 计 说 明 书(论 文)目 录第1章 课程设计的目的与要求11.1 课程设计目的11.2 课程设计的实验环境11.3 课程设计的预备知识11.4 课程设计要求1第2章 课程设计内22.1系统功能22.2系统设计22.3 系统实现42.4程序的运行和测试9第3章 课程设计总结12参考资料13第1章 课程设计的目的与要求1.1 课程设计目的本课程设计是计算机科学与技术专业重要的实践性环节之一,是在学生学习完C#网络程序开发案例课程后进行的一次全面的综合练习。本课程设计的目的和任务: 1. 巩固和加深学生对C#语言课程的基本知识的理解和掌握 2. 掌握C#语言编程和程序调试的基本技能 3. 利用C#语言进行基本的网络软件设计4. 掌握书写程序设计说明文档的能力5. 提高运用C#语言解决实际问题的能力1.2 课程设计的实验环境硬件要求能运行Windows 2000/XP操作系统的微机系统。C#语言程序设计及相应的开发环境。1.3 课程设计的预备知识熟悉C#语言及.NET开发工具。1.4 课程设计要求1. 分析课程设计题目的要求2. 写出详细设计说明3. 编写程序代码,调试程序使其能正确运行4. 设计完成的软件要便于操作和使用5. 设计完成后提交课程设计报告第2章 课程设计内容2.1系统功能局域网聊天工具,是在局域网内部使用的,用户之间用来交流的一个工具,一般都具有文本聊天和文件传输功能。局域网聊天软件因其使用简单,系统资源消耗少等优点,成为各企事业单位等的局域网内广泛应用的软件之一。P2P是peer-to-peer的缩写,peer在英语里有“(地位、能力等)同等者”、“同事”和“伙伴”等意义。这样一来,P2P也就可以理解为“伙伴对伙伴”的意思,或称为对等联网。目前人们认为其在加强网络上人的交流、文件交换、分布计算等方面大有前途。 简单的说,P2P直接将人们联系起来,让人们通过互联网直接交互。P2P使得网络上的沟通变得容易、更直接共享和交互,真正地消除中间商。P2P就是人可以直接连接到其他用户的计算机、交换文件,而不是像过去那样连接到服务器去浏览与下载。P2P另一个重要特点是改变互联网现在的以大网站为中心的状态、重返“非中心化”,并把权力交还给用户。 P2P看起来似乎很新,但是正如B2C、B2B是将现实世界中很平常的东西移植到互联网上一样,P2P并不是什么新东西。在现实生活中我们每天都按照P2P模式面对面地或者通过电话交流和沟通。2.2系统设计开启服务器,文本聊天窗体加载成功后,将启动监听线程,服务器主要是负责监听局域网内的用户的连接请求。收到客户发起的连接请求后,若服务器处于空闲状态,弹出消息提示框,对请求进行处理,服务器可以选择接受或者拒绝客户端的连接。若同意连接,则返回给客户端同意信号,开启服务器的接收信息线程,并置消息发送事件为Enable。客户端收到服务器返回的同意信号后,也开启接收信息线程,并置消息发送事件为Enable。通信双方就可以进行文字聊天了。若服务器端拒绝客户端的连接,则关闭tcpconnect,并关闭网络流,继续执行监听。客户端得知服务器端关闭tcpconnect并关闭网络流之后,则释放本次socket和网络流。若已建立连接,当断开连接时,将向对方发送断开信号,然后将释放Socket和网络流,不影响到下一次连接的接入。文本聊天服务器工作流程如图2.1所示开始开启监听线程,监听端口建立连接,允许发送信息事件,启动接受信息线程同意接受请求?发送拒绝信号进行文字信息通信是否断开连接?发送断开信号,关闭文本聊天保存记录?保存聊天记录终止否是否是是否图2.1流程图 2.3 系统实现1、定义相关变量。2、集成主窗体创建后,创建一个tcpListener的对象,端口为5000,IP为任意。创建监听线程wait,wait线程执行的是waitconn()方法,启动监听线程。调用getMyIP()方法用于获取本地IP地址,并在连接建立时传给对方。当wait线程监听到远程用户的接入连接请求,弹出消息提示框,用户可以选择同意或拒绝接入请求。若同意,则创建接收信息线程th,并启动th。若用户拒绝远程接入请求,则关闭网络流nss,关闭tcps,并调用disconnect()重新初始化相关变量。3、接收信息时,尝试读取网络流,采用的是Unicode编码。读取到的消息如果不为断开连接信号,则在聊天记录框里面显示出来;若为断开信号,则执行disconnect()方法关闭当前连接。4、当无接入请求,则判断用户是否有尝试连接远程服务端事件。若有,创建TcpClient的对象tcpc,并尝试连接远程主机。5、连接建立后,用户单击“发送消息”按钮或者在输入文本框内按热键“Alt+S”或“Ctrl+Enter”,触发send_Click 事件。send_Click事件主要是将用户的输入通过Socket,采用网络流的形式传输给远程用户,编码采用Unicode,同时在聊天记录框里面显示出来。6、断开连接或关闭窗体,需要将Socket、网络流以及接收信息线程th进行关闭,重置各按钮的可用状态。若是关闭窗体,还需将wait线程关闭。代码如下:using System;using System.Collections.Generic;using System.ComponentModel;using System.Data;using System.Drawing;using System.Text;using System.Windows.Forms;using System.IO;using System.Net;using System.Net.Sockets;using System.Threading;namespace client public partial class client : Form private TcpClient myTcpclient=null; private Thread myThread=null; private NetworkStream myNst=null; private StreamReader mySread=null; private StreamWriter mySwrite=null; public client() InitializeComponent(); private void button2_Click(object sender, EventArgs e)/连接服务器按钮 toolStripStatusLabel1.Text = 请稍等.; myTcpclient = new TcpClient(); myTcpclient.Connect(IPAddress.Parse(textBox1.Text),int.Parse(textBox2.Text);/连接到远程服务端 myNst = myTcpclient.GetStream();/获取数据流 mySread = new StreamReader(myNst,System.Text.Encoding.Default);/创建流读实例 mySwrite = new StreamWriter(myNst,System.Text.Encoding.Default);/创建流写实例 myThread = new Thread(new ThreadStart(Reading);/创建新线程,用新创建的的线程启动Reading函数 myThread.Start(); MessageBox.Show(连接服务器成功!); private void Reading()/读取对方传送过来的网络数据并在richTextBox1中显示函数实现 toolStripStatusLabel1.Text = 正在聊天中.; while(true) for (int i = 0; i 4; i+)/经测试发现,mySread.ReadLine()在每一次聊天内容发送之后要读四次, /第一次便是头部标志信息行,第二次读取的是聊天内容, if (i = 0)/最后两次读取的内容为空,依此设计此显示和染色函数 string youmsg = rn + mySread.ReadLine(); richTextBox1.AppendText(youmsg); else string youmsg = rn + mySread.ReadLine(); richTextBox1.AppendText(youmsg); richTextBox1.Select(richTextBox1.TextLength - youmsg.Length+1, youmsg.Length); richTextBox1.SelectionColor = Color.Red; private void button1_Click(object sender, EventArgs e)/“发送”按钮 string mymsg = DateTime.Now.ToString() + + rn + richTextBox2.Text + rn + rn; /MessageBox.Show(mymsg.Length.ToString(); mySwrite.WriteLine(mymsg);/将自己聊天内容写入内存缓冲区 mySwrite.Flush();/将缓冲区内容发入网络流并清空 richTextBox2.Clear();/清空聊天内容编辑框 richTextBox1.AppendText(mymsg);/调用appendtext()函数,在聊天内容显示框显示自己聊天内容 richTextBox1.Select(richTextBox1.TextLength - mymsg.Length + 29, mymsg.Length);/选取自己的聊天内容 richTextBox1.SelectionColor = Color.Blue;/对自己聊天内容染色显示 /richTextBox1.SelectionColor = Color.FromArgb(myColor); private void button3_Click(object sender, EventArgs e)/断开连接按钮 DisConnect(); toolStripStatusLabel1.Text = 已停止聊天!; private void client_FormClosed(object sender, FormClosingEventArgs e)/窗口关闭事件 DisConnect(); private void DisConnect()/关闭聊天客户端善后程序实现 try if(myTcpclient!=null) myTcpclient.Close(); catch / toolStripStatusLabel1.Text = 断开连接出现错误!; if(myThread!=null) if(myThread.IsAlive) myThread.Abort(); private void button4_Click(object sender, EventArgs e)/“退出”按钮 Close(); private void client_Load(object sender, EventArgs e)/窗体加载初始化 toolStripStatusLabel1.Text = 还没开始聊天,请点击连接服务器按钮进行聊天!; richTextBox2.Focus(); private void button7_Click(object sender, EventArgs e) aboutus frmaboutus = new aboutus(this); frmaboutus.Show(); button7.Enabled = false; public void button7_Set(bool y) button7.Enabled = y; 2.4程序的运行和测试1.程序的运行主窗体是用来与用户交互用的,所以加载时间不能太长,响应速度应足够快,操作简单,设计人性化。所以,设计的时候,采用了一些通俗易懂的图片和按钮。文本输入框设计了Alt+S和Ctrl+Enter热键功能,方便用户快速的发送消息。当用户未输入文字而尝试发送时,弹出消息提示框,提示不能发送空信息,节省系统和网络资源。在集成P2P文本聊天时,最开始只能发起一次连接,通信双方断开连接而不退出程序时,再次连接就提示套接字已被占用异常。通过在disconnect时关闭当前的套接字,使之可以进行多次连接。主窗体界面运行如图2.2所示:图2.2 结果截图 2.系统测试测试的目的是为了发现功能是否达到,或者是否有更多的缺陷。当两个客户端在建立连接时,出现过程序假死异常。分析代码发现,线程调度出错,接收消息线程th还未创建和启动,监听线程wait已经被销毁了。修改代码,给出两种解决办法:1、在th线程的执行方法中,将wait线程销毁;在th线程销毁前,重新开启wait线程。2、wait线程不销毁。设置一bool类型变量isconnected,当已经建立连接后,isconnected=true,若再有其他的连接请求到达,自动将其他连接请求拒绝。连接断开后,重置isconnected=false,将处理移交给用户。我采用了第一种方法,调试之后,问题解决。在程序退出时,常常发生错误,异常退出,造成表面上看程序已结束,但却仍然驻留在内存中的现象。经过反复分析代码,最终确定问题出在程序退出处理流程上,通过修改和调试,问题解决。整个开发过程中,共历经200多次相互断开、连接测试,P2P文本聊天模块终于可以正常运行。借助在P2P文本聊天模块开发过程中积累的经验,较顺利的完成了P2P文件传输模块的开发。通过在总集成后的程序的各个流程中添加消息提示框显示程序内部数据、对象的状态,并插入断点进行单步跟踪发现各模块工作正常,数据也未发生异常现象。(1) 程序启动之后就能看到当前哪些机器在线,哪些可以与之进行对等通信。(2) 一旦有某个网内的机器上线了,要有即时通知,并能及时更新用户界面中的用户列表。(3)当双击某个列表项的时候,要弹出聊天对话框,可以在其中编辑要发送的聊天信息,并进行发送。(4)聊天界面要人性化,下面是发送框,上面有已有聊天记录,并借助滚动条看到当次所有的聊天记录。(5) 当有远程用户向本机发送文件的时候,要弹出一个消息提示框,提示本机用户,可以选择接收或者拒绝。(6) 当用户觉得有必要保存聊天记录时,提供一个简单的聊天记录保存功能。(7) 文件传输过程中,应该有当前传输状态提示,并能够对传输耗时等进行计算,作为当前网络状态的一种反馈。经检查,当用户输入无效操作时,系统总是能检测到无效操作,对用户进行相应的信息反馈,并合理的做出内部处理。当系统本身发生错误,比如网络初始化失败,绑定套接字失败,数据读取失败等,都会进行相对应的正确处理。例如当文件传输时,用户输入的文件不存在,而单击“开始”时,会有如图2.3所示的错误提示。图2.3用户操作出错信息提示示意图第3章 课程设计总结本系统的客户端程序采用P2P模式,每个用户即可以使服务的发起端,又可以使服务的接收端,所以必须在程序加载时对网络进行监听,监听聊天连接请求和文件传输连接请求,并能够对己方发起的事件进行处理,因而必须在此应用程序中使用多线程技术,耗时的任务可以在后台执行,而使应用程序窗口和控件保持响应。对于应用程序监听功能,多线程处理提供了用不同线程处理每个传入请求的能力。否则,在完全满足前一个请求之前,将无法处理其他的新的请求。在两个用户的通信过程中,任何一方断开连接之后,要像对方发送断开信号,而对方接收到传入的断开信号后,需断开Socket、NetStream 等,并重新开启监听线程,销毁接收消息线程。在开发的时候,经常因为线程的创建和销毁不当,而造成程序假死或者异常退出,却没有释放其占用的端口等资源。另外一个问题,程序退出的时候,未将线程处理好,同样造成资源占用,并且程序还驻留在内存中。通过查阅资料,掌握了C#中在winform关闭时需要进行的操作:1、接收线程需要关闭;2、监听需要关闭;3、Socket需要关闭;4、网络流需要关闭;5、如果是传文件的话还需要关闭流文件。在后来经过不断的修改和大量的测试,终于将这个bug解决了。通过对这个问题的解决,掌握了C#中的使用多线程时,线程的创建、相互协调和销毁等技术。当两个客户端在建立连接时,出现过程序假死异常。分析代码发现,线程调度出错,接收消息线程th还未创建和启动,监听线程wait已经被销毁了

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论