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# ,