玄机论坛Socket类库源码 当前版本 2.6.3 更新日期:10-09/2015 z
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 】
/// <summary>
/// 向某一位客户端发送信息
/// </summary>
/// <param name="ip">客户端IP+端口地址</param>
/// <param name="SendData">发送的数据包</param>
public void SendToClient(IPEndPoint ip, byte[] SendDataBuffer)
- 增加掉线重连(自动复活) 方法名 : RestartInit()
- 增加几个异常推送的枚举 ErrorCode
/// <summary>
/// 具体错误类型
/// </summary>
public enum ErrorCodes
{
/// <summary>
/// 对象为null
/// </summary>
objectNull,
/// <summary>
/// 连接时发生错误
/// </summary>
ConnectError,
/// <summary>
/// 尝试发送失败异常
/// </summary>
TrySendData,
}
下面我和大家一起来分享这个类库的使用方式.
服务端的调用
先来看下服务端的界面

第一个列表框用来获取服务端状态信息.
第二个列表框用来获取客户端发来的消息.
一个下来列表框来记录客户端上线.边上的0来记录当前连接数
界面非常简洁,咱们来看类库的使用方式.
第一步,引入命名空间
当引用xuanjiSocket类库以后,请添加
using XuanJiSocket;
添加服务端类.如果没有引入命名空间,那么可以将鼠标光标置于类变量中,按快捷键 Shift + Alt + F10 自动引入类库命名空间
SocketHelper.TcpServer server;
private void ServerDemo_Load(object sender, EventArgs e)
{
server = new SocketHelper.TcpServer();//初始化变量
}
在窗体加载事件中,完成对server变量的初始化.
SocketHelper.pushSockets = new SocketHelper.PushSockets(Rec);
这是本类非常重要的委托变量.
它的作用就是推送所有信息.!请在Start前对其初始化.!
private void Rec(SocketHelper.Sockets sks)
{
}
这是处理推送器消息的方法.!
SocketHelper.Sockets
大家可以看下这个自定义对象
/// <summary>
/// 自定义Socket对象
/// </summary>
public class Sockets
{
/// <summary>
/// 接收缓冲区
/// </summary>
public byte[] RecBuffer = new byte[8 * 1024];
/// <summary>
/// 发送缓冲区
/// </summary>
public byte[] SendBuffer = new byte[8 * 1024];
/// <summary>
/// 异步接收后包的大小
/// </summary>
public int Offset { get; set; }
/// <summary>
/// 空构造
/// </summary>
public Sockets() { }
/// <summary>
/// 创建Sockets对象
/// </summary>
/// <param name="ip">Ip地址</param>
/// <param name="client">TcpClient</param>
/// <param name="ns">承载客户端Socket的网络流</param>
public Sockets(IPEndPoint ip, TcpClient client, NetworkStream ns)
{
Ip = ip;
Client = client;
nStream = ns;
}
/// <summary>
/// 当前IP地址,端口号
/// </summary>
public IPEndPoint Ip { get; set; }
/// <summary>
/// 客户端主通信程序
/// </summary>
public TcpClient Client { get; set; }
/// <summary>
/// 承载客户端Socket的网络流
/// </summary>
public NetworkStream nStream { get; set; }
/// <summary>
/// 发生异常时不为null.
/// </summary>
public Exception ex { get; set; }
/// <summary>
/// 新客户端标识.如果推送器发现此标识为true,那么认为是新的连接
/// </summary>
public bool NewClientFlag { get; set; }
}
每个属性都有注释,来解释这个属性的作用..具体处理细节.请下载demo阅读
上面那些信息绝非无用,而是整个类的重中之重以及消息处理方式.
启动类库,并开始监听
server.InitSocket(IPAddress.Any, 9527);//监听所有地址,监听端口为9527
server.Start();//启动服务端
之前在窗体加载时已经初始化过变量,现在直接使用它的InitSocket来配置服务端.使用Start方法启动监听.!
默认调用后便认为监听成功.!
如若其他情况,例如异常时: 会推送监听失败消息至服务端Rev方法中.具体参阅源码.
停止服务端
直接调用Stop方法即可停止服务端.Stop方法调用后,可继续启动服务端.!
至此,服务端的描述就介绍完了,使用非常简单,
你要做的就下面几件事:
1 、 声明服务端变量。
2 、 初始化推送器。
3 、 配置服务端。
4 、 启动服务端
服务端发送信息
服务端有两个自带方法
server.SendToAll("服务端消息:www.xuanjics.com 随机消息:"+Guid.NewGuid().ToString());//直接发送字符串
该方法将会对所有连接至服务端的客户端发送消息.如果在发送中客户端下线或发生异常,服务端将维护客户端集合 ClientList
ClientList 会在客户端接入时添加.如果发生异常等情况会自动删除
SendToClient(IPEndPoint ip, string SendData);
像单独某位客户发起数据.
当客户端连接时,除去ClientList会自动维护列表外,也会将客户端推送至UI界面,供大家组合自己想要的客户端列表.详细请阅读demo
客户端介绍

客户端与服务端一样,需要先声明客户端变量,
SocketHelper.TcpClients client; //声明客户端变量 与服务端一样在窗体加载时初始化.
接着初始化推送器,
SocketHelper.pushSockets = new SocketHelper.PushSockets(Rec);//在窗体加载时初始化推送器
配置客户端,启动客户端.
client.InitSocket(ip, int.Parse(port)); //IP地址支持字符串类型
client.Start();
客户端发送方法,与服务端一致.调用Send方法.调用Start方法来连接服务器,调用Stop方法断开连接.支持断开后重新连接服务端
最后来一张运行时的截图吧

