1.基础类TransferFiles,client和server都需要

  1. using System;
  2. using System.Collections.Generic;
  3. using System.Text;
  4.  
  5. using System.Net;
  6. using System.Net.Sockets;
  7. using System.Windows.Forms;
  8.  
  9. namespace Server
  10. {
  11. public class TransferFiles
  12. {
  13. public static int SendData(Socket s, byte[] data)
  14. {
  15. int total = ;
  16. int size = data.Length;
  17. int dataleft = size;
  18. int sent;
  19.  
  20. while (total < size)
  21. {
  22. sent = s.Send(data, total, dataleft, SocketFlags.None);
  23. total += sent;
  24. dataleft -= sent;
  25. }
  26.  
  27. return total;
  28. }
  29.  
  30. public static byte[] ReceiveData(Socket s, int size)
  31. {
  32. int total = ;
  33. int dataleft = size;
  34. byte[] data = new byte[size];
  35. int recv;
  36. while (total < size)
  37. {
  38. recv = s.Receive(data, total, dataleft, SocketFlags.None);
  39. if (recv == )
  40. {
  41. data = null;
  42. break;
  43. }
  44.  
  45. total += recv;
  46. dataleft -= recv;
  47. }
  48. return data;
  49. }
  50.  
  51. public static int SendVarData(Socket s, byte[] data)
  52. {
  53. int total = ;
  54. int size = data.Length;
  55. int dataleft = size;
  56. int sent;
  57. byte[] datasize = new byte[];
  58.  
  59. try
  60. {
  61. datasize = BitConverter.GetBytes(size);
  62. sent = s.Send(datasize);
  63.  
  64. while (total < size)
  65. {
  66. sent = s.Send(data, total, dataleft, SocketFlags.None);
  67. total += sent;
  68. dataleft -= sent;
  69. }
  70.  
  71. return total;
  72. }
  73. catch
  74. {
  75. return ;
  76.  
  77. }
  78. }
  79.  
  80. public static byte[] ReceiveVarData(Socket s)
  81. {
  82. int total = ;
  83. int recv;
  84. byte[] datasize = new byte[];
  85. recv = s.Receive(datasize, , , SocketFlags.None);
  86. int size = BitConverter.ToInt32(datasize, );
  87. int dataleft = size;
  88. byte[] data = new byte[size];
  89. while (total < size)
  90. {
  91. recv = s.Receive(data, total, dataleft, SocketFlags.None);
  92. if (recv == )
  93. {
  94. data = null;
  95. break;
  96. }
  97. total += recv;
  98. dataleft -= recv;
  99. }
  100. return data;
  101. }
  102. }
  103. }

2.Server端

  1. using System;
  2. using System.Collections.Generic;
  3. using System.Text;
  4. using System.Net;
  5. using System.Net.Sockets;
  6. using System.Threading;
  7. using System.IO;
  8. using System.Configuration;
  9.  
  10. namespace Server
  11. {
  12. public static class FileServer
  13. {
  14. private static Socket serverSocket;
  15. public static void Init()
  16. {
  17. //服务器IP地址
  18. IPAddress ip = IPAddress.Parse(ConfigurationManager.AppSettings["ListenIP"]);
  19. int myProt = Convert.ToInt32(ConfigurationManager.AppSettings["ListenFilePort"]);
  20. serverSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
  21. serverSocket.Bind(new IPEndPoint(ip, myProt)); //绑定IP地址:端口
  22. serverSocket.Listen(); //设定最多10个排队连接请求
  23. Console.WriteLine("启动监听{0}成功", serverSocket.LocalEndPoint.ToString());
  24. //通过Clientsoket发送数据
  25. Thread myThread = new Thread(ListenClientConnect);
  26. myThread.Start();
  27. }
  28. public static void Exit()
  29. {
  30. serverSocket.Close();
  31. serverSocket = null;
  32. }
  33. private static void ListenClientConnect()
  34. {
  35. while (true)
  36. {
  37. if (serverSocket != null)
  38. {
  39. try
  40. {
  41. Socket clientSocket = serverSocket.Accept();
  42. Thread receiveThread = new Thread(Create);
  43. receiveThread.Start(clientSocket);
  44. }
  45. catch
  46. {
  47. break;
  48. }
  49. }
  50. }
  51. }
  52. public static void Create(object clientSocket)
  53. {
  54. Socket client = clientSocket as Socket;
  55. //获得客户端节点对象
  56. IPEndPoint clientep = (IPEndPoint)client.RemoteEndPoint;
  57.  
  58. //获得[文件名]
  59. string SendFileName = System.Text.Encoding.Unicode.GetString(TransferFiles.ReceiveVarData(client));
  60.  
  61. //检查是否使用本地媒体库
  62. if (SocketServer.useLocal)
  63. {
  64. //关闭套接字
  65. client.Close();
  66. return;
  67. }
  68.  
  69. //获得[包的大小]
  70. string bagSize = System.Text.Encoding.Unicode.GetString(TransferFiles.ReceiveVarData(client));
  71.  
  72. //获得[包的总数量]
  73. int bagCount = int.Parse(System.Text.Encoding.Unicode.GetString(TransferFiles.ReceiveVarData(client)));
  74.  
  75. //获得[最后一个包的大小]
  76. string bagLast = System.Text.Encoding.Unicode.GetString(TransferFiles.ReceiveVarData(client));
  77.  
  78. string fullPath = Path.Combine(Environment.CurrentDirectory,SendFileName);
  79. //创建一个新文件
  80. FileStream MyFileStream = new FileStream(fullPath, FileMode.Create, FileAccess.Write);
  81.  
  82. //已发送包的个数
  83. int SendedCount = ;
  84. while (true)
  85. {
  86.  
  87. byte[] data = TransferFiles.ReceiveVarData(client);
  88. if (data.Length == )
  89. {
  90. break;
  91. }
  92. else
  93. {
  94. SendedCount++;
  95. //将接收到的数据包写入到文件流对象
  96. MyFileStream.Write(data, , data.Length);
  97. //显示已发送包的个数
  98.  
  99. }
  100. }
  101. //关闭文件流
  102. MyFileStream.Close();
  103. //关闭套接字
  104. client.Close();
  105. SocketServer.pForm.ShowMessageBox(SendFileName + "接收完毕!");
  106. }
  107. }
  108. }

