C# 利用Socket.SendFile发送图片(源码)

引言




自 .NET Framework 2.0 版本开始新增了一个SendFile方法,此方法可以方便的发送指定路径的文件,今天给大家演示一个利用Socket.SendFile方法发送图片的例子,希望能给刚刚接触Socket编程的朋友一些帮助,效果图: 
 

 

SendFile详细参数





Socket.SendFile 方法 (String, Byte[], Byte[], TransmitFileOptions)
使用指定的 TransmitFileOptions 值,将文件 fileName 和数据缓冲区发送到连接的 Socket 对象。
注意是连接的Socket对象,所以只适用于TCP协议的Socket连接。

参数
fileName

一个String,它包含要发送的文件的路径和名称。此参数可以为 空引用(在 Visual Basic 中为 Nothing)。

preBuffer

一个 Byte 数组,包含发送文件前要发送的数据。此参数可以为 空引用(在 Visual Basic 中为 Nothing)。

postBuffer

一个 Byte 数组,包含发送文件后要发送的数据。此参数可以为 空引用(在 Visual Basic 中为 Nothing)。

flags

一个或多个 TransmitFileOptions 值。

 

详细请参考Socket.SendFile

 


Send和Receive
 




 
 SendFile
        /// <summary>
        /// 发送指定文件
        /// </summary>
        /// <param name="filename">文件路径</param>
        public void SendFile(string filename)
        {
            FileInfo fi = new FileInfo(filename);

            byte[] len = BitConverter.GetBytes(fi.Length);

            //首先把文件长度发送过去
            _client.BeginSendFile(filename,
                len,
                null,
                TransmitFileOptions.UseDefaultWorkerThread,
                new AsyncCallback(SendFileCallback),
                null);
        }


        private void SendFileCallback(IAsyncResult iar)
        {
            _client.EndSendFile(iar);
        }

  ReceiveFile

        public void BeginReceive()
        {
            byte[] buffer = new byte[8];
            //由于long占8位字节,所以先获取前8位字节数据
            IAsyncResult iar = _client.BeginReceive(
                buffer,
                0,
                buffer.Length,
                SocketFlags.None,
                null,
                null);
            int len = _client.EndReceive(iar);
            int offset = 0;
            int length = BitConverter.ToInt32(buffer, offset);  //先获取文件长度
            ReceiveFile(length);

            BeginReceive();  //继续接收
        }

        public void ReceiveFile(long filelen)
        {
            MemoryStream ms = new MemoryStream();
            int bytesRead = 0;
            long count = 0;
            byte[] buffer = new byte[8192];

            while (count != filelen)
            {
                bytesRead = _client.Receive(buffer, buffer.Length, 0);
                ms.Write(buffer, 0, bytesRead);
                count += bytesRead;
            }

            ReceivedBitmap(new Bitmap(ms));
        }

  

最后



 

SendFile方法虽然用起来非常的方便,但也有自身的优缺点
优点:发送文件时自动创建线程,即使发送大文件时也不会影响主线程运行,不用担心发送过程的状态,文件发送完成时会自动返回。
缺点:只能发送指定路径的文件,发送过程中得不到已发送的流量,所以不能观察其发送的状态。
大家可以根据自己所设计的系统环境采用SendFile方法,虽然SendFile的缺点让我们情难以堪,但是发送一些小文件还是很方便的,比如图片,文本文档等等。
 





 
源码下载

 

posted @ 2011-11-18 17:28  Daniel.Zhao  阅读(10628)  评论(11编辑  收藏  举报