资源预览内容
第1页 / 共6页
第2页 / 共6页
第3页 / 共6页
第4页 / 共6页
第5页 / 共6页
第6页 / 共6页
亲,该文档总共6页全部预览完了,如果喜欢就下载吧!
资源描述
C#线程系列讲座(3):线程池和文件下载服务器 本文为原创,如需转载,请注明作者和出处,谢谢!本文为原创,如需转载,请注明作者和出处,谢谢!上一篇:上一篇:C#C#线程系列讲座线程系列讲座(2)(2):ThreadThread 类的应用类的应用如果设计一个服务器程序,每当处理用户请求时,都开始一个线程,将会在一定程序上消耗服务器的资源。为此,一个最好的解决方法就是在服务器启动之前,事先创建一些线程对象,然后,当处理客户端请求时,就从这些建好的线程中获得线程对象,并处理请求。保存这些线程对象的结构就叫做线程池。在 C#中可以通过 System.Threading.ThreadPool 类来实现,在默认情况下,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, out completionPortThreads);Console.WriteLine(workerThreads);Console.WriteLine(completionPortThreads); ThreadPool.QueueUserWorkItem(execute,“线程 1“); / 从线程池中得到一个线程,并运行 executeThreadPool.QueueUserWorkItem(execute, “线程 2“);ThreadPool.QueueUserWorkItem(execute, “线程 3“);Console.ReadLine();下图为上面代码的运行结果。要注意的是,使用 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 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(/, );String 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-streamrn“ +“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);Console.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 != null)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(String 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,因为,文件名要为英文名(不能有空格等特殊字符)。
收藏 下载该资源
网站客服QQ:2055934822
金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号