使用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;
        }

    }



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

网络编程:基于TCP的socket网络传输视频(C++, python)

可以实现C++ to C++、Python to Python、C++ to Python的视频或图像传输。一. 概述Socket的英文原义是“孔”或“插座”。作为BSD UNIX的进程通信机制,取后...
  • li_dongxuan
  • li_dongxuan
  • 2017年06月12日 19:11
  • 737

c++ 通过socket(网络套接字)传输图片(客户端)

先简单讲一下流程: WinSock初始化->创建Socket->连接connect->传输send->关闭close #pragma comment(lib,"ws2_32.lib") #inc...
  • Sea_muxixi
  • Sea_muxixi
  • 2017年08月28日 14:45
  • 461

socket网络传输

环境限定:TCP/IP下的socket网络传输;C/C++开发语言,32/64位机。 目前有两种方式对数据进行传输:1)字符流形式,即将数据用字符串表示;2)结构型方式,即将数据按类型直接传输。...
  • nawenqiang
  • nawenqiang
  • 2014年10月27日 19:52
  • 373

【Unity】基于ProtoBuffer与Socket实现网络传输

1.Unity中使用ProtoBuf 2.Unity中使用Socket实现实时通信 3.数据包的编码和解码
  • TreePulse
  • TreePulse
  • 2016年12月05日 18:12
  • 1389

C# Socket传输图片

不管是socket还是udp发送图片都是把图片转换成
  • z5976749
  • z5976749
  • 2014年11月03日 17:07
  • 2687

Socket 通信原理机制

我们深谙信息交流的价值,那网络中进程之间如何通信,如我们每天打开浏览器浏览网页时,浏览器的进程怎么与web服务器通信的?当你用QQ聊天时,QQ进程怎么与服务器或你好友所在的QQ进程通信?这些都得靠so...
  • Tom_and_Jerry_zhao
  • Tom_and_Jerry_zhao
  • 2015年11月25日 21:55
  • 4706

【视频传输】二、Opencv结合socket进行视频传输(TCP协议)

在同一台电脑上实验,即运行服务器程序,又跑客户端程序,也就是说通过socket编程来实现数据的自发自收。...
  • hujingshuang
  • hujingshuang
  • 2015年01月27日 10:19
  • 8628

windows和Linux之间socket传输结构体关于字节对齐产生的问题

这个是我在做转码机的时候发现的问题。这个转码机大致的思路是:将转码机上面的数据用结构体打包通过socket发送给Linux客户端。Linux客户端也是用结构体去接收。 发送的过程中出现了这样一个问题,...
  • u012654882
  • u012654882
  • 2015年04月03日 12:27
  • 1051

Qt使用Socket传送图片(完善)

在我上一篇blog里面叙述了我使用socket传送图片的过
  • u014331618
  • u014331618
  • 2014年04月16日 10:26
  • 1979

Java serializable:套接字在网络上传送对象

1.概念上的内容请参考http://www.2cto.com/kf/201405/305380.html
  • kingmicrosoft
  • kingmicrosoft
  • 2014年08月30日 11:22
  • 1448
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:使用Socket实现网络传输
举报原因:
原因补充:

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