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