3.Client端

  1. using System;
  2. using System.Collections.Generic;
  3. using System.Text;
  4. using System.IO;
  5. using System.Net;
  6. using System.Net.Sockets;
  7. using System.Diagnostics;
  8.  
  9. namespace Client
  10. {
  11. public static class FileClient
  12. {
  13. public static bool SendFile(string IP,int Port,string fullPath)
  14. {
  15. //创建一个文件对象
  16. FileInfo EzoneFile = new FileInfo(fullPath);
  17. //打开文件流
  18. FileStream EzoneStream = EzoneFile.OpenRead();
  19.  
  20. //包的大小
  21. int PacketSize = ;
  22.  
  23. //包的数量
  24. int PacketCount = (int)(EzoneStream.Length / ((long)PacketSize));
  25.  
  26. //最后一个包的大小
  27. int LastDataPacket = (int)(EzoneStream.Length - ((long)(PacketSize * PacketCount)));
  28.  
  29. //指向远程服务端节点
  30. IPEndPoint ipep = new IPEndPoint(IPAddress.Parse(IP), Port);
  31.  
  32. //创建套接字
  33. Socket client = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
  34.  
  35. //连接到发送端
  36. try
  37. {
  38. client.Connect(ipep);
  39. }
  40. catch
  41. {
  42. Debug.WriteLine("连接服务器失败!");
  43. return false;
  44. }
  45. //获得客户端节点对象
  46. IPEndPoint clientep = (IPEndPoint)client.RemoteEndPoint;
  47.  
  48. //发送[文件名]到客户端
  49. TransferFiles.SendVarData(client, System.Text.Encoding.Unicode.GetBytes(EzoneFile.Name));
  50.  
  51. //发送[包的大小]到客户端
  52. TransferFiles.SendVarData(client, System.Text.Encoding.Unicode.GetBytes(PacketSize.ToString()));
  53.  
  54. //发送[包的总数量]到客户端
  55. TransferFiles.SendVarData(client, System.Text.Encoding.Unicode.GetBytes(PacketCount.ToString()));
  56.  
  57. //发送[最后一个包的大小]到客户端
  58. TransferFiles.SendVarData(client, System.Text.Encoding.Unicode.GetBytes(LastDataPacket.ToString()));
  59.  
  60. bool isCut = false;
  61. //数据包
  62. byte[] data = new byte[PacketSize];
  63. //开始循环发送数据包
  64. for (int i = ; i < PacketCount; i++)
  65. {
  66. //从文件流读取数据并填充数据包
  67. EzoneStream.Read(data, , data.Length);
  68. //发送数据包
  69. if (TransferFiles.SendVarData(client, data) == )
  70. {
  71. isCut = true;
  72. return false;
  73. break;
  74. }
  75.  
  76. }
  77.  
  78. //如果还有多余的数据包,则应该发送完毕!
  79. if (LastDataPacket != )
  80. {
  81. data = new byte[LastDataPacket];
  82. EzoneStream.Read(data, , data.Length);
  83. TransferFiles.SendVarData(client, data);
  84. }
  85.  
  86. //关闭套接字
  87. client.Close();
  88. //关闭文件流
  89. EzoneStream.Close();
  90. if (!isCut)
  91. {
  92. return true;
  93. }
  94. return false;
  95. }
  96. }
  97. }

