c# socket传送大文件分享代码

using  System;
using  System.Net;
using  System.Net.Sockets;
using  System.IO;
using  System.Text;
  
namespace  FileSender
{
     public  static  class  FileSender
     {
         private  const  int  BufferSize = 1024;
  
         public  static  void  Send(IPEndPoint ip,  string  path)
         {
             Socket sock =  new  Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
             sock.Connect(ip);
             using  (FileStream reader =  new  FileStream(path, FileMode.Open, FileAccess.Read, FileShare.None))
             {
                 long  send = 0L, length = reader.Length;
                 sock.Send(BitConverter.GetBytes(length));
                 string  fileName = Path.GetFileName(path);
                 sock.Send(Encoding.Default.GetBytes(fileName));
                 Console.WriteLine( "Sending file:"  + fileName +  ".Plz wait..." );
                 byte [] buffer =  new  byte [BufferSize];
                 int  read, sent;
                 //断点发送 在这里判断设置reader.Position即可
                 while  ((read = reader.Read(buffer, 0, BufferSize)) != 0)
                 {
                     sent = 0;
                     while  ((sent += sock.Send(buffer, sent, read, SocketFlags.None)) < read)
                     {
                         send += ( long )sent;
                         //Console.WriteLine("Sent " + send + "/" + length + ".");//进度
                     }
                 }
                 Console.WriteLine( "Send finish." );
             }
         }
  
         public  static  void  Receive(IPEndPoint ip,  string  path)
         {
             Socket sock =  new  Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
             sock.Bind(ip);
             sock.Listen(1);
             Socket client = sock.Accept();
             byte [] buffer =  new  byte [BufferSize];
             client.Receive(buffer);
             long  receive = 0L, length = BitConverter.ToInt64(buffer, 0);
             string  fileName = Encoding.Default.GetString(buffer, 0, client.Receive(buffer));
             Console.WriteLine( "Receiveing file:"  + fileName +  ".Plz wait..." );
             using  (FileStream writer =  new  FileStream(Path.Combine(path, fileName), FileMode.Create, FileAccess.Write, FileShare.None))
             {
                 int  received;
                 //断点接受 在这里判断设置writer.Position即可
                 while  (receive < length)
                 {
                     received = client.Receive(buffer);
                     writer.Write(buffer, 0, received);
                     writer.Flush();
                     receive += ( long )received;
                     //Console.WriteLine("Received " + receive + "/" + length + ".");//进度
                 }
             }
             Console.WriteLine( "Receive finish." );
         }
     }
}


以下是 C# 中使用 Socket 进行大文件传输的示例代码: 服务器端代码: ```csharp using System; using System.IO; using System.Net; using System.Net.Sockets; class Program { static void Main(string[] args) { // 设置监听地址和端口号 IPEndPoint endPoint = new IPEndPoint(IPAddress.Any, 8888); Socket listenSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); // 开始监听 listenSocket.Bind(endPoint); listenSocket.Listen(10); Console.WriteLine("等待客户端连接..."); // 接收客户端连接请求 Socket clientSocket = listenSocket.Accept(); // 接收文件名 byte[] fileNameBytes = new byte[1024]; int recvLength = clientSocket.Receive(fileNameBytes); string fileName = Encoding.UTF8.GetString(fileNameBytes, 0, recvLength); Console.WriteLine("接收到文件名:" + fileName); // 接收文件大小 byte[] fileSizeBytes = new byte[8]; recvLength = clientSocket.Receive(fileSizeBytes); long fileSize = BitConverter.ToInt64(fileSizeBytes, 0); Console.WriteLine("接收到文件大小:" + fileSize); // 创建文件流并保存文件 using (FileStream fileStream = new FileStream(fileName, FileMode.Create)) { byte[] buffer = new byte[1024]; long totalRecvLength = 0; int recvCount; while (totalRecvLength < fileSize) { recvCount = clientSocket.Receive(buffer); fileStream.Write(buffer, 0, recvCount); totalRecvLength += recvCount; } } Console.WriteLine("文件接收完成!"); // 终止连接 clientSocket.Shutdown(SocketShutdown.Both); clientSocket.Close(); listenSocket.Close(); } } ``` 客户端代码: ```csharp using System; using System.IO; using System.Net; using System.Net.Sockets; class Program { static void Main(string[] args) { // 连接服务器 IPAddress serverIP = IPAddress.Parse("127.0.0.1"); IPEndPoint endPoint = new IPEndPoint(serverIP, 8888); Socket clientSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); clientSocket.Connect(endPoint); Console.WriteLine("连接服务器成功!"); // 发送文件名 string fileName = "test.txt"; byte[] fileNameBytes = Encoding.UTF8.GetBytes(fileName); clientSocket.Send(fileNameBytes); Console.WriteLine("发送文件名:" + fileName); // 发送文件大小 FileInfo fileInfo = new FileInfo(fileName); long fileSize = fileInfo.Length; byte[] fileSizeBytes = BitConverter.GetBytes(fileSize); clientSocket.Send(fileSizeBytes); Console.WriteLine("发送文件大小:" + fileSize); // 发送文件内容 using (FileStream fileStream = new FileStream(fileName, FileMode.Open)) { byte[] buffer = new byte[1024 * 1024]; int sendCount; while ((sendCount = fileStream.Read(buffer, 0, buffer.Length)) > 0) { clientSocket.Send(buffer, sendCount, SocketFlags.None); } } Console.WriteLine("文件发送完成!"); // 终止连接 clientSocket.Shutdown(SocketShutdown.Both); clientSocket.Close(); } } ``` 注:以上代码只是一个简单的示例,实际应用中还需要进行异常处理、数据校验等操作。为了避免内存溢出,客户端和服务器端需要分段读取和发送文件内容。在示例代码中,客户端和服务器端每次读取和发送 1MB 的数据。如果需要传输文件非常大,建议使用分块传输和多线程传输等优化方式。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值