networkComms.net2.3.1开源版本,基于gpl V3协议。因为不能公开3.x版本的源码,所以基于此版本进行学习。3.X版本进行了诸多改进和Bug修复,使用方法上两者相差不大。
/// <summary>/// Connection对象  这个类是TcpConnection和 UDPConnnection连接类的父类/// Connection由以下五个文件组成 大家注意到每个类前面都有个 partial关键字/// ConnectionCreate.cs <1>/// ConnectionDelegatesHandlers.cs <2>/// ConnectionIncomingData.cs <3>/// ConnectionSendClose.cs <4>/// ConnectionStatic.cs  <5>/// </summary>/// 这部分负责接收数据,并交个networkcomms的优先级线程池处理public abstract partial class Connection{/// <summary>/// The <see cref="PacketBuilder"/> for this connection/// </summary>protected PacketBuilder packetBuilder;/// <summary>/// The current incoming data buffer/// </summary>protected byte[] dataBuffer;/// <summary>/// The total bytes read so far within dataBuffer/// </summary>protected int totalBytesRead;/// <summary>/// The thread listening for incoming data should we be using synchronous methods./// </summary>protected Thread incomingDataListenThread = null;/// <summary>/// A connection specific method which triggers any requisites for accepting incoming data/// </summary>protected abstract void StartIncomingDataListen();/// <summary>/// Attempts to use the data provided in packetBuilder to recreate something usefull. If we don't have enough data yet that value is set in packetBuilder./// </summary>/// <param name="packetBuilder">The <see cref="PacketBuilder"/> containing incoming cached data</param>protected void IncomingPacketHandleHandOff(PacketBuilder packetBuilder){try{if (NetworkComms.LoggingEnabled) NetworkComms.Logger.Trace(" ... checking for completed packet with " + packetBuilder.TotalBytesCached.ToString() + " bytes read.");if (packetBuilder.TotalPartialPacketCount == 0)throw new Exception("Executing IncomingPacketHandleHandOff when no packets exist in packetbuilder.");//Loop until we are finished with this packetBuilderint loopCounter = 0;while (true){//If we have ended up with a null packet at the front, probably due to some form of concatentation we can pull it off here//It is possible we have concatenation of several null packets along with real data so we loop until the firstByte is greater than 0if (packetBuilder.FirstByte() == 0){if (NetworkComms.LoggingEnabled) NetworkComms.Logger.Trace(" ... null packet removed in IncomingPacketHandleHandOff() from " + ConnectionInfo + ", loop index - " + loopCounter.ToString());packetBuilder.ClearNTopBytes(1);//Reset the expected bytes to 0 so that the next check starts from scratchpacketBuilder.TotalBytesExpected = 0;//If we have run out of data completely then we can return immediatelyif (packetBuilder.TotalBytesCached == 0) return;}else{//First determine the expected size of a header packetint packetHeaderSize = packetBuilder.FirstByte() + 1;//Do we have enough data to build a header?if (packetBuilder.TotalBytesCached < packetHeaderSize){if (NetworkComms.LoggingEnabled) NetworkComms.Logger.Trace(" ... ... more data required for complete packet header.");//Set the expected number of bytes and then returnpacketBuilder.TotalBytesExpected = packetHeaderSize;return;}//We have enough for a header
                        PacketHeader topPacketHeader;using(MemoryStream headerStream = packetBuilder.ReadDataSection(1, packetHeaderSize - 1))topPacketHeader = new PacketHeader(headerStream, NetworkComms.InternalFixedSendReceiveOptions);//Idiot testif (topPacketHeader.PacketType == null)throw new SerialisationException("packetType value in packetHeader should never be null");//We can now use the header to establish if we have enough payload data//First case is when we have not yet received enough dataif (packetBuilder.TotalBytesCached < packetHeaderSize + topPacketHeader.PayloadPacketSize){if (NetworkComms.LoggingEnabled) NetworkComms.Logger.Trace(" ... ... more data required for complete packet payload. Expecting " + (packetHeaderSize + topPacketHeader.PayloadPacketSize).ToString() + " total packet bytes.");//Set the expected number of bytes and then returnpacketBuilder.TotalBytesExpected = packetHeaderSize + topPacketHeader.PayloadPacketSize;return;}//Second case is we have enough dataelse if (packetBuilder.TotalBytesCached >= packetHeaderSize + topPacketHeader.PayloadPacketSize){//We can either have exactly the right amount or even more than we were expecting//We may have too much data if we are sending high quantities and the packets have been concatenated//no problem!!SendReceiveOptions incomingPacketSendReceiveOptions = IncomingPacketSendReceiveOptions(topPacketHeader);if (NetworkComms.LoggingEnabled) NetworkComms.Logger.Debug("Received packet of type '" + topPacketHeader.PacketType + "' from " + ConnectionInfo + ", containing " + packetHeaderSize.ToString() + " header bytes and " + topPacketHeader.PayloadPacketSize.ToString() + " payload bytes.");//If this is a reserved packetType we call the method inline so that it gets dealt with immediatelybool isReservedType = false;foreach (var tName in NetworkComms.reservedPacketTypeNames){//isReservedType |= topPacketHeader.PacketType == tName;if (topPacketHeader.PacketType == tName){isReservedType = true;break;}}//Only reserved packet types get completed inlineif (isReservedType){