C# Socket传输大文件的更多相关文章

  1. Socket传输大文件(发送与接收)

    下载 Client using System; using System.Collections.Generic; using System.Linq; using System.Text; usin ...

  2. 利用Socket进行大文件传输

    分类: WINDOWS 最近接触到利用socket进行大文件传输的技术,有些心得,与大家分享.首先看看这个过程是怎么进行的(如下图):      所以,我们需要三个socket在窗体加载的时候初始化: ...

  3. 基于RMI服务传输大文件的完整解决方案

    基于RMI服务传输大文件,分为上传和下载两种操作,需要注意的技术点主要有三方面,第一,RMI服务中传输的数据必须是可序列化的.第二,在传输大文件的过程中应该有进度提醒机制,对于大文件传输来说,这点很重 ...

  4. linux传输大文件

    http://dreamway.blog.51cto.com/1281816/1151886 linux传输大文件

  5. C# 的 WCF文章 消息契约(Message Contract)在流(Stream )传输大文件中的应用

    我也遇到同样问题,所以抄下做MARK http://www.cnblogs.com/lmjq/archive/2011/07/19/2110319.html 刚做完一个binding为netTcpBi ...

  6. WCF 用netTcpbinding,basicHttpBinding 传输大文件

    问题:WCF如何传输大文件 方案:主要有几种绑定方式netTcpbinding,basicHttpBinding,wsHttpbinding,设置相关的传输max消息选项,服务端和客户端都要设置,tr ...

  7. 使用QQ传输大文件

    现在在公网上能传输大文件并且稳定支持断点续传的软件非常少了,可以使用qq来做这件事. qq传输单个文件有时候提示不能超过4g有时候提示不能超过60g,没搞明白具体怎么样. 可以使用qq的传输文件夹功能 ...

  8. TCP协议传输大文件读取时候的问题

    TCP协议传输大文件读取时候的问题 大文件传不完的bug 我们在定义的时候定义服务端每次文件读取大小为10240, 客户端每次接受大小为10240 我们想当然的认为客户端每次读取大小就是10240而把 ...

  9. 基于socket实现大文件上传

    import socket 1.客户端: 操作流程: 先拿到文件--->获取文件大小---->创建字典 1.制作表头 header  如何得到 他是一个二进制字符串 序列化得到 字典字符串 ...

随机推荐

  1. DoingOrder.aspx.cs缓存的使用方法

    using System; using System.Web.UI; using System.Data; using System.Text; using BLL = SmartWaterSys.B ...

  2. ActiveRecord 模式杂谈

    ActiveRecord也属于ORM(对象关系映射)层,由Rails最早提出,遵循标准的ORM模型:表映射到记录,记录映射到对象,字段映射到对象属性.配合遵循的命名和配置惯例,能够很大程度的快速实现模 ...

  3. 浅谈 “空指针、野指针、void*”

            Author: JW. Zhou Date: 2014/7/2 一.空指针(0/NULL) 返回NULL和返回0是完全等价的,因为NULL和0都表示空指针,换句话说:空指针是什么,就是 ...

  4. SSD、高级格式化硬盘,4K,分区,对齐,Ghost能不能用的解释用SSD的都可以看看

    或者以上,建议选择2048,这是Win7分区使用的值,实际对齐大小就为1024K.  4.如何知道是否对齐?  使用工具AS SSD Benchmark(HDTune Pro 4.6目前测的禁绝)   ...

  5. 转:CString::GetLength()获得字节数的正确方法

    前段时间,做http协议上传文件及断点续传控件时,在客户端采用C++调用CHttpConnection.CHttpFile进行文件上传.移植到Unicode编码时,上传得到的文件总是小于正常文件.最终 ...

  6. mongodb and .net

    http://www.codeproject.com/Tips/684801/Connecting-NET-Application-to-MongoDB http://www.codeproject. ...

  7. [LeetCode 116 117] - 填充每一个节点的指向右边邻居的指针I & II (Populating Next Right Pointers in Each Node I & II)

    问题 给出如下结构的二叉树: struct TreeLinkNode { TreeLinkNode *left; TreeLinkNode *right; TreeLinkNode *next; } ...

  8. MCS-51特殊功能寄存器(SPR)的C51定义

    MCS - 51单片机中,除了程序计数器PC和4组工作寄存器组外,其它所有的寄存器均为特殊功能寄存器(SFR),分散在片内RAM区的高128字节中,地址范围为80H~0FFH.SFR中有11个寄存器具 ...

  9. 8.2.1.10 Nested-Loop Join Algorithms 嵌套循环 关联算法:

    8.2.1.10 Nested-Loop Join Algorithms 嵌套循环 关联算法: MySQL 执行关联在表之间使用一个嵌套循环算法或者变种 Nested-Loop Join Algori ...

  10. uboot之board.c源码分析

    /lib_arm/board.c 主要完成了一些初始化的操作,最重要的是有start_armboot函数 _armboot_start地址为多少?? /* * * U-Boot code: 00F00 ...