热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

玄机论坛Socket类库源码当前版本2.6.3更新日期:1009/2015z

http:bbs.msdn5.comthread-27-1-1.html本类库采用TcpLister,TcpClient高度封装,采用NetworkStream进行异步模式读取数据

http://bbs.msdn5.com/thread-27-1-1.html

本类库采用TcpLister,TcpClient高度封装,
采用NetworkStream进行异步模式读取数据.
采用Semaphore来进行并发控制,
放弃异步的最大原因还是在对于新手朋友来说难以理解异步的处理方式,在本类库中还有一个没有加入工程的asynchelper,这个类库是纯异步实现.
当前处理方式:  异步+同步 ,海量数据并发不是靠异步就能解决的问题,在对学习Socket和想快速使用Socket的朋友来说,同步是很好的选择.
可同时接受5000+连接同时访问,而CPU消耗完全忽略不计..
本着代码简洁,简单.通俗易懂的原则,进行代码封装,不像其他通信框架写很多各式各样的接口.对新手朋友和刚接触通信程序的朋友带来很大的困扰.
本代码完全开源,但请保留署名,以示尊重.!

感谢 tan133 对本类库的支持,几乎几个更新的bug/不人性化 都是他找出来的.很给力..

更新日志

 

  • 2.6.3
  • 修正缓冲区大小为1024
  • 新增服务端重载,可监听所有网卡
  • 修正若干小bug.


  • 2.6.2修正部分
  • 增加服务端Demo多次开启判断.
  • 增加ErrorCode中的ConnectSuccess状态(用于推送连接状态)
  • 修正一写无用/冗余代码
  • 增加客户端Demo状态推送扩展


ErrorCode可以自行扩展为StatusCode,用来区分不同的状态.



  • 修改原发送sendData 方法为SendToClient  允许直接发送byte数组
  • 增加 SendToClient 重载  【 直接发送byte 】
