最近买了部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; } } }