C# Socket 文件传输






如果需要接收多个文件的时候,不能重复调用Socket.Bind(ipep),这样会出现socket异常的,因为socket已经监听了一个端口了,端口不能被重复使用。



完整代码:


发送端。。client

        private void button2_Click(object sender, EventArgs e)
        {
           
            this.button2.Enabled = false;
            Thread TempThread = new Thread(new ThreadStart(this.StartSend));
            TempThread.Start();
            
        }

        private void StartSend()
        {
            //FileInfo EzoneFile = new FileInfo(this.textBox1.Text);

            string path = @"E:\old F directory\TangWei\kangge\new1.jpg";

            FileInfo EzoneFile = new FileInfo(path);

            FileStream EzoneStream = EzoneFile.OpenRead();

            int PacketSize = 100000;

            int PacketCount = (int)(EzoneStream.Length / ((long)PacketSize));

        //    this.textBox8.Text = PacketCount.ToString();

        //    this.progressBar1.Maximum = PacketCount;

            int LastDataPacket = (int)(EzoneStream.Length - ((long)(PacketSize * PacketCount)));

        //    this.textBox9.Text = LastDataPacket.ToString();




            IPEndPoint ipep = new IPEndPoint(IPAddress.Parse("163.180.117.229"), 7000);

            Socket client = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);

            client.Connect(ipep);

   //         TransferFiles.SendVarData(client, System.Text.Encoding.Unicode.GetBytes(EzoneFile.Name));

   //         TransferFiles.SendVarData(client, System.Text.Encoding.Unicode.GetBytes(PacketSize.ToString()));

    //        TransferFiles.SendVarData(client, System.Text.Encoding.Unicode.GetBytes(PacketCount.ToString()));

    //        TransferFiles.SendVarData(client, System.Text.Encoding.Unicode.GetBytes(LastDataPacket.ToString()));

            byte[] data = new byte[PacketSize];

            for(int i=0; i<PacketCount; i++)
            {
                EzoneStream.Read(data, 0, data.Length);

                TransferFiles.SendVarData(client, data);

   //             this.textBox10.Text = ((int)(i + 1)).ToString();

   //             this.progressBar1.PerformStep();
            }

            if(LastDataPacket != 0)
            {
                data = new byte[LastDataPacket];

                EzoneStream.Read(data, 0, data.Length);

                TransferFiles.SendVarData(client,data);

    //            this.progressBar1.Value = this.progressBar1.Maximum;
            }


            client.Close();

            EzoneStream.Close();

            this.button2.Enabled = true;


        }

接收端   server

       private void button2_Click(object sender, EventArgs e)
        {
            //int i = 0;
            //FileStream recfs = new FileStream("E:\\kangge.jpg", FileMode.OpenOrCreate);
            //Byte[] recbyte = new Byte[2000000];
            //Socket hostsocket = receive.Accept();
            //BinaryWriter newfilestr = new BinaryWriter(recfs);
            //hostsocket.Receive(recbyte, recbyte.Length, SocketFlags.None);
            //for (i = 0; i < recbyte.Length; i++)
            //{
            //    newfilestr.Write(recbyte, i, 1);
            //}
            //recfs.Close();

            //hostsocket.Shutdown(SocketShutdown.Receive);
            //hostsocket.Close();

            this.button2.Enabled = false;
            Thread TempThread = new Thread(new ThreadStart(this.StartReceive));
            TempThread.Start();
            
        }


        private void StartReceive()
        {
            IPEndPoint ipep = new IPEndPoint(IPAddress.Parse("163.180.117.229"), 7000);

            Socket server = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);

            server.Bind(ipep);

            server.Listen(10);

            Socket client = server.Accept();

     //       IPEndPoint clientep = (IPEndPoint)client.RemoteEndPoint;

      //      string SendFileName = System.Text.Encoding.Unicode.GetString(TransferFiles.ReceiveVarData(client));

       //     string BagSize = System.Text.Encoding.Unicode.GetString(TransferFiles.ReceiveVarData(client));

      //      int bagCount = int.Parse(System.Text.Encoding.Unicode.GetString(TransferFiles.ReceiveVarData(client)));

      //      string bagLast = System.Text.Encoding.Unicode.GetString(TransferFiles.ReceiveVarData(client));
            int file_name = 1;

            string fileaddr = "E:\\old F directory\\TangWei\\Copy of kangge\\" + file_name.ToString() + ".jpg";
            
            FileStream MyFileStream = new FileStream(fileaddr, FileMode.Create, FileAccess.Write);

    //        int SendedCount = 0;

            while(true)
            {
                byte[] data = TransferFiles.ReceiveVarData(client);
                if(data.Length == 0)
                {
                    break;
                }
                else
                {
                   // SendedCount++;
                    MyFileStream.Write(data, 0, data.Length);
                }
            }

            MyFileStream.Close();

            client.Close();

            this.button2.Enabled = true;
        }

公共类。 TransferFiles

    class TransferFiles
    {

        public TransferFiles()
        {

        }

        public static int SendVarData(Socket s, byte[] data) // return integer indicate how many data sent.
        {
            int total = 0;
            int size = data.Length;
            int dataleft = size;
            int sent;
            byte[] datasize = new byte[4];
            datasize = BitConverter.GetBytes(size);
            sent = s.Send(datasize);//send the size of data array.

            while (total < size)
            {
                sent = s.Send(data, total, dataleft, SocketFlags.None);
                total += sent;
                dataleft -= sent;
            }

            return total;
        }

        public static byte[] ReceiveVarData(Socket s) // return array that store the received data.
        {
            int total = 0;
            int recv;
            byte[] datasize = new byte[4];
            recv = s.Receive(datasize, 0, 4, SocketFlags.None);//receive the size of data array for initialize a array.
            int size = BitConverter.ToInt32(datasize, 0);
            int dataleft = size;
            byte[] data = new byte[size];

            while (total < size)
            {
                recv = s.Receive(data, total, dataleft, SocketFlags.None);
                if (recv == 0)
                {
                    data = null;
                    break;
                }
                total += recv;
                dataleft -= recv;
            }

            return data;

        }
    }



  • 3
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 8
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值