网络编程课设
软件学院
课程设计报告书
课程名称计算机网络编程
设计题目基于P2P的视频播放软件
专业班级网络13-1
学号 1320020126
姓名张绳昱
指导教师肖振久
2016年5月
目录
1 设计时间 (1)
2 设计目的 (1)
3设计任务 (1)
3.1基本任务 (1)
3.2基本要求 (1)
3.3功能要求 (1)
3.4编程要求 (1)
4 设计内容 (1)
4.1系统分析 (2)
4.2算法设计 (3)
4.2.2 视频文件下载算法设计 (3)
4.3界面设计 (4)
4.4运行与测试 (5)
4.4.1运行与测试 (6)
4.4.2分析 (8)
5 总结与展望 (11)
参考文献 (12)
课程设计成绩评定 (14)
图4.3-1 发布界面
2.搜索界面
在搜索栏中键入要搜索的资源名,点击搜索即可搜到当前局域网内已注册的该资源。点击下载按钮即可开始多线程下载。
图4.3-2 资源搜索界面
4.4运行与测试
4.4.1运行与测试
1.资源注册与发布
图4.4.1-1 本地资源显示
图4.4.1-2 资源发布成功
图4.4.1-2 系统显示当前网络云状态2.资源搜索
图 4.4.1-3 资源搜索面板
3.资源下载
图4.4.-4 资源下载成功
图 4.4-5 视频正常播放
4.4.2分析
本次的课程设计题目十分具有挑战性,虽然对于其基本原理我们已经在网络编程课上
有了一个比较清晰的把握,但在实际编程实现过程中遇到的各种想得到想不到的问题却是层出不穷。
本次编程实现时首先遇到的问题便是无法在VS2012环境中添加https://www.360docs.net/doc/fe2112737.html,.PeertoPeer 名字空间,后来经过一系列的搜索,才解决了这个问题,原来在VS中https://www.360docs.net/doc/fe2112737.html,下的引用并非全部都添加进了环境中,例如我们这一次所要使用的peertopeer名字空间,就需要手动去添加引用。
如图4.4.2-1所示
图 4.4.2-1
在项目资源管理器下的引用栏右键点击添加引用后将图中相应位置勾选后,我们方才可以使用相对应的功能。
其次我遇到的难题是,如何实时的去更新资源文件信息并使之实时显示在资源列表中。我使用了线程托管的办法去实现这一功能,创建一个线程去监控资源文件夹,一旦发现有新的资源立即加入列表栏中。核心代码如下:
部分代码展示
privatevoid Showresource()
{
while (!isExit0)
{
try
{
if (!Directory.Exists(path))
{
// Create the directory it does not exist.
Directory.CreateDirectory(path);
}
DirectoryInfo d = new DirectoryInfo(path);
FileInfo[] f = d.GetFiles();
resourceListViewItem.Clear();
foreach (FileInfo file in f)
{
//Add to Listview
ListViewItem item = new ListViewItem(https://www.360docs.net/doc/fe2112737.html,, file.Length.ToString());
resourceListViewItem.Add(item);
}
if (resourceListViewItem.Count == 0)
ClearItems(resourcelist);
else
RemoveItem(resourcelist, resourceListViewItem);
foreach (FileInfo file in f)
{
// List the files
ListViewItem item = new ListViewItem(https://www.360docs.net/doc/fe2112737.html,, file.Length.ToString());
AppendItem(item, resourcelist);//add to list
}
}
catch (Exception e)
{
MessageBox.Show(e.ToString());
}
}
}
接下来遇到的问题是多线程下载和访问文件过程中冲突问题,即线程的并发时资源争用的问题,一般来说我们可以使用传统的P,V操作来解决这一问题。考虑到c#编程,我使用更加简便的办法来解决这个问题,给代码块加上lock锁即可。
最大的问题就是视频的下载问题,一开始的时候,传输与接收总是不能很好的达到一致,经过一次又一次的实验修改,在文件传输过程中加入了大量的控制命令却依然无法实现想
要的功能。最终采用HTTP的多线程传输技术终于实现了视频文件的下载。
下载函数核心代码:
privatevoid HttpDownloadFile(string sourceUri, string targetFileName)
{
try
{
request = (HttpWebRequest)HttpWebRequest.Create(sourceUri);
request.Method = WebRequestMethods.Http.Head;
//取得目标文件的长度
HttpWebResponse response = (HttpWebResponse)request.GetResponse();
fileSize = response.ContentLength;
listBox1.Items.Add("文件大小: " + Math.Ceiling(fileSize / 1024.0f) + "KB");
response.Close();
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
//平均分配每个线程应该接收文件的大小
int downloadFileSize = (int)(fileSize / threadNumber);
HttpDownload[] d = new HttpDownload[threadNumber];
//初始化线程参数
for (int i = 0; i < threadNumber; i++)
{
d[i] = new HttpDownload(listBox1, i);
//每个线程接收文件的起始点
d[i].StartPosition = downloadFileSize * i;
if (i < threadNumber - 1)
{ d[i].FileSize = downloadFileSize;}
else
{
d[i].FileSize = (int)(fileSize - downloadFileSize * (i - 1));
}
d[i].IsFinish = false;
d[i].TargetFileName = Path.GetFileNameWithoutExtension(targetFileName) + ".$$" + i;
d[i].SourceUri = textBox1.Text;
}
}
5 总结与展望
这次课程设计中我选择的是P2P视频播放下载的课题,这是一个十分具有挑战性的课题。在程序中我实现了对等端资源发现,多线程传输下载等一系列的问题,但是仍然没有