您的位置:首页 > 编程语言 > Java开发

(转)socket传文件

2015-07-23 12:11 549 查看


socket传文件.原文地址:http://www.cnblogs.com/wsy6634/archive/2008/10/13/1310294.html

       private string path = "F:\\SmartMovie.EXE";    //要发送的文件
                      private Socket s;                             
         private void listen()

        {

            string ip = "127.0.0.1";   //远程IP 这里定义为自己的机器

            IPAddress[] ih = Dns.GetHostAddresses(ip);       //获得IP列表

            IPAddress newip = ih[0];      //获取IP地址            

            int port = 6789;              //定义端口

            IPEndPoint Conncet = new IPEndPoint(newip, port);     //构造结点

            s = new Socket(AddressFamily.InterNetwork, SocketType.Stream,  ProtocolType.Tcp);                   //初始化socket 
     try

        {                                  

            s.Connect(Conncet);      //连接远程服务器

            if (s.Connected)         //如果连接成功 s.Connected 则为true 否则为 false
            {

                Console.WriteLine("连接成功");

                Thread t = new Thread(new ThreadStart(set)); //创建进程

                t.Start();                             //开始进程

                Console.WriteLine("发送完毕")      
            }
               }

                catch(NullReferenceException e)

            {
              Console.WriteLine("{0}",e);
            }
            private void set()                       //创建set函数
        {

            Console.WriteLine("开始发送数据");

            byte[] b = new byte[10000000];            //创建文件缓冲区,这里可以认为文件的最大值
            FileStream file = File.Open(path, FileMode.Open,FileAccess.Read);   //创建文件流
            int start = 0;

            int end = (int)file.Length;               //获取文件长度 文件传送如果有需要超过int的范围估计就要改写FileStream类了
      try

          {
            while (end != 0)

            {

                int count = file.Read(b, start, end);      //把数据写进流

                start += count;

                end -= count;

            }

            while (start != 0)

            {

                int n = s.Send(b, end, start, SocketFlags.None);  //用Socket的Send方法发送流
                end += n;

                start -= n;

            }

        

            file.Close();     //关闭文件流

            s.Close();        //关闭Socket

          }  

      catch (NullReferenceException e)

            {

                Console.WriteLine("{0}", e);

            }             

        }   
这样文件发送的模型就实现了
    接下去实现文件的接收,首先要确定对方发送文件的长度,其实上面的那段还要加入发送文件长度的功能,实现很简单,就是发送int变量end ,然后要求接收代码返回一个Boolean确定是否发送,这里为了更简明的说清楚原理并没有实现
             private void get()

        {

            string path = "G:\\da.exe";  //接收的文件

            FileStream file = new FileStream(path, FileMode.OpenOrCreate, FileAccess.Write); //写入文件流
            TcpListener listen = new TcpListener(6789);  //监听端口
            Socket s1 = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);  //定义Socket并初始化
            try

            {

             listen.Start();        //开始监听
            s1 = listen.AcceptSocket();            //获取Socket连接
            byte[] data = new byte[10000000];      //定义缓冲区
            int longer = data.Length;               

            int start = 0;                 

            int mid = 0;

            if (s1.Connected)             //确定连接
            {

                Console.WriteLine("连接成功");

                int count = s1.Receive(data, start, longer, SocketFlags.None);  //把接收到的byte存入缓冲区
                mid += count;

                longer -= mid;

                while (count != 0)

                {

                    count = s1.Receive(data, mid, longer, SocketFlags.None);

                    mid += count;

                    longer -= mid;

                }

                file.Write(data, 0, 1214134); //写入文件,1214134为文件大小,可以用socket发送获得,代码前面已经说明。
                s1.Close();

                file.Close();

            }

            }

                catch(NullReferenceException e)

            {

                    Console.WriteLine("{0}",e);

            }

          }
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  socket java