WP7之文件传送利器(web service)

最近买了部windows phone 做开发用,机身内存16G。由于wp7不能直接通过usb数据线拷贝文件到手机上,只能通过网络形式进行文件传入。第三方提供了一些程序可实现网络传输,但没安装成功。最终自力更生,解决问题。

由于之前写过一个简单的Web Service,经简单修改WP7文件传送利器终于诞生。

接下来只要在wp7的浏览器中输入Ip和端口好就可以通过wifi快速下载了。

以下是源码:

1、定义Rec方法接收请求

 1 //socket监听
 2         void Rec(object o)
 3         {
 4             Socket s = o as Socket;
 5             if (s != null)
 6             {
 7                 while (socketState)
 8                 {
 9                     Socket send = s.Accept();
10                     MsgLog(send.RemoteEndPoint.ToString() + "浏览器已连接到服务器!");
11                     //处理响应
12                     DataConnection dc = new DataConnection(send, MsgLog, strFilePath);//所有的处理都在这个类中执行
13                 }
14             }
15         }

2、点击启动服务按钮,开始监听Http请求

 1 public Form1()
 2         {
 3             InitializeComponent();
 4             Control.CheckForIllegalCrossThreadCalls = false;
 5         }
 6         string strFilePath;
 7         bool socketState = true;
 8         private void btnStart_Click(object sender, EventArgs e)
 9         {
10             string txtStart = btnStart.Text;
11             string ipAddress = txtIp.Text;
12             string strPort = txtPort.Text;
13             if (string.IsNullOrEmpty(strFilePath))
14             {
15                 MessageBox.Show("请选择需要传送到手机上的文件");
16                 return;
17             }
18             if (string.IsNullOrEmpty(ipAddress))
19             {
20                 MessageBox.Show("请输入本机无线网络的IP地址");
21                 return;
22             }
23             if (string.IsNullOrEmpty(strPort))
24             {
25                 MessageBox.Show("请输入50000-65535之间的端口号");
26                 return;
27             }
28 
29             if (txtStart == "启动服务")
30             {
31                 btnStart.Text = "已启动";
32             }
33 
34             IPAddress ip = IPAddress.Parse(ipAddress);
35             IPEndPoint port = new IPEndPoint(ip, int.Parse(strPort));
36 
37             Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
38 
39             try
40             {
41                 socket.Bind(port);
42                 socket.Listen(10);
43                 MsgLog("服务器已启动");
44 
45                 //创建一个线程监听
46                 Thread th = new Thread(Rec);
47                 th.IsBackground = true;
48                 th.Start(socket);
49             }
50             catch (Exception ex)
51             {
52 
53                 MsgLog(ex.Message);
54             }
55         }


3、处理请求响应类

namespace WebServer
{
    delegate void DelShowMsg(string msg);
    class DataConnection
    {
        private Socket socket;

        private DelShowMsg delMsg;

        //构造函数,外部调用
        public DataConnection(Socket socket, DelShowMsg delMsg,string filePath)
        {
            this.socket = socket;
            this.delMsg = delMsg;

            string htmHead = Rec();//获取连接的html文件的头信息

            //处理头文件信息,需要获得方法和访问的路径
            Request req = new Request(htmHead);
            //Judge(req.Path);
            SendHtml(200, filePath);
        }

        //发送文件
        void SendHtml(int stateNum, string filePath)
        {
            using (FileStream fs = new FileStream(filePath, FileMode.Open))//读取网页文件
            {
                string fileName =Path.GetFileName(filePath);//获取文件名和扩展名
                byte[] bs = new byte[fs.Length];
                fs.Read(bs, 0, bs.Length); //将读取的文件流存储为byte数组
                try
                {
                    //生成相应头
                    Response rs = new Response(stateNum, bs.Length, fileName);
                    byte[] htmlHeads = rs.GetHeads(); //获取相应的html头部byte数组
                    socket.Send(htmlHeads);//发送http头
                    socket.Send(bs);//发送网页主体
                    
                    socket.Close();
                    delMsg("---------------------");
                    delMsg(Encoding.UTF8.GetString(htmlHeads));
                    delMsg("连接已关闭");
                    delMsg("---------------------");
                }
                catch (Exception ex)
                {

                    delMsg(ex.Message);
                }
                
            }
        
        }
        //获取http请求头
        string Rec()
        {
            string s = null;
            try
            {
                byte[] bs = new byte[1024 * 1024]; //定义byte数组接收读取的文件
                int n = socket.Receive(bs);  //将读取的文件存放在byte数组中
                s = Encoding.UTF8.GetString(bs, 0, n); //将指定长度的byte数组文件转换为string
                delMsg(s);//显示转换string的信息
            }
            catch (Exception ex)
            {

                delMsg(ex.Message);
            }
            return s;
        }
    }
}
原文地址:https://www.cnblogs.com/rdst/p/2633874.html