C# Socket传输大文件
1.基础类TransferFiles,client和server都需要
- using System;
- using System.Collections.Generic;
- using System.Text;
- using System.Net;
- using System.Net.Sockets;
- using System.Windows.Forms;
- namespace Server
- {
- public class TransferFiles
- {
- public static int SendData(Socket s, byte[] data)
- {
- int total = ;
- 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 = ;
- int dataleft = size;
- byte[] data = new byte[size];
- int recv;
- while (total < size)
- {
- recv = s.Receive(data, total, dataleft, SocketFlags.None);
- if (recv == )
- {
- data = null;
- break;
- }
- total += recv;
- dataleft -= recv;
- }
- return data;
- }
- public static int SendVarData(Socket s, byte[] data)
- {
- int total = ;
- int size = data.Length;
- int dataleft = size;
- int sent;
- byte[] datasize = new byte[];
- 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
- {
- return ;
- }
- }
- public static byte[] ReceiveVarData(Socket s)
- {
- int total = ;
- int recv;
- byte[] datasize = new byte[];
- recv = s.Receive(datasize, , , SocketFlags.None);
- int size = BitConverter.ToInt32(datasize, );
- int dataleft = size;
- byte[] data = new byte[size];
- while (total < size)
- {
- recv = s.Receive(data, total, dataleft, SocketFlags.None);
- if (recv == )
- {
- data = null;
- break;
- }
- total += recv;
- dataleft -= recv;
- }
- return data;
- }
- }
- }
2.Server端
- using System;
- using System.Collections.Generic;
- using System.Text;
- using System.Net;
- using System.Net.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个排队连接请求
- 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 (SocketServer.useLocal)
- {
- //关闭套接字
- 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 = Path.Combine(Environment.CurrentDirectory,SendFileName);
- //创建一个新文件
- FileStream MyFileStream = new FileStream(fullPath, FileMode.Create, FileAccess.Write);
- //已发送包的个数
- int SendedCount = ;
- while (true)
- {
- byte[] data = TransferFiles.ReceiveVarData(client);
- if (data.Length == )
- {
- break;
- }
- else
- {
- SendedCount++;
- //将接收到的数据包写入到文件流对象
- MyFileStream.Write(data, , 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 System.Net;
- using System.Net.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 = ;
- //包的数量
- 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(EzoneFile.Name));
- //发送[包的大小]到客户端
- 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 = ; i < PacketCount; i++)
- {
- //从文件流读取数据并填充数据包
- EzoneStream.Read(data, , data.Length);
- //发送数据包
- if (TransferFiles.SendVarData(client, data) == )
- {
- isCut = true;
- return false;
- break;
- }
- }
- //如果还有多余的数据包,则应该发送完毕!
- if (LastDataPacket != )
- {
- data = new byte[LastDataPacket];
- EzoneStream.Read(data, , data.Length);
- TransferFiles.SendVarData(client, data);
- }
- //关闭套接字
- client.Close();
- //关闭文件流
- EzoneStream.Close();
- if (!isCut)
- {
- return true;
- }
- return false;
- }
- }
- }
C# Socket传输大文件的更多相关文章
- Socket传输大文件(发送与接收)
下载 Client using System; using System.Collections.Generic; using System.Linq; using System.Text; usin ...
- 利用Socket进行大文件传输
分类: WINDOWS 最近接触到利用socket进行大文件传输的技术,有些心得,与大家分享.首先看看这个过程是怎么进行的(如下图): 所以,我们需要三个socket在窗体加载的时候初始化: ...
- 基于RMI服务传输大文件的完整解决方案
基于RMI服务传输大文件,分为上传和下载两种操作,需要注意的技术点主要有三方面,第一,RMI服务中传输的数据必须是可序列化的.第二,在传输大文件的过程中应该有进度提醒机制,对于大文件传输来说,这点很重 ...
- linux传输大文件
http://dreamway.blog.51cto.com/1281816/1151886 linux传输大文件
- C# 的 WCF文章 消息契约(Message Contract)在流(Stream )传输大文件中的应用
我也遇到同样问题,所以抄下做MARK http://www.cnblogs.com/lmjq/archive/2011/07/19/2110319.html 刚做完一个binding为netTcpBi ...
- WCF 用netTcpbinding,basicHttpBinding 传输大文件
问题:WCF如何传输大文件 方案:主要有几种绑定方式netTcpbinding,basicHttpBinding,wsHttpbinding,设置相关的传输max消息选项,服务端和客户端都要设置,tr ...
- 使用QQ传输大文件
现在在公网上能传输大文件并且稳定支持断点续传的软件非常少了,可以使用qq来做这件事. qq传输单个文件有时候提示不能超过4g有时候提示不能超过60g,没搞明白具体怎么样. 可以使用qq的传输文件夹功能 ...
- TCP协议传输大文件读取时候的问题
TCP协议传输大文件读取时候的问题 大文件传不完的bug 我们在定义的时候定义服务端每次文件读取大小为10240, 客户端每次接受大小为10240 我们想当然的认为客户端每次读取大小就是10240而把 ...
- 基于socket实现大文件上传
import socket 1.客户端: 操作流程: 先拿到文件--->获取文件大小---->创建字典 1.制作表头 header 如何得到 他是一个二进制字符串 序列化得到 字典字符串 ...
随机推荐
- DoingOrder.aspx.cs缓存的使用方法
using System; using System.Web.UI; using System.Data; using System.Text; using BLL = SmartWaterSys.B ...
- ActiveRecord 模式杂谈
ActiveRecord也属于ORM(对象关系映射)层,由Rails最早提出,遵循标准的ORM模型:表映射到记录,记录映射到对象,字段映射到对象属性.配合遵循的命名和配置惯例,能够很大程度的快速实现模 ...
- 浅谈 “空指针、野指针、void*”
Author: JW. Zhou Date: 2014/7/2 一.空指针(0/NULL) 返回NULL和返回0是完全等价的,因为NULL和0都表示空指针,换句话说:空指针是什么,就是 ...
- SSD、高级格式化硬盘,4K,分区,对齐,Ghost能不能用的解释用SSD的都可以看看
或者以上,建议选择2048,这是Win7分区使用的值,实际对齐大小就为1024K. 4.如何知道是否对齐? 使用工具AS SSD Benchmark(HDTune Pro 4.6目前测的禁绝) ...
- 转:CString::GetLength()获得字节数的正确方法
前段时间,做http协议上传文件及断点续传控件时,在客户端采用C++调用CHttpConnection.CHttpFile进行文件上传.移植到Unicode编码时,上传得到的文件总是小于正常文件.最终 ...
- mongodb and .net
http://www.codeproject.com/Tips/684801/Connecting-NET-Application-to-MongoDB http://www.codeproject. ...
- [LeetCode 116 117] - 填充每一个节点的指向右边邻居的指针I & II (Populating Next Right Pointers in Each Node I & II)
问题 给出如下结构的二叉树: struct TreeLinkNode { TreeLinkNode *left; TreeLinkNode *right; TreeLinkNode *next; } ...
- MCS-51特殊功能寄存器(SPR)的C51定义
MCS - 51单片机中,除了程序计数器PC和4组工作寄存器组外,其它所有的寄存器均为特殊功能寄存器(SFR),分散在片内RAM区的高128字节中,地址范围为80H~0FFH.SFR中有11个寄存器具 ...
- 8.2.1.10 Nested-Loop Join Algorithms 嵌套循环 关联算法:
8.2.1.10 Nested-Loop Join Algorithms 嵌套循环 关联算法: MySQL 执行关联在表之间使用一个嵌套循环算法或者变种 Nested-Loop Join Algori ...
- uboot之board.c源码分析
/lib_arm/board.c 主要完成了一些初始化的操作,最重要的是有start_armboot函数 _armboot_start地址为多少?? /* * * U-Boot code: 00F00 ...