#if WINDOWS_PHONEvar priority = QueueItemPriority.Normal;
#elsevar priority = (QueueItemPriority)Thread.CurrentThread.Priority;
#endifPriorityQueueItem item = new PriorityQueueItem(priority, this, topPacketHeader, packetBuilder.ReadDataSection(packetHeaderSize, topPacketHeader.PayloadPacketSize), incomingPacketSendReceiveOptions);if (NetworkComms.LoggingEnabled) NetworkComms.Logger.Trace(" ... handling packet type '" + topPacketHeader.PacketType + "' inline. Loop index - " + loopCounter.ToString());NetworkComms.CompleteIncomingItemTask(item);}else{QueueItemPriority itemPriority = (incomingPacketSendReceiveOptions.Options.ContainsKey("ReceiveHandlePriority") ? (QueueItemPriority)Enum.Parse(typeof(QueueItemPriority), incomingPacketSendReceiveOptions.Options["ReceiveHandlePriority"]) : QueueItemPriority.Normal);PriorityQueueItem item = new PriorityQueueItem(itemPriority, this, topPacketHeader, packetBuilder.ReadDataSection(packetHeaderSize, topPacketHeader.PayloadPacketSize), incomingPacketSendReceiveOptions);//QueueItemPriority.Highest is the only priority that is executed inline
#if !WINDOWS_PHONEif (itemPriority == QueueItemPriority.Highest){if (NetworkComms.LoggingEnabled) NetworkComms.Logger.Trace(" ... handling packet type '" + topPacketHeader.PacketType + "' with priority HIGHEST inline. Loop index - " + loopCounter.ToString());NetworkComms.CompleteIncomingItemTask(item);}else{int threadId = NetworkComms.CommsThreadPool.EnqueueItem(item.Priority, NetworkComms.CompleteIncomingItemTask, item);if (NetworkComms.LoggingEnabled) NetworkComms.Logger.Trace(" ... added completed " + item.PacketHeader.PacketType + " packet to thread pool (Q:" + NetworkComms.CommsThreadPool.QueueCount.ToString() + ", T:" + NetworkComms.CommsThreadPool.CurrentNumTotalThreads.ToString() + ", I:" + NetworkComms.CommsThreadPool.CurrentNumIdleThreads.ToString() + ") with priority " + itemPriority.ToString() + (threadId > 0 ? ". Selected threadId=" + threadId.ToString() : "") + ". Loop index=" + loopCounter.ToString() + ".");}
#elseint threadId = NetworkComms.CommsThreadPool.EnqueueItem(item.Priority, NetworkComms.CompleteIncomingItemTask, item);if (NetworkComms.LoggingEnabled) NetworkComms.Logger.Trace(" ... added completed " + item.PacketHeader.PacketType + " packet to thread pool (Q:" + NetworkComms.CommsThreadPool.QueueCount.ToString() + ", T:" + NetworkComms.CommsThreadPool.CurrentNumTotalThreads.ToString() + ", I:" + NetworkComms.CommsThreadPool.CurrentNumIdleThreads.ToString() + ") with priority " + itemPriority.ToString() + (threadId > 0 ? ". Selected threadId=" + threadId.ToString() : "") + ". Loop index=" + loopCounter.ToString() + ".");
#endif}//We clear the bytes we have just handed offif (NetworkComms.LoggingEnabled) NetworkComms.Logger.Trace("Removing " + (packetHeaderSize + topPacketHeader.PayloadPacketSize).ToString() + " bytes from incoming packet buffer from connection with " + ConnectionInfo +".");packetBuilder.ClearNTopBytes(packetHeaderSize + topPacketHeader.PayloadPacketSize);//Reset the expected bytes to 0 so that the next check starts from scratchpacketBuilder.TotalBytesExpected = 0;//If we have run out of data completely then we can return immediatelyif (packetBuilder.TotalBytesCached == 0) return;}elsethrow new CommunicationException("This should be impossible!");}loopCounter++;}}catch (Exception ex){//Any error, throw an exception.if (NetworkComms.LoggingEnabled) NetworkComms.Logger.Fatal("A fatal exception occured in IncomingPacketHandleHandOff(), connection with " + ConnectionInfo + " be closed. See log file for more information.");NetworkComms.LogError(ex, "CommsError");CloseConnection(true, 45);}}/// <summary>/// Handle an incoming CheckSumFailResend packet type/// </summary>/// <param name="packetDataSection"></param>internal void CheckSumFailResendHandler(MemoryStream packetDataSection){//If we have been asked to resend a packet then we just go through the list and resend it.
            SentPacket packetToReSend;lock (sentPacketsLocker){string checkSumRequested = NetworkComms.InternalFixedSendReceiveOptions.DataSerializer.DeserialiseDataObject<string>(packetDataSection, NetworkComms.InternalFixedSendReceiveOptions.DataProcessors, NetworkComms.InternalFixedSendReceiveOptions.Options);if (sentPackets.ContainsKey(checkSumRequested))packetToReSend = sentPackets[checkSumRequested];elsethrow new CheckSumException("There was no packet sent with a matching check sum");}//If we have already tried resending the packet 10 times something has gone horribly wrongif (packetToReSend.SendCount > 10) throw new CheckSumException("Packet sent resulted in a catastropic checksum check exception.");if (NetworkComms.LoggingEnabled) NetworkComms.Logger.Warn(" ... resending packet due to MD5 mismatch.");//Increment send count and then resend
            packetToReSend.IncrementSendCount();SendPacket(packetToReSend.Packet);}}

