当前位置:编程学习 > C#/ASP.NET >>

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的缺点让我们情难以堪,但是发送一些小文件还是很方便的,比如图片,文本文档等等。

 

附 /2011/1122/20111122024523982.zip

补充:软件开发 , C# ,
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,