Demo + 类库下载地址:

(164.76 KB, 下载次数: 586, 售价: 1 紫晶)
玄机论坛Socket类库源码 当前版本 2.6.3 更新日期:10-09/2015 z的更多相关文章
- TCP/IP以及Socket聊天室带类库源码分享
TCP/IP以及Socket聊天室带类库源码分享 最近遇到个设备,需要去和客户的软件做一个网络通信交互,一般的我们的上位机都是作为客户端来和设备通信的,这次要作为服务端来监听客户端,在这个背景下,我查 ...
- 配置Eclipse可以查看JDK类库源码
一.配置方法 配置Eclipse可以查看JDK类库源码 Window->Preferences->Java->Installed JREs 若没有JRE,需要自己添加进来,有的话,点 ...
- Android studio导入第三方类库源码以及jar包
新建一个Android项目,项目结构如下: 1.添加第三方类库源码 首先将第三方类库考入与app同级的目录下: 之后,在build.gradle(Moudule:app)下添加编译代码:在seting ...
- 编译最新版webrtc源码和编译好的整个项目10多个G【分享】
编译最新版webrtc源码和编译好的整个项目10多个G[分享] 参考https://webrtc.org/native-code/development/编译最新版webrtc源码: Git clon ...
- 实现Discuz论坛客户端应用源码
通过使用该源码,开发者可以迅速地将Discuz论坛迁移到Android客户端中.不需要任何的开发工作即可拥有属于自己论坛的Android客户端 源码下载:http://code.662p.com/vi ...
- .net运行时和核心类库源码(部分源码)微软官方下载
部分类库代码:http://referencesource.microsoft.com/download.html 运行时clr源码: http://www.microsoft.com/en-us/d ...
- 基础拾遗----RabbitMQ(含封装类库源码)
基础拾遗 基础拾遗------特性详解 基础拾遗------webservice详解 基础拾遗------redis详解 基础拾遗------反射详解 基础拾遗------委托详解 基础拾遗----- ...
- 中文情感分析——snownlp类库 源码注释及使用
最近发现了snownlp这个库,这个类库是专门针对中文文本进行文本挖掘的. 主要功能: 中文分词(Character-Based Generative Model) 词性标注(TnT 3-gram 隐 ...
- 非常出色的一款WinForm窗体重绘GUI类库源码
基本控件的演示 ScrollBar滚动条 各种圆形进度条 ProgressBar进度条 Mdi演示,仿谷歌浏览器 多种皮肤可供选择 一套专业级别的GUI控件,目前包含了窗体.进度条.滚动条以及MDI多 ...
随机推荐
- solr 主从模式和solrcloud集群模式
主从模式 主节点有单点故障问题:没有主从自动切换,没有failover,主机down掉了的话,整个数据变成只读.并且需要一台机单独做索引,浪费资源,所有数据都需要在这台机器上单独存在一份,索引变化较大 ...
- OkHttpUtils
对okhttp的封装类,okhttp见:https://github.com/square/okhttp.目前对应okhttp版本3.3.1. 用法: Android Studio compile ' ...
- [Programming Entity Framework] 第3章 查询实体数据模型(EDM)(一)
http://www.cnblogs.com/sansi/archive/2012/10/18/2729337.html Programming Entity Framework 第二版翻译索引 你可 ...
- HTTPS(SSL)详解以及PHP调用方法
HTTPS 详解 1. 两个加密秘钥的概念 (1) 对称加密 即加密的秘钥和解密的秘钥一样 (2) 非对称加密 即加密的秘钥和解密的秘钥不一样, 分别称为公钥 和 私钥, 公钥完全公开 私钥解密者 ...
- FineReader Mac如何设置参数让导出为DOCX/RTF/ODT格式
Mac版ABBYY FineReader OCR文字识别软件识别文档之后,可以将已识别的文本保存到文件中,还可以通过电子邮件发送输出格式受FineReader支持的已识别文本,了解了ABBYY Fin ...
- WITH SCHEMABINDING
SCHEMABINDING 选项,防止视图所引用的表在视图未被调整的情况下发生改变的选项. 也就是说,一旦视图被指定了WITH SCHEMABINDING 选项,那么,在修改用于 ...
- 【转】php利用mkdir创建多级目录
先介绍一下 mkdir() 这个函数: mkdir($path,0777,true); 第一个参数:必须,代表要创建的多级目录的路径: 第二个参数:设定目录的权限,默认是 0777,意味着最大可能的访 ...
- android数据存储之SharedPreferences
一.SharedPreferences简介 (1)SharedPreferences是Android平台上一个轻量级的存储类,用来保存应用的一些常用配置,比如Activity状态,Activ ...
- PCA的数学原理
PCA(Principal Component Analysis)是一种常用的数据分析方法.PCA通过线性变换将原始数据变换为一组各维度线性无关的表示,可用于提取数据的主要特征分量,常用于高维 数据的 ...
- 目录操作工具类 CopyDir.java
package com.util; import java.io.*; /** * 1,建立目的目录. 2,遍历源目录. 3,遍历过程中,创建文件或者文件夹. 原理:其实就是改变了源文件或者目录的目录 ...