supersocket实现上传文件 您所在的位置:网站首页 socket传输文件 supersocket实现上传文件

supersocket实现上传文件

#supersocket实现上传文件| 来源: 网络整理| 查看: 265

我的图书馆

查看信箱 系统消息 官方通知 设置

开始对话 有11人和你对话,查看 忽略 历史对话记录 通知设置 留言交流

请选择搜索范围

含  的文章 含  的书籍 含  的随笔

_明心见性_ / SuperSocket / supersocket实现上传文件

转Word 全屏 打印 修改 转藏+1 分享 QQ空间 QQ好友 新浪微博 微信扫一扫

×

00:00

选择朗读音色

亲切女声

稳重女声

成熟男声

选择朗读倍速

0.75倍

1倍

1.5倍

选择循环方式

单篇循环

    supersocket实现上传文件 2018-07-29  _明心见性_ 展开全文

0.先上章效果图吧;

1.目录结构:

2.上传客户端类库介绍:

   ITransferEngine:

 

复制代码 public interface ITransferEngine { /// /// 该事件接口暴露了所有正在上传的文件(夹)的实时状态。 /// IFileUploadingEvents FileUploadingEvents { get; } void BeginUpLoad(string fileName, string saveName); void BeginUpLoad(string fileName, string saveName, ref string fileId, ref string AddId); } public interface IFileUploadingEvents { event BTransferEventHandler FileExist; event TransferEventHandler TransferComplete; event TransferEventHandler TransferError; event TransferEventHandler TransferStep; } 复制代码

TransferEngine:

复制代码 internal class TransferEngine : ITransferEngine { private FileUploadingEvents _FileUploadingEvents; public IFileUploadingEvents FileUploadingEvents { get { return _FileUploadingEvents; } } public TransferEngine() { _FileUploadingEvents = new FileUploadingEvents(); } public void BeginUpLoad(string fileName, string saveName) { EndPoint endpoint = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 2020); UpLoadEngine engine = new UpLoadEngine(_FileUploadingEvents); engine.Init(endpoint, fileName, Path.GetFileName(fileName)); engine.BeginUpLoad(); } public void BeginUpLoad(string fileName, string saveName, ref string fileId, ref string AddId) { EndPoint endpoint = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 2020); UpLoadEngine engine = new UpLoadEngine(_FileUploadingEvents); engine.Init(endpoint, fileName, saveName); engine.BeginUpLoad(ref fileId, ref AddId); } } 复制代码

上传的相关事件:

复制代码 public delegate void TransferEventHandler(TEventArgs e); public delegate bool BTransferEventHandler(TEventArgs e); public class TransferStepEventArgs : EventArgs { public TransferStepEventArgs(long _TotalLen, long _TransferLen, int _CurrentPacket) { this.TotalLen = _TotalLen; this.TransferLen = _TransferLen; this.CurrentPacket = _CurrentPacket; } public int CurrentPacket { get; set; } public long TotalLen { get; set; } public long TransferLen { get; set; } } public class TransferErrorEventArgs : EventArgs { public TransferErrorEventArgs(System.Exception exception) { this.Exception = exception; } public System.Exception Exception { get; private set; } } 复制代码 复制代码 internal class FileUploadingEvents : IFileUploadingEvents { internal BTransferEventHandler OnFileExist; internal TransferEventHandler OnTransferComplete; internal TransferEventHandler OnTransferError; internal TransferEventHandler OnTransferStep; public event BTransferEventHandler FileExist { add { OnFileExist = (BTransferEventHandler)System.Delegate.Combine(OnFileExist, value); } remove { OnFileExist = (BTransferEventHandler)System.Delegate.Remove(OnFileExist, value); } } public event TransferEventHandler TransferComplete { add { OnTransferComplete = (TransferEventHandler)System.Delegate.Combine(OnTransferComplete, value); } remove { OnTransferComplete = (TransferEventHandler)System.Delegate.Remove(OnTransferComplete, value); } } public event TransferEventHandler TransferError { add { OnTransferError = (TransferEventHandler)System.Delegate.Combine(OnTransferError, value); } remove { OnTransferError = (TransferEventHandler)System.Delegate.Remove(OnTransferError, value); } } public event TransferEventHandler TransferStep { add { OnTransferStep = (TransferEventHandler)System.Delegate.Combine(OnTransferStep, value); } remove { OnTransferStep = (TransferEventHandler)System.Delegate.Remove(OnTransferStep, value); } } } 复制代码

UpLoadEngine:

复制代码 internal class UpLoadEngine : IDisposable { FileUploadingEvents FileUploadingEvents; protected IClientCommandReader CommandReader { get; private set; } private string _fileName; public string _saveName; private Dictionary m_CommandDict = new Dictionary(StringComparer.OrdinalIgnoreCase); private FileStream m_fileStream; private int PacketSize = 1024 * 30; private byte[] readBuffer; private long TransferedLength = 0L; internal int TransferStatus = 0; //0:初始化状态,1:CheckExist,3,OnUpLoad,开始上传,4,OnDoData,数据传输中,5,数据传输完成,6,已结束的标志 private long TransferTotalLength = 0L; internal TcpClientSession Client; internal AutoResetEvent m_OpenedEvent = new AutoResetEvent(false); internal AutoResetEvent m_EndEvent = new AutoResetEvent(false); public UpLoadEngine(FileUploadingEvents _FileUploadingEvents) { this.FileUploadingEvents = _FileUploadingEvents; } public void BeginUpLoad() { try { if (this.TransferStatus != 0) { throw new Exception("状态错误"); } this.Client.Connect(); if (!this.m_OpenedEvent.WaitOne(5000)) { throw new Exception("连接失败"); } this.SendMessage(UpLoadOP.CheckExist, this._saveName); } catch (Exception exception) { this.OnTransferError(new TransferErrorEventArgs(exception)); } } internal void BeginUpLoad(ref string fileId, ref string AddId) { BeginUpLoad(); fileId = string.Empty; AddId = string.Empty; } private void client_Closed(object sender, EventArgs e) { this.TransferStatus = 6; } private void client_Connected(object sender, EventArgs e) { this.m_OpenedEvent.Set(); } private void client_DataReceived(object sender, DataEventArgs e) { this.m_OnDataReceived(e.Data, e.Offset, e.Length); } private void client_Error(object sender, SuperSocket.ClientEngine.ErrorEventArgs e) { } public void Dispose() { this._fileName = string.Empty; this._saveName = string.Empty; if (this.m_fileStream != null) { this.m_fileStream.Close(); this.m_fileStream = null; } TcpClientSession client = this.Client; if (client != null) { client.Error -= new EventHandler(this.client_Error); client.DataReceived -= new EventHandler(this.client_DataReceived); client.Connected -= new EventHandler(this.client_Connected); client.Closed -= new EventHandler(this.client_Closed); if (client.IsConnected) { client.Close(); } this.Client = null; } //this.TransferStatus = 0; this.TransferedLength = 0L; this.TransferTotalLength = 0L; this.readBuffer = null; this.CommandReader = null; this.m_CommandDict.Clear(); this.m_OpenedEvent.Reset(); this.m_EndEvent.Reset(); } internal void DoData() { this.TransferStatus = 4; while (this.TransferedLength < this.TransferTotalLength) { if (this.TransferStatus == 6) { if (this.Client != null && !this.Client.IsConnected) { this.OnTransferError(new TransferErrorEventArgs(new Exception("服务端关闭"))); return; } else { this.DoEnd(); return; } } int length = this.m_fileStream.Read(this.readBuffer, 0, this.PacketSize); this.SendData(UpLoadOP.DoData, this.readBuffer, 0, length); this.TransferedLength += length; this.OnTransferStep(this.TransferTotalLength, this.TransferedLength, length); } this.TransferStatus = 5; this.SendData(UpLoadOP.DoEnd, new byte[] { 1 }, 0, 1); DoEnd(); } internal void DoEnd() { this.TransferStatus = 6; this.Dispose(); if (this.FileUploadingEvents.OnTransferComplete != null) { this.FileUploadingEvents.OnTransferComplete(new EventArgs()); } } //客户端自己触发结束事件 //internal void OnDoEnd() //{ // DoEnd(); //} internal void DoUpLoad() { this.m_fileStream = new FileStream(this._fileName, FileMode.Open, FileAccess.Read); this.TransferTotalLength = this.m_fileStream.Length; UpLoadInfo t = new UpLoadInfo(this._fileName, this.m_fileStream.Length, _SaveName: this._saveName); byte[] data = SerializeHelp.Serialize(t); this.SendData(UpLoadOP.DoUpLoad, data, 0, data.Length); } private void ExecuteCommand(TransferCommandInfo commandInfo) { ICommand command; if (this.m_CommandDict.TryGetValue(commandInfo.Key, out command)) { command.ExecuteCommand(this, commandInfo); } } public void Init(EndPoint endpoint, string fileName, string saveName) { string str = ConfigurationManager.AppSettings["PacketSize"]; if (!string.IsNullOrWhiteSpace(str)) { this.PacketSize = Convert.ToInt32(str); } this.readBuffer = new byte[this.PacketSize]; this._fileName = fileName; this._saveName = saveName; UpLoadCommandBase[] baseArray = new UpLoadCommandBase[] { new CheckExist(), new TransferClientLib.UpLoad.Command.DoData(), new TransferClientLib.UpLoad.Command.DoEnd() }; foreach (UpLoadCommandBase base2 in baseArray) { this.m_CommandDict.Add(base2.Name, base2); } TcpClientSession session = new AsyncTcpSession(endpoint); session.Error += new EventHandler(this.client_Error); session.DataReceived += new EventHandler(this.client_DataReceived); session.Connected += new EventHandler(this.client_Connected); session.Closed += new EventHandler(this.client_Closed); this.Client = session; this.CommandReader = new UpLoadReader(this); } private void m_OnDataReceived(byte[] data, int offset, int length) { while (true) { if (this.CommandReader == null) return; int num; TransferCommandInfo commandInfo = this.CommandReader.GetCommandInfo(data, offset, length, out num); if (this.CommandReader.NextCommandReader != null) { this.CommandReader = this.CommandReader.NextCommandReader; } if (commandInfo != null) { this.ExecuteCommand(commandInfo); } if (num = this.UpLoadInfo.TransferLength) { this.TransferStatus = 5; thread = new Thread(new ThreadStart(() => { if (!this.m_EndEvent.WaitOne(5000)) { if (this.TransferStatus < 6) { DoEnd(); } } })); thread.IsBackground = true; thread.Start(); } } internal void OnTransferStep(long _TotalLen, long _TransferLen, int _CurrentPacket) { if (this.TransferStep != null) { this.TransferStep(new TransferStepEventArgs(_TotalLen, _TransferLen, _CurrentPacket)); } } public void DoEnd() { this.TransferSession.Close(); this.Dispose(); this.TransferStatus = 6; if (TransferComplete != null) TransferComplete(new EventArgs()); } public void OnDoEnd() { DoEnd(); } internal void OnUpLoad(TransferCommon.UpLoadInfo uploadInfo) { this.TransferStatus = 3; this.UpLoadInfo = uploadInfo; if (StartTransfer != null) { StartTransfer(new StartTransferEventArgs(uploadInfo)); } string fullPath = Path.GetFullPath(uploadInfo.SaveName); string dirPath = Path.GetDirectoryName(fullPath); if (!Directory.Exists(dirPath)) { Directory.CreateDirectory(dirPath); } this.m_fileStream = new FileStream(fullPath, FileMode.OpenOrCreate, FileAccess.Write); this.m_fileStream.SetLength(uploadInfo.FileSize); this.SendData(UpLoadOP.DoData, new byte[] { 1 }, 0, 1); } internal void SendData(UpLoadOP opCode, byte[] data, int offset, int length) { byte[] dst = new byte[length + 4]; dst[0] = (byte)((int)opCode / 256); dst[1] = (byte)((int)opCode % 256); dst[2] = (byte)(data.Length / 256); dst[3] = (byte)(data.Length % 256); Buffer.BlockCopy(data, offset, dst, 4, length); this.TransferSession.Send(dst, 0, dst.Length); } } 复制代码

程序还没写好,还要更新,请多多指点

源码:TransferSolution.zip

git os china ,为啥不用github,因为速度没有oschina快。https://git.oschina.net/dishiyicijinqiu/TransferSolution/tree/develop

QQ空间 QQ好友 新浪微博 微信扫一扫 赞赏 共11人赞赏 本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。 转藏到我的图书馆 献花(0) +1

来自: _明心见性_ > 《SuperSocket》

举报

推一荐:发原创得奖金,“原创奖励计划”来了!

猜你喜欢

0条评论

发表

请遵守用户 评论公约

查看更多评论 类似文章 更多

asp.net控件开发基础(3)

IPostBackEventHandler接口专门定义了处理回发事件的方法,说白了就是onclick事件,如果自定义控件需要处理回发事件,你就需要继承IPostBackEventHandler接口,然后实现接口的RaisePostBackEvent 方法,另外...

Microsoft .Net Remoting系列专题之三:Remoting事件处理全接触...

因此从事件的方向上看,就应该有三种形式:1、服务端订阅客户端事件2、客户端订阅服务端事件3、客户端订阅客户端事件。一、 服务端订阅...

C#局域网通信

AppendText("客户端【 "+e.UserName + "】 已启动!\n");this.lbxUserList.Items.Clear();foreach (string item in...

妈妈的三观里,藏着孩子的未来

《知否,知否》:妈妈的三观里,藏着孩子的未来。妈妈的教育里藏着孩子的未来,其中最重要的是妈妈在教育孩子时的选择。“优质的阅读能...

为C#自定义控件添加自定义事件

深入理解C#编程中的组件

public EventLoginArgs(string userID,string userName,string userPWD){OnSubmitLogin(new EventLoginArgs(txtID.Text,txtName.Text,txtPWD.Text));bLogin = TestUserInDB(new EventLoginArgs(txt...

delegate event

-定义事件。//定义事件委托 public delegate void ChangedEventHandler(object sender, EventArgs e); //可以有两个参数,分别是sender...

C#委托,事件

// 将事件处理程序添加到事件的调用列表中(即事件布线) myText.Changed += new MyText.ChangedEventHandler(myText_Changed); string str = "";...

C# 事件浅析

C# 事件浅析

外部exe窗体嵌入winform

_明心见性_

关注 对话 TA的最新馆藏徐友渔:20世纪十大哲学问题廿二史劄记目录中式建筑六大门派,中国人的骄傲!头条文章零遁产品帮助C# Unity的使用 喜欢该文的人也喜欢 更多 关闭 关闭

×

¥.00

微信或支付宝扫码支付:

开通即同意《个图VIP服务协议》

正在支付中,请勿关闭二维码!

微信支付后,该微信自动注册为你的个人图书馆账号

付费成功,还是不能使用?

复制成功!

绑定帐号,享受特权

恭喜你成为个图VIP! 在打印前,点击“下一步”观看2个提示

下一步 全部>> ● 电子书免费读 ● 全站无广告 ● 全屏阅读 ● 高品质朗读 ● 批量上传文档 ● 购书5折 ● 5千个文件夹 ● 专属客服

微信支付查找“商户单号”方法: 1.打开微信app,点击消息列表中和“微信支付”的对话 2.找到扫码支付给360doc个人图书馆的账单,点击“查看账单详情” 3.在“账单详情”页,找到“商户单号” 4.将“商户单号”填入下方输入框,点击“恢复VIP特权”,等待系统校验完成即可。

支付宝查找“商户订单号”方法: 1.打开支付宝app,点击“我的”-“账单” 2.找到扫码支付给个人图书馆的账单,点击进入“账单详情”页 3.在“账单详情”页,找到“商家订单号” 4.将“商家订单号”填入下方输入框,点击“恢复VIP特权”,等待系统校验完成即可。

已经开通VIP,还是不能打印?

请通过以下步骤,尝试恢复VIP特权 第1步在下方输入你支付的微信“商户单号”或支付宝“商家订单号” 第2步点击“恢复VIP特权”,等待系统校验完成即可

如何查找商户单号?

恢复VIP特权

正在查询...

订单号过期! 该订单于2020/09/09 23:59:59支付,VIP有效期:2020/09/09 23:59:59至2020/09/11 23:59:59!如需使用VIP功能,建议重新开通VIP

返回上一页

支付成功!

确定

已获得“发送到手机”权限!

微信扫码,在手机上查看选中内容

全部>> ● 电子书免费读 ● 全站无广告 ● 全屏阅读 ● 高品质朗读 ● 批量上传文档 ● 购书5折 ● 5千个文件夹 ● 专属客服

确定复制刚才选中的内容?

确定 复制 打印文章 发送到手机

微信扫码,在手机上查看选中内容

全屏阅读 朗读全文 分享文章 QQ空间 QQ好友 新浪微博 微信扫一扫 复制 打印文章 发送到手机

微信扫码,在手机上查看选中内容

全屏阅读 朗读全文 × ×

复制成功!

¥.00

微信或支付宝扫码支付:

开通即同意《个图VIP服务协议》

正在支付中,请勿关闭二维码!

自动续费¥12/月,可随时取消 

开通即同意《连续订阅服务协议》|《个图VIP服务协议》

全部>> ● 电子书免费读 ● 全站无广告 ● 全屏阅读 ● 高品质朗读 ● 批量上传文档 ● 购书5折 ● 5千个文件夹 ● 专属客服 ×

支付确认

1. 请在手机上打开的页面进行支付; 2. 如支付完成,请点击“支付完成”。

支付完成 取消支付


【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有