C#Socket传输大文件
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
C#Socket传输⼤⽂件1.基础类TransferFiles,client和server都需要
using System;
using System.Collections.Generic;
using System.Text;
using ;
using .Sockets;
using System.Windows.Forms;
namespace Server
{
public class TransferFiles
{
public static int SendData(Socket s, byte[] data)
{
int total = 0;
int size = data.Length;
int dataleft = size;
int sent;
while (total < size)
{
sent = s.Send(data, total, dataleft, SocketFlags.None);
total += sent;
dataleft -= sent;
}
return total;
}
public static byte[] ReceiveData(Socket s, int size)
{
int total = 0;
int dataleft = size;
byte[] data = new byte[size];
int recv;
while (total < size)
{
recv = s.Receive(data, total, dataleft, SocketFlags.None);
if (recv == 0)
{
data = null;
break;
}
total += recv;
dataleft -= recv;
}
return data;
}
public static int SendVarData(Socket s, byte[] data)
{
int total = 0;
int size = data.Length;
int dataleft = size;
int sent;
byte[] datasize = new byte[4];
try
{
datasize = BitConverter.GetBytes(size);
sent = s.Send(datasize);
while (total < size)
{
sent = s.Send(data, total, dataleft, SocketFlags.None);
total += sent;
dataleft -= sent;
}
return total;
}
catch
{
return3;
}
}
public static byte[] ReceiveVarData(Socket s)
{
int total = 0;
int recv;
byte[] datasize = new byte[4];
recv = s.Receive(datasize, 0, 4, SocketFlags.None);
int size = BitConverter.ToInt32(datasize, 0);
int dataleft = size;
byte[] data = new byte[size];
while (total < size)
{
recv = s.Receive(data, total, dataleft, SocketFlags.None);
if (recv == 0)
{
data = null;
break;
}
total += recv;
dataleft -= recv;
}
return data;
}
}
}
2.Server端
using System;
using System.Collections.Generic;
using System.Text;
using ;
using .Sockets;
using System.Threading;
using System.IO;
using System.Configuration;
namespace Server
{
public static class FileServer
{
private static Socket serverSocket;
public static void Init()
{
//服务器IP地址
IPAddress ip = IPAddress.Parse(ConfigurationManager.AppSettings["ListenIP"]);
int myProt = Convert.ToInt32(ConfigurationManager.AppSettings["ListenFilePort"]);
serverSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); serverSocket.Bind(new IPEndPoint(ip, myProt)); //绑定IP地址:端⼝
serverSocket.Listen(10); //设定最多10个排队连接请求
Console.WriteLine("启动监听{0}成功", serverSocket.LocalEndPoint.ToString());
//通过Clientsoket发送数据
Thread myThread = new Thread(ListenClientConnect);
myThread.Start();
}
public static void Exit()
{
serverSocket.Close();
serverSocket = null;
}
private static void ListenClientConnect()
{
while (true)
{
if (serverSocket != null)
{
try
{
Socket clientSocket = serverSocket.Accept();
Thread receiveThread = new Thread(Create);
receiveThread.Start(clientSocket);
}
catch
{
break;
}
}
}
}
public static void Create(object clientSocket)
{
Socket client = clientSocket as Socket;
//获得客户端节点对象
IPEndPoint clientep = (IPEndPoint)client.RemoteEndPoint;
//获得[⽂件名]
string SendFileName = System.Text.Encoding.Unicode.GetString(TransferFiles.ReceiveVarData(client));
//检查是否使⽤本地媒体库
if (eLocal)
{
//关闭套接字
client.Close();
return;
}
//获得[包的⼤⼩]
string bagSize = System.Text.Encoding.Unicode.GetString(TransferFiles.ReceiveVarData(client));
//获得[包的总数量]
int bagCount = int.Parse(System.Text.Encoding.Unicode.GetString(TransferFiles.ReceiveVarData(client)));
//获得[最后⼀个包的⼤⼩]
string bagLast = System.Text.Encoding.Unicode.GetString(TransferFiles.ReceiveVarData(client));
string fullPath = bine(Environment.CurrentDirectory,SendFileName);
//创建⼀个新⽂件
FileStream MyFileStream = new FileStream(fullPath, FileMode.Create, FileAccess.Write);
//已发送包的个数
int SendedCount = 0;
while (true)
{
byte[] data = TransferFiles.ReceiveVarData(client);
if (data.Length == 0)
{
break;
}
else
{
SendedCount++;
//将接收到的数据包写⼊到⽂件流对象
MyFileStream.Write(data, 0, data.Length);
//显⽰已发送包的个数
}
}
//关闭⽂件流
MyFileStream.Close();
//关闭套接字
client.Close();
SocketServer.pForm.ShowMessageBox(SendFileName + "接收完毕!");
}
}
}
3.Client端
using System;
using System.Collections.Generic;
using System.Text;
using System.IO;
using ;
using .Sockets;
using System.Diagnostics;
namespace Client
{
public static class FileClient
{
public static bool SendFile(string IP,int Port,string fullPath)
{
//创建⼀个⽂件对象
FileInfo EzoneFile = new FileInfo(fullPath);
//打开⽂件流
FileStream EzoneStream = EzoneFile.OpenRead();
//包的⼤⼩
int PacketSize = 10000;
//包的数量
int PacketCount = (int)(EzoneStream.Length / ((long)PacketSize));
//最后⼀个包的⼤⼩
int LastDataPacket = (int)(EzoneStream.Length - ((long)(PacketSize * PacketCount)));
//指向远程服务端节点
IPEndPoint ipep = new IPEndPoint(IPAddress.Parse(IP), Port);
//创建套接字
Socket client = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
//连接到发送端
try
{
client.Connect(ipep);
}
catch
{
Debug.WriteLine("连接服务器失败!");
return false;
}
//获得客户端节点对象
IPEndPoint clientep = (IPEndPoint)client.RemoteEndPoint;
//发送[⽂件名]到客户端
TransferFiles.SendVarData(client, System.Text.Encoding.Unicode.GetBytes());
//发送[包的⼤⼩]到客户端
TransferFiles.SendVarData(client, System.Text.Encoding.Unicode.GetBytes(PacketSize.ToString()));
//发送[包的总数量]到客户端
TransferFiles.SendVarData(client, System.Text.Encoding.Unicode.GetBytes(PacketCount.ToString()));
//发送[最后⼀个包的⼤⼩]到客户端
TransferFiles.SendVarData(client, System.Text.Encoding.Unicode.GetBytes(LastDataPacket.ToString()));
bool isCut = false;
//数据包
byte[] data = new byte[PacketSize];
//开始循环发送数据包
for (int i = 0; i < PacketCount; i++)
{
//从⽂件流读取数据并填充数据包
EzoneStream.Read(data, 0, data.Length);
//发送数据包
if (TransferFiles.SendVarData(client, data) == 3)
{
isCut = true;
return false;
break;
}
}
//如果还有多余的数据包,则应该发送完毕!
if (LastDataPacket != 0)
{
data = new byte[LastDataPacket];
EzoneStream.Read(data, 0, data.Length);
TransferFiles.SendVarData(client, data);
}
//关闭套接字
client.Close();
//关闭⽂件流
EzoneStream.Close();
if (!isCut)
{
return true;
}
return false;
}
}
}。