来自英国剑桥的c#网络通讯框架  开源版本: networkcomms2.3.1  可以进入此页面下载 networkcomms网络通讯框架学习 

【开源下载】基于TCP网络通信的即时聊天系统(IM系统)(c#源码)

[源码下载]Demo2.模拟简单登陆-效果图 基于networkcomms2.3.1

[源码下载]Demo1 客户端从服务器获取信息(基于networkcomms2.3.1)

【开源下载】基于TCP网络通信的自动升级程序c#源码

【模板下载】分享我所使用的数据库框架

【模板下载】innosetup 制作.net安装包的模板

【模板下载】分享我所使用的数据库框架

转载于:https://my.oschina.net/networkcomms/blog/382030

Connection类之ConnectionIncomingData.cs(NetworkComms 2.3.1源码了解和学习)相关推荐

  1. 响应式重工业钢铁机械类网站pbootcms模板,html5工业设备网站源码下载

    (自适应手机版)响应式重工业钢铁机械类网站pbootcms模板,html5工业设备网站源码下载. PbootCMS内核开发的网站模板,该模板适用于企业通用.营销型.钢铁.钢材.重工业.机械.工业设备. ...

  2. Android开发之6.0动态权限工具类(高德地图官方扣出来的)附源码

    感觉这个权限申请类写的比较好. 使用方法:activity直接继承就可以了. 看下mainactivity.java package com.qfy.permissiondemo;import and ...

  3. java组合语法_JAVA复用类之组合语法的使用(附源码)

    复用代码是Java众多引人注目的功能之一.但是要想成为极具革命性的语言,仅仅能够复制代码并对之加以改变是不够的,它还必须能够做更多的事情. 上述方法常为C这类过程型语言所使用,但收效并不是很好.正如J ...

  4. java刷卡计时计次源码美萍_Java 定时调配 Timer 类和定任务 TimerTask 类(一篇详细且完整的源码分析以及四种简单的使用方法)...

    前言 在我们日常生活中,我们常常会遇到有关计时器的事情.如商城类项目会在某年某月某日某时某分某秒进行特价活动,那么当时间到达这个时间点上的时候该事件就会触发. 1.Timer 类构造函数摘要 1 Ti ...

  5. JAVA并发:并发工具类CountDownLatch、CyclicBarrier、Semaphore使用及源码分析

    在 JUC 下包含了一些常用的同步工具类,今天就来详细介绍一下,CountDownLatch,CyclicBarrier,Semaphore 的使用方法以及它们之间的区别. 1 CountDownLa ...

  6. java工具类源码阅读,java学习日记第二天(实用的工具类和源码解析一Arrays)

    本帖最后由 三木猿 于 2020-9-18 11:17 编辑 每日名言 学者须先立志.今日所以悠悠者,只是把学问不曾做一件事看,遇事则且胡乱恁地打过了,此只是志不立. --朱熹 工作中经常会用到一些工 ...

  7. jdk包含java语言核心的类_1.1 jvm核心类加载器--jdk源码剖析

    目录 前提: 运行环境 1. 类加载的过程 1.1 类加载器初始化的过程 1.2 类加载的过程 1.3 类的懒加载 2. jvm核心类加载器 3. 双亲委派机制 4. 自定义类加载器 5. tomca ...

  8. 最新ChatGPT GPT-4 NLU实战之文档问答类ChatPDF功能(附ipynb与python源码及视频)——开源DataWhale发布入门ChatGPT技术新手从0到1必备使用指南手册(五)

    目录 前言 最新ChatGPT GPT-4 自然语言理解NLU实战之文档问答类ChatPDF功能 引言 ChatGPT 接口 Qdrant数据库Embedding存储 核心代码 测试 其它NLU应用及 ...

  9. 利用VS+MFC+Opencv显示图像和视频所需添加类(CvvImage.h和CvvImage.cpp的源码)。

    CvvImage.h代码: #pragma once #ifndef CVVIMAGE_CLASS_DEF #define CVVIMAGE_CLASS_DEF #include "open ...

最新文章

  1. 多读多写多实践---给初学编程者的建议
  2. python做ui自动化_[python]RobotFramework自定义库实现UI自动化
  3. mysql 多表查询 优化_Mysql 多表联合查询效率分析及优化
  4. 在Android NDK下打印log
  5. 部署Hadoop集群
  6. 热烈庆祝《大数据》成功入选中国科技核心期刊目录~
  7. 侠客风云传服务器维护,侠客风云传服务器地址
  8. Ping/Pong Buffer in ARINC429 Block transmitting Mode
  9. 百度地图API秘钥问题
  10. 【ACPC2013】马里奥赛车(01背包)
  11. rtl8811au黑苹果10.15_黑苹果10.15Catalina硬件选择+完美配置指南【接入智能家居】...
  12. Visual Studio 2010的Productivity Power Tool扩展
  13. python统计文章单词次数_Python实现的统计文章单词次数功能示例
  14. c# 采用XML的方式读取OSM文件
  15. socket read方法阻塞解决方法
  16. 编写bat命令打开文件夹或者doc,txt文件
  17. stm32 刹车 功能
  18. 区块链 10 年低谷与荣光
  19. WIN10中NVIDA打开NVIDA控制面板显示“未连接GPU显示器”问题
  20. 解决pyinstaller打包exe文件过大(菜鸟一刀切傻办法)

热门文章

  1. 如何成为一名程序员-码农
  2. 关于windows电源管理
  3. 备战18届智能车视觉组-移植野火PID调试助手遇到的问题
  4. OneFlow获得首届“全国颠覆性技术创新大赛”最高奖
  5. Python time和datetime用法小结
  6. 容易读错的常见常用字
  7. 中国医疗器械行业发展趋势及十四五需求预测报告2021-2027年版
  8. 三种方法实现scp拷贝时无需输入密码
  9. “2017CIO时代中国行-南通通州站”顺利举行
  10. python psutil.disk_Python psutil.disk_partitions方法代碼示例