c#线程系列讲座(三):线程池和文件下载服务器(6页)

上传人:小** 文档编号:45056259 上传时间:2018-06-15 格式:DOC 页数:6 大小:74.01KB
返回 下载 相关 举报
c#线程系列讲座(三):线程池和文件下载服务器(6页)_第1页
第1页 / 共6页
c#线程系列讲座(三):线程池和文件下载服务器(6页)_第2页
第2页 / 共6页
c#线程系列讲座(三):线程池和文件下载服务器(6页)_第3页
第3页 / 共6页
c#线程系列讲座(三):线程池和文件下载服务器(6页)_第4页
第4页 / 共6页
c#线程系列讲座(三):线程池和文件下载服务器(6页)_第5页
第5页 / 共6页
点击查看更多>>
资源描述

《c#线程系列讲座(三):线程池和文件下载服务器(6页)》由会员分享,可在线阅读,更多相关《c#线程系列讲座(三):线程池和文件下载服务器(6页)(6页珍藏版)》请在金锄头文库上搜索。

1、C#线程系列讲座(3):线程池和文件下载服务器 本文为原创,如需转载,请注明作者和出处,谢谢!本文为原创,如需转载,请注明作者和出处,谢谢!上一篇:上一篇:C#C#线程系列讲座线程系列讲座(2)(2):ThreadThread 类的应用类的应用如果设计一个服务器程序,每当处理用户请求时,都开始一个线程,将会在一定程序上消耗服务器的资源。为此,一个最好的解决方法就是在服务器启动之前,事先创建一些线程对象,然后,当处理客户端请求时,就从这些建好的线程中获得线程对象,并处理请求。保存这些线程对象的结构就叫做线程池。在 C#中可以通过 System.Threading.ThreadPool 类来实现,

2、在默认情况下,ThreadPool 最大可建立 500 个工作线程和 1000 个 I/O 线程(根据机器 CPU 个数和.net framework 版本的不同,这些数据可能会有变化)。下面是一个用 C#从线程池获得线程的例子:private static void execute(object state)Console.WriteLine(state); static void Main(string args)int workerThreads;int completionPortThreads;ThreadPool.GetMaxThreads(out workerThreads, o

3、ut completionPortThreads);Console.WriteLine(workerThreads);Console.WriteLine(completionPortThreads); ThreadPool.QueueUserWorkItem(execute,“线程 1“); / 从线程池中得到一个线程,并运行 executeThreadPool.QueueUserWorkItem(execute, “线程 2“);ThreadPool.QueueUserWorkItem(execute, “线程 3“);Console.ReadLine();下图为上面代码的运行结果。要注意的

4、是,使用 ThreadPool 获得的线程都是后台线程。下面的程序是我设计的一个下载文件服务器的例子。这个例子从 ThreadPool 获得线程,并处理相应的客户端请求。using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Threading;using System.Net.Sockets;using System.IO;namespace MyThreadclass FileServerprivate String root;private Thread

5、listenerThread;private void worker(object state)TcpClient client = state as TcpClient;tryclient.ReceiveTimeout = 2000;Stream stream = client.GetStream();System.IO.StreamReader sr = new StreamReader(stream);String line = sr.ReadLine();String array = line.Split( );String path = array1.Replace(/, );Str

6、ing filename = root + path;if (File.Exists(filename) / 如果下载文件存在,开始下载这个文件FileStream fileStream = new FileStream(filename,FileMode.Open, FileAccess.Read, FileShare.Read);byte buffer = new byte8192; / 每次下载 8Kint count = 0;String responseHeader = “HTTP/1.1 200 OKrn“ +“Content-Type:application/octet-stre

7、amrn“ +“Content-Disposition:attachment;filename=“ +filename.Substring(filename.LastIndexOf(“) + 1) + “rnrn“;byte header = ASCIIEncoding.ASCII.GetBytes(responseHeader);stream.Write(header, 0, header.Length);while (count = fileStream.Read(buffer, 0, buffer.Count() 0)stream.Write(buffer, 0, count);Cons

8、ole.WriteLine(filename + “下载完成“);else / 文件不存在,输出提示信息String response = “HTTP/1.1 200 OKrnContent-Type:text/plain;charset=utf-8rnrn 文件不存在“;byte buffer = ASCIIEncoding.UTF8.GetBytes(response);stream.Write(buffer, 0, buffer.Length);catch (Exception e)Console.WriteLine(e.Message);finallyif (client != nul

9、l)client.Close();private void listener()TcpListener listener = new TcpListener(1234);listener.Start(); / 开始监听客户端请求TcpClient client = null;while (true)client = listener.AcceptTcpClient();client.ReceiveTimeout =2000;ThreadPool.QueueUserWorkItem(worker, client); / 从线程池中获得一个线程来处理客户端请求public FileServer(S

10、tring root)this.root= root; public void start()listenerThread = new Thread(listener);listenerThread.Start(); / 开始运行监听线程FileServer 类的使用方法:FileServer fs = new FileServer(“d:download”);fs.start(); / 端口为 1234如果 d:“download 目录中有一个叫 aa.exe 的文件,在浏览器中输入如下的地址可下载:http:/localhost:1234/aa.exe下图为下载对话框:要注意的是,本程序并没有处理含有中文和其他特殊字符(如空格)的 url,因为,文件名要为英文名(不能有空格等特殊字符)。

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

当前位置:首页 > 商业/管理/HR > 管理学资料

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