c# socket传送大文件

c# socket传送大文件using System;
using System.Threading;
using System.Net;

namespace FileSender
{
    class Program
    {
        static void Main(string[] args)
        {
            string file = Console.ReadLine();
            IPEndPoint ip = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 520);
            Thread rThread = new Thread(() => FileSender.Receive(ip, "E:\\"));//接受放到那个盘里 保存路径=这个参数+发送到文件名。
            rThread.IsBackground = true;
            rThread.Start();
            Thread sThread = new Thread(() => FileSender.Send(ip, file));//发送到文件,不存在会抛异常。
            sThread.IsBackground = true;
            sThread.Start();
            Console.ReadLine();
        }
    }
}

using System;
using System.Net;
using System.Net.Sockets;
using System.IO;
using System.Text;

namespace FileSender
{
    public static class FileSender
    {
        private const int BufferSize = 1024;

        public static void Send(IPEndPoint ip, string path)
        {
            Socket sock = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
            sock.Connect(ip);
            using (FileStream reader = new FileStream(path, FileMode.Open, FileAccess.Read, FileShare.None))
            {
                long send = 0L, length = reader.Length;
                sock.Send(BitConverter.GetBytes(length));
                string fileName = Path.GetFileName(path);
                sock.Send(Encoding.Default.GetBytes(fileName));
                Console.WriteLine("Sending file:" + fileName + ".Plz wait...");
                byte[] buffer = new byte[BufferSize];
                int read, sent;
                while ((read = reader.Read(buffer, 0, BufferSize)) != 0)
                {
                    sent = 0;
                    while ((sent += sock.Send(buffer, sent, read, SocketFlags.None)) < read)
                    {
                        send += (long)sent;
                        //Console.WriteLine("Sent " + send + "/" + length + ".");//进度
                    }
                }
                Console.WriteLine("Send finish.");
            }
        }

        public static void Receive(IPEndPoint ip, string path)
        {
            Socket sock = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
            sock.Bind(ip);
            sock.Listen(1);
            Socket client = sock.Accept();
            byte[] buffer = new byte[BufferSize];
            client.Receive(buffer);
            long receive = 0L, length = BitConverter.ToInt64(buffer, 0);
            string fileName = Encoding.Default.GetString(buffer, 0, client.Receive(buffer));
            Console.WriteLine("Receiveing file:" + fileName + ".Plz wait...");
            using (FileStream writer = new FileStream(Path.Combine(path, fileName), FileMode.Create, FileAccess.Write, FileShare.None))
            {
                int received;
                while (receive < length)
                {
                    received = client.Receive(buffer);
                    writer.Write(buffer, 0, received);
                    writer.Flush();
                    receive += (long)received;
                    //Console.WriteLine("Received " + receive + "/" + length + ".");//进度
                }
            }
            Console.WriteLine("Receive finish.");
        }
    }
}

posted on 2010-05-31 17:41  风乔  阅读(762)  评论(0编辑  收藏  举报

导航