[C#] 纯文本查看

///


/// 向某一位客户端发送信息
///

/// 客户端IP+端口地址
/// 发送的数据包
public void SendToClient(IPEndPoint ip, byte[] SendDataBuffer)


  • 增加掉线重连(自动复活)   方法名 : RestartInit()
  • 增加几个异常推送的枚举  ErrorCode
[C#] 纯文本查看

///


/// 具体错误类型
///

public enum ErrorCodes
{
///
/// 对象为null
///

objectNull,
///
/// 连接时发生错误
///

ConnectError,
///
/// 尝试发送失败异常
///

TrySendData,
}


下面我和大家一起来分享这个类库的使用方式.

服务端的调用


先来看下服务端的界面

第一个列表框用来获取服务端状态信息.
第二个列表框用来获取客户端发来的消息.
一个下来列表框来记录客户端上线.边上的0来记录当前连接数

界面非常简洁,咱们来看类库的使用方式.

第一步,引入命名空间


当引用xuanjiSocket类库以后,请添加

[C#] 纯文本查看

using XuanJiSocket;


添加服务端类.如果没有引入命名空间,那么可以将鼠标光标置于类变量中,按快捷键 Shift + Alt + F10 自动引入类库命名空间

[C#] 纯文本查看

SocketHelper.TcpServer server;

 

[C#] 纯文本查看

  private void ServerDemo_Load(object sender, EventArgs e)
{
server = new SocketHelper.TcpServer();//初始化变量

}


在窗体加载事件中,完成对server变量的初始化.

SocketHelper.pushSockets = new SocketHelper.PushSockets(Rec);


这是本类非常重要的委托变量.
它的作用就是推送所有信息.!请在Start前对其初始化.!

[C#] 纯文本查看

private void Rec(SocketHelper.Sockets sks)
{
}


这是处理推送器消息的方法.!

SocketHelper.Sockets


大家可以看下这个自定义对象

[C#] 纯文本查看

///


/// 自定义Socket对象
///

public class Sockets
{
///
/// 接收缓冲区
///

public byte[] RecBuffer = new byte[8 * 1024];  
///
/// 发送缓冲区
///

public byte[] SendBuffer = new byte[8 * 1024];
///
/// 异步接收后包的大小
///

public int Offset { get; set; }
///
/// 空构造
///

public Sockets() { }
///
/// 创建Sockets对象
///

/// Ip地址
/// TcpClient
/// 承载客户端Socket的网络流
public Sockets(IPEndPoint ip, TcpClient client, NetworkStream ns)
{
Ip = ip;
Client = client;
nStream = ns;
}
///
/// 当前IP地址,端口号
///

public IPEndPoint Ip { get; set; }
///
/// 客户端主通信程序
///

public TcpClient Client { get; set; }
///
/// 承载客户端Socket的网络流
///

public NetworkStream nStream { get; set; }
///
/// 发生异常时不为null.
///

public Exception ex { get; set; }
///
/// 新客户端标识.如果推送器发现此标识为true,那么认为是新的连接
///

public bool NewClientFlag { get; set; }
}



每个属性都有注释,来解释这个属性的作用..具体处理细节.请下载demo阅读
上面那些信息绝非无用,而是整个类的重中之重以及消息处理方式.

启动类库,并开始监听

 

[C#] 纯文本查看

server.InitSocket(IPAddress.Any, 9527);//监听所有地址,监听端口为9527
server.Start();//启动服务端


之前在窗体加载时已经初始化过变量,现在直接使用它的InitSocket来配置服务端.使用Start方法启动监听.!
默认调用后便认为监听成功.!
如若其他情况,例如异常时: 会推送监听失败消息至服务端Rev方法中.具体参阅源码.

停止服务端


直接调用Stop方法即可停止服务端.Stop方法调用后,可继续启动服务端.!
至此,服务端的描述就介绍完了,使用非常简单,
你要做的就下面几件事:
                                               1 、 声明服务端变量。
                                               2 、 初始化推送器。
                                               3 、 配置服务端。
                                               4 、 启动服务端

服务端发送信息


服务端有两个自带方法
                    

[C#] 纯文本查看

  server.SendToAll("服务端消息:www.xuanjics.com 随机消息:"+Guid.NewGuid().ToString());//直接发送字符串


该方法将会对所有连接至服务端的客户端发送消息.如果在发送中客户端下线或发生异常,服务端将维护客户端集合 ClientList
ClientList  会在客户端接入时添加.如果发生异常等情况会自动删除

[C#] 纯文本查看

SendToClient(IPEndPoint ip, string SendData);


像单独某位客户发起数据.
当客户端连接时,除去ClientList会自动维护列表外,也会将客户端推送至UI界面,供大家组合自己想要的客户端列表.详细请阅读demo

客户端介绍



客户端与服务端一样,需要先声明客户端变量,

[C#] 纯文本查看

SocketHelper.TcpClients client; //声明客户端变量 与服务端一样在窗体加载时初始化.


接着初始化推送器,

[C#] 纯文本查看

SocketHelper.pushSockets = new SocketHelper.PushSockets(Rec);//在窗体加载时初始化推送器


配置客户端,启动客户端.

[C#] 纯文本查看

client.InitSocket(ip, int.Parse(port)); //IP地址支持字符串类型
client.Start();


客户端发送方法,与服务端一致.调用Send方法.调用Start方法来连接服务器,调用Stop方法断开连接.支持断开后重新连接服务端


最后来一张运行时的截图吧


Demo + 类库下载地址:

XuanJiSocketDemo_2.6.4.zip (164.76 KB, 下载次数: 586, 售价: 1 紫晶)



推荐阅读
  • Nginx使用(server参数配置)
    本文介绍了Nginx的使用,重点讲解了server参数配置,包括端口号、主机名、根目录等内容。同时,还介绍了Nginx的反向代理功能。 ... [详细]
  • 本文分享了一个关于在C#中使用异步代码的问题,作者在控制台中运行时代码正常工作,但在Windows窗体中却无法正常工作。作者尝试搜索局域网上的主机,但在窗体中计数器没有减少。文章提供了相关的代码和解决思路。 ... [详细]
  • 目录实现效果:实现环境实现方法一:基本思路主要代码JavaScript代码总结方法二主要代码总结方法三基本思路主要代码JavaScriptHTML总结实 ... [详细]
  • android listview OnItemClickListener失效原因
    最近在做listview时发现OnItemClickListener失效的问题,经过查找发现是因为button的原因。不仅listitem中存在button会影响OnItemClickListener事件的失效,还会导致单击后listview每个item的背景改变,使得item中的所有有关焦点的事件都失效。本文给出了一个范例来说明这种情况,并提供了解决方法。 ... [详细]
  • 本文介绍了Perl的测试框架Test::Base,它是一个数据驱动的测试框架,可以自动进行单元测试,省去手工编写测试程序的麻烦。与Test::More完全兼容,使用方法简单。以plural函数为例,展示了Test::Base的使用方法。 ... [详细]
  • 计算机存储系统的层次结构及其优势
    本文介绍了计算机存储系统的层次结构,包括高速缓存、主存储器和辅助存储器三个层次。通过分层存储数据可以提高程序的执行效率。计算机存储系统的层次结构将各种不同存储容量、存取速度和价格的存储器有机组合成整体,形成可寻址存储空间比主存储器空间大得多的存储整体。由于辅助存储器容量大、价格低,使得整体存储系统的平均价格降低。同时,高速缓存的存取速度可以和CPU的工作速度相匹配,进一步提高程序执行效率。 ... [详细]
  • 如何自行分析定位SAP BSP错误
    The“BSPtag”Imentionedintheblogtitlemeansforexamplethetagchtmlb:configCelleratorbelowwhichi ... [详细]
  • 本文介绍了Python高级网络编程及TCP/IP协议簇的OSI七层模型。首先简单介绍了七层模型的各层及其封装解封装过程。然后讨论了程序开发中涉及到的网络通信内容,主要包括TCP协议、UDP协议和IPV4协议。最后还介绍了socket编程、聊天socket实现、远程执行命令、上传文件、socketserver及其源码分析等相关内容。 ... [详细]
  • 数据结构系列1 数组和链表
    数组,链表,l ... [详细]
  • 本文介绍了Redis的基础数据结构string的应用场景,并以面试的形式进行问答讲解,帮助读者更好地理解和应用Redis。同时,描述了一位面试者的心理状态和面试官的行为。 ... [详细]
  • Java容器中的compareto方法排序原理解析
    本文从源码解析Java容器中的compareto方法的排序原理,讲解了在使用数组存储数据时的限制以及存储效率的问题。同时提到了Redis的五大数据结构和list、set等知识点,回忆了作者大学时代的Java学习经历。文章以作者做的思维导图作为目录,展示了整个讲解过程。 ... [详细]
  • 本文详细介绍了Linux中进程控制块PCBtask_struct结构体的结构和作用,包括进程状态、进程号、待处理信号、进程地址空间、调度标志、锁深度、基本时间片、调度策略以及内存管理信息等方面的内容。阅读本文可以更加深入地了解Linux进程管理的原理和机制。 ... [详细]
  • Android JSON基础,音视频开发进阶指南目录
    Array里面的对象数据是有序的,json字符串最外层是方括号的,方括号:[]解析jsonArray代码try{json字符串最外层是 ... [详细]
  • [大整数乘法] java代码实现
    本文介绍了使用java代码实现大整数乘法的过程,同时也涉及到大整数加法和大整数减法的计算方法。通过分治算法来提高计算效率,并对算法的时间复杂度进行了研究。详细代码实现请参考文章链接。 ... [详细]
  • 本文讨论了在openwrt-17.01版本中,mt7628设备上初始化启动时eth0的mac地址总是随机生成的问题。每次随机生成的eth0的mac地址都会写到/sys/class/net/eth0/address目录下,而openwrt-17.01原版的SDK会根据随机生成的eth0的mac地址再生成eth0.1、eth0.2等,生成后的mac地址会保存在/etc/config/network下。 ... [详细]
author-avatar
deniz2502915157
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有