使用Socket实现网络传输

原创 2013年12月05日 15:01:56

           类似的博文很多了,但是质量良莠不齐,有的可用性、可移植性比较差。这段代码我调试了两天,运行起来性能、稳定型不错。要求不高的中、小程序直接作为Dll类库引用没问题。

           发篇博文用来记录,也好分享给大家成果。此段代码仍有很多可以提高的地方,希望算是抛砖引玉。


需求:

       服务端(1):能够持续监听,并查收文件。

       客户端(N):能够连接服务器发送文件。

       使用效果测试:局域网内,4G的单个文件传输没问题。稳定性还是有保障的,而且内存消耗也比较稳定、可控。

       现有代码可以完善的问题一:服务端无法实现多个文件同时接收,请教各位高手给个思路?

       

public static class FileSender
    {
        private const int BufferSize = 1024;
        
        public static void Send(IPEndPoint ip, string fullPathFileName)
        {
            Socket sock = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
            sock.Connect(ip);
            using (FileStream reader = new FileStream(fullPathFileName, FileMode.Open, FileAccess.Read, FileShare.None))
            {

                //发送文件长度
                long send = 0L, length = reader.Length;
                byte[] byteArrayLength = BitConverter.GetBytes(length);
                sock.Send(byteArrayLength);

                ///发送文件名
                string fileName = Path.GetFileName(fullPathFileName);
                byte[] bufferFileName = Encoding.Default.GetBytes(fileName);
                sock.Send(bufferFileName);

                //sock.Send(BitConverter.GetBytes());
                Console.WriteLine("Sending file:" + fileName + ";Size:" + length + "Byte;Please wait...");
                byte[] buffer = new byte[BufferSize];
                int read, sent;
                //断点发送 在这里判断设置reader.Position即可
                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 bool ReceiverBusying = false;
        public static void Receive(int port, string path)
        {
            IPEndPoint ip = new IPEndPoint(IPAddress.Any, port);
            Socket sock = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
            sock.Bind(ip);
            sock.Listen(100);
            
            while (true)
            {
                Socket client = sock.Accept();
                ReceiverBusying = true;
                byte[] buffer = new byte[BufferSize];
                client.Receive(buffer);
                long receive = 0L, length = BitConverter.ToInt64(buffer,0);


                buffer = new byte[BufferSize];
                int receivedNum=client.Receive(buffer);
                string fileName = Encoding.Default.GetString(buffer, 0, receivedNum);

                Console.WriteLine("Receiving file:" + fileName + ";Size:" + length + "Byte; Please wait...");
                
                string targetPathFileName;
                try
                {
                    ///完整文件名
                    targetPathFileName = Path.Combine(path, fileName);
                }
                catch//用当前时间.xml
                {
                    targetPathFileName = Path.Combine(path, DateTime.Now.ToString("yyyyMMddHHmmss") + ".xml");
                }
                
                using (FileStream writer = new FileStream(targetPathFileName, FileMode.Create, FileAccess.Write, FileShare.None))
                {
                    int received;
                    //断点接受 在这里判断设置writer.Position即可
                    while (receive < length)
                    {
                        received = client.Receive(buffer);
                        writer.Write(buffer, 0, received);
                        writer.Flush();
                        receive += (long)received;
                        //Console.WriteLine("Received " + receive + "/" + length + ".");//进度
                    }
                }
                ReceiverBusying = false;
                Console.WriteLine("Receive finish.");
            }
        }

        /// <summary>
        /// 地址为默认路径
        /// </summary>
        /// <param name="ip"></param>
        public static void Receive(int port)
        {
            string path = AppDomain.CurrentDomain.BaseDirectory;
            Receive(port, path);
        }


        /// 比较两个字节数组是否相等
        /// </summary>
        /// <param name="b1">byte数组1</param>
        /// <param name="b2">byte数组2</param>
        /// <returns>是否相等</returns>
        public static bool PasswordEquals(byte[] b1, byte[] b2)
        {
            if (b1 == null || b2 == null) return false;
            if (b1.Length != b2.Length) return false;
            for (int i = 0; i < b1.Length; i++)
                if (b1[i] != b2[i])
                    return false;
            return true;
        }

    }



版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

【无浪】用Socket类实现网络传输文件软件

网络传输文件以及聊天软件

Windows下Socket TCP网络传输及ping-pong缓冲区进程同步研究实现

最近做一个socket网络传输的项目,在使用TCP进行传输的时候,接收端有时候会因为写入到文件的时间而造成一定的延时,所以在接收端使用了ping-pong buffer的策略进行优化。 所谓ping...

Ntrip协议,tcp,socket网络传输

  • 2016年08月17日 19:08
  • 1022KB
  • 下载

day23套接字socket网络传输TCP和udp

/* 客户端 通过查阅Socket对象,发现在该对象建立时,就可以连接指定主机 因为tcp是面向连接,所以在建立socket服务时 就要有服务端存在,并连接成功,形成通路后,在该通道进行数据的传输 ...

C#网络传输文件(socket)

  • 2008年03月27日 15:47
  • 51KB
  • 下载

socket网络传输图片

  • 2013年03月29日 21:30
  • 1.13MB
  • 下载

java--基于socket的网络传输开发

继http://blog.csdn.net/gaopeng0071/article/details/10959845此文章内容展开的研究。   socket传输是基于tcp的网络传输协议进行的传输...

java socket 多线程网络传输多个文件

由于需要研究了下用 java socket 传输文件,由于需要传输多个文件,因此,采用了多线程设计。客户端每个线程创建一个 socket 连接,每个 socket 连接负责传输一个文件,服务端的Ser...

socket网络传输大文件

1.服务器端 package sterning; import java.io.BufferedInputStream; import java.io.DataInputStream...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:使用Socket实现网络传输
举报原因:
原因补充:

(最多只允许输入30个字)