博客园  :: 首页  :: 新随笔  :: 联系 :: 管理

socket传文件

Posted on 2008-11-06 22:05  codingsilence  阅读(175)  评论(0编辑  收藏  举报
  1.        private string path = "F://SmartMovie.EXE";    //要发送的文件
  2.                       private Socket s;                              
  3.          private void listen()
  4.         {
  5.             string ip = "127.0.0.1";   //远程IP 这里定义为自己的机器
  6.             IPAddress[] ih = Dns.GetHostAddresses(ip);       //获得IP列表
  7.             IPAddress newip = ih[0];      //获取IP地址            
  8.             int port = 6789;              //定义端口
  9.             IPEndPoint Conncet = new IPEndPoint(newip, port);     //构造结点
  10.             s = new Socket(AddressFamily.InterNetwork, SocketType.Stream,  ProtocolType.Tcp);                   //初始化socket 
  11.      try
  12.         {                                  
  13.             s.Connect(Conncet);      //连接远程服务器
  14.             if (s.Connected)         //如果连接成功 s.Connected 则为true 否则为 false
  15.             {
  16.                 Console.WriteLine("连接成功");
  17.                 Thread t = new Thread(new ThreadStart(set)); //创建进程
  18.                 t.Start();                             //开始进程
  19.                 Console.WriteLine("发送完毕")      
  20.             }
  21.                }
  22.                 catch(NullReferenceException e)
  23.             {
  24.               Console.WriteLine("{0}",e);
  25.             }
  26.             private void set()                       //创建set函数
  27.         {
  28.             Console.WriteLine("开始发送数据");
  29.             byte[] b = new byte[10000000];            //创建文件缓冲区,这里可以认为文件的最大值
  30.             FileStream file = File.Open(path, FileMode.Open,FileAccess.Read);   //创建文件流
  31.             int start = 0;
  32.             int end = (int)file.Length;               //获取文件长度文件传送如果有需要超过int的范围估计就要改写FileStream类了
  33.       try
  34.           {
  35.             while (end != 0)
  36.             {
  37.                 int count = file.Read(b, start, end);      //把数据写进流
  38.                 start += count;
  39.                 end -= count;
  40.             }
  41.             while (start != 0)
  42.             {
  43.                 int n = s.Send(b, end, start, SocketFlags.None);  //用Socket的Send方法发送流
  44.                 end += n;
  45.                 start -= n;
  46.             }
  47.         
  48.             file.Close();     //关闭文件流
  49.             s.Close();        //关闭Socket
  50.           }  
  51.       catch (NullReferenceException e)
  52.             {
  53.                 Console.WriteLine("{0}", e);
  54.             }             
  55.         }   
  56. 这样文件发送的模型就实现了
  57.     接下去实现文件的接收,首先要确定对方发送文件的长度,其实上面的那段还要加入发送文件长度的功能,实现很简单,就是发送int变量end ,然后要求接收代码返回一个Boolean确定是否发送,这里为了更简明的说清楚原理并没有实现
  58.              private void get()
  59.         {
  60.             string path = "G://da.exe";  //接收的文件
  61.             FileStream file = new FileStream(path, FileMode.OpenOrCreate, FileAccess.Write); //写入文件流
  62.             TcpListener listen = new TcpListener(6789);  //监听端口
  63.             Socket s1 = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);  //定义Socket并初始化
  64.             try
  65.             {
  66.              listen.Start();        //开始监听
  67.             s1 = listen.AcceptSocket();            //获取Socket连接
  68.             byte[] data = new byte[10000000];      //定义缓冲区
  69.             int longer = data.Length;               
  70.             int start = 0;                 
  71.             int mid = 0;
  72.             if (s1.Connected)             //确定连接
  73.             {
  74.                 Console.WriteLine("连接成功");
  75.                 int count = s1.Receive(data, start, longer, SocketFlags.None);  //把接收到的byte存入缓冲区
  76.                 mid += count;
  77.                 longer -= mid;
  78.                 while (count != 0)
  79.                 {
  80.                     count = s1.Receive(data, mid, longer, SocketFlags.None);
  81.                     mid += count;
  82.                     longer -= mid;
  83.                 }
  84.                 file.Write(data, 0, 1214134); //写入文件,1214134为文件大小,可以用socket发送获得,代码前面已经说明。
  85.                 s1.Close();
  86.                 file.Close();
  87.             }
  88.             }
  89.                 catch(NullReferenceException e)
  90.             {
  91.                     Console.WriteLine("{0}",e);
  92.             }
  93.           }