c# socket通信较完善方案
entity
- #pragma warning disable 0219
- using System;
- using System.Collections.Generic;
- using System.Linq;
- using System.Text;
- using System.IO;
- /// <summary>
- /// 字节接收处理,粘包问题
- /// </summary>
- class BinaryMessageHandler : ThDispose
- {
- List<byte> bytesList = new List<byte>();
- private TAsyncTcpClient tcpClient;
- public BinaryMessageHandler(TAsyncTcpClient tcpClient)
- {
- this.tcpClient = tcpClient;
- }
- public BinaryMessageHandler()
- {
- }
- override public void SelfDispose()
- {
- tcpClient = null;
- bytesList = null;
- }
- /// <summary>
- /// 累积 字节.
- /// 每次累积后,测试是否有完整的包.
- /// </summary>
- /// <param name="buf"></param>
- public void Write(byte[] buf)
- {
- if (buf.Length > 0)
- {
- //累积字节
- bytesList.AddRange(buf);
- byte[] bytes = bytesList.ToArray<byte>();
- MemoryStream ms = new MemoryStream(bytes);
- BinaryReader reader = new BinaryReader(ms);
- int header = reader.ReadUInt16();
- if (header == ThSocketManager.TH_HEADER)
- {
- int len = reader.ReadUInt16();
- int remainLen = len - 4;
- if ((ms.Length - ms.Position) >= remainLen)
- {
- //有完整的数据包
- ms.Position = 0;
- byte[] pack = reader.ReadBytes(len);
- ReadPackage(pack);
- //移除读完的数据包
- bytesList.RemoveRange(0, len);
- }
- }
- reader.Close();
- ms.Close();
- }
- }
- /// <summary>
- /// 读取服务端响应信息.
- /// </summary>
- /// <param name="bytes"></param>
- /// <returns></returns>
- public void ReadPackage(byte[] bytes)
- {
- //处理包头
- MemoryStream ms = new MemoryStream(bytes);
- ms.Position = 0;
- BinaryReader reader = new BinaryReader(ms, Encoding.UTF8);
- ushort header = reader.ReadUInt16();
- ushort totalLen = reader.ReadUInt16();
- ushort respCode = reader.ReadUInt16();
- short signature = reader.ReadInt16();
- int dataLen = totalLen - ThSocketManager.PREFIX_LENGTH;
- byte[] dataBytes = reader.ReadBytes(dataLen);
- reader.Close();
- ms.Close();
- //调用服务端响应,包体处理器.
- tcpClient.thProtocolResp.ResponseHandler(respCode, dataBytes);
- }
- }
BinaryHand
- #pragma warning disable 0219
- using System.Text;
- using System.IO;
- class BinaryHand
- {
- /// <summary>
- /// 准备将数据发送至服务端
- /// </summary>
- /// <param name="clientId"></param>
- /// <param name="data"></param>
- /// <returns></returns>
- public static byte[] ToBytes(ushort requestCode, uint clientId, byte[] dataBytes)
- {
- MemoryStream ms = new MemoryStream();
- BinaryWriter writer = new BinaryWriter(ms);
- //2 ushort header
- writer.Write(ThSocketManager.TH_HEADER);
- //2 ushort total length
- ushort packageLen = ThSocketManager.PREFIX_LENGTH;
- if (dataBytes != null)
- {
- packageLen += (ushort)dataBytes.Length;
- }
- writer.Write(packageLen);
- //2 ushort protocol id
- writer.Write(requestCode);
- //2 short signature
- writer.Write((short)0);
- //4 unit client id
- //writer.Write(clientId);
- //x string data
- if (dataBytes != null)
- writer.Write(dataBytes);
- //计算crc,并写入[6,7]位置.
- byte[] tmpBytes = ms.ToArray();
- short signature = CRC16.Compute(tmpBytes);
- long oldPos = ms.Position;
- ms.Position = 6;
- writer.Write(signature);
- ms.Position = oldPos;
- //准备输出
- byte[] bytes = ms.ToArray();
- writer.Close();
- ms.Close();
- return bytes;
- }
- public static byte[] ToBytes(RequestCode requestCode, uint clientId, byte[] dataBytes)
- {
- return ToBytes((ushort)requestCode, clientId, dataBytes);
- }
- public byte[] ToBytes(uint clientId, string data)
- {
- byte[] dataBytes = Encoding.UTF8.GetBytes(data);
- return ToBytes(RequestCode.None, clientId, dataBytes);
- }
- /// <summary>
- /// 读取服务端响应信息.
- /// </summary>
- /// <param name="bytes"></param>
- /// <returns></returns>
- public byte[] FromBytes(byte[] bytes)
- {
- MemoryStream ms = new MemoryStream(bytes);
- ms.Position = 0;
- BinaryReader reader = new BinaryReader(ms, Encoding.UTF8);
- ushort header = reader.ReadUInt16();
- ushort totalLen = reader.ReadUInt16();
- ushort protocolId = reader.ReadUInt16();
- short signature = reader.ReadInt16();
- uint clientId = reader.ReadUInt32();
- int dataLen = totalLen - ThSocketManager.PREFIX_LENGTH;
- byte[] dataBytes = reader.ReadBytes(dataLen);
- reader.Close();
- ms.Close();
- return dataBytes;
- }
- }
- cusCom.rar (124.7 KB)
c# socket通信较完善方案的更多相关文章
- C#应用视频教程1.3 Socket通信客户端完善
我们先把前面的代码封装成一个完整的类,因为跟网络相关的方法并不一定是建立socket的服务器和客户端,所以还是应该把两个分开,比如获取本机IP,修改本机IP,PING远程主机这些事情应该放在一个单独的 ...
- Socket 通信(基础原理、实时聊天系统雏形)
什么是 Socket? Socket 英文直译为"孔或插座",也称为套接字.用于描述 IP 地址和端口号,是一种进程间的通信机制.你可以理解为 IP 地址确定了网内的唯一计算机,而 ...
- Java多线程技术:实现多用户服务端Socket通信
目录 前言回顾 一.多用户服务器 二.使用线程池实现服务端多线程 1.单线程版本 2.多线程版本 三.多用户与服务端通信演示 四.多用户服务器完整代码 最后 前言回顾 在上一篇<Java多线程实 ...
- AgileEAS.NET SOA 中间件平台.Net Socket通信框架-介绍
一.前言 AgileEAS.NET SOA 中间件平台是一款基于基于敏捷并行开发思想和Microsoft .Net构件(组件)开发技术而构建的一个快速开发应用平台.用于帮助中小型软件企业建立一条适合市 ...
- socket通信
socket通信 一:socket基于Tcp连接,数据传输有保证 二:socket连接的建立过程: 1:服务器监听 2:客户端发出请求 3:建立连接 4:通信 三:一个简单的例子:服务器端每隔一段时间 ...
- AgileEAS.NET SOA 中间件平台.Net Socket通信框架-简单例子-实现简单的服务端客户端消息应答
一.AgileEAS.NET SOA中间件Socket/Tcp框架介绍 在文章AgileEAS.NET SOA 中间件平台Socket/Tcp通信框架介绍一文之中我们对AgileEAS.NET SOA ...
- AgileEAS.NET SOA 中间件平台.Net Socket通信框架-完整应用例子-在线聊天室系统-下载配置
一.AgileEAS.NET SOA中间件Socket/Tcp框架介绍 在文章AgileEAS.NET SOA 中间件平台Socket/Tcp通信框架介绍一文之中我们对AgileEAS.NET SOA ...
- C# socket通信
最近在研究socket,今天看到很好的一篇关于socket通信的文章,故收藏了,慢慢琢磨. 我们在讲解Socket编程前,先看几个和Socket编程紧密相关的概念: 1.TCP/IP层次模型 当然这里 ...
- Flex通信-与Java实现Socket通信实例
Flex通信-与Java实现Socket通信实例 转自:http://blessht.iteye.com/blog/1136888 博客分类: Flex 环境准备 [服务器端] JDK1.6,“ja ...
随机推荐
- android 官网处理图片 代码
/** * 获取压缩后的图片 (官网大图片加载对应代码) * * @param res * @param resId * @param reqWidth * 所需图片压缩尺寸最小宽度 * @param ...
- Delphi RichEx 图像
unit RichEx; {2005-03-04 LiChengbinAdded:Insert bitmap or gif into RichEdit controls from source fil ...
- lightoj 1021 (数位DP)
题意:给你一个b进制的数,再给你一个十进制数k,你可以重新排列b进制数的每一位得到其他b进制数,问你这些数中有多少可以整除k? 思路:数位dp. #include <cstdio> #in ...
- bjfu1100 圆环
这题也是2011百度之星的一道题.知道做法后代码极简单. 不过我做完后随便上网搜了一下,发现竟然还有很多不同的做法.别的做法我就不管了,我只把我的做法的原理说清楚.我做题时是按如下顺序逐步找到规律的: ...
- 《Python 学习手册4th》 第十二章 if测试和语法规则
''' 时间: 9月5日 - 9月30日 要求: 1. 书本内容总结归纳,整理在博客园笔记上传 2. 完成所有课后习题 注:“#” 后加的是备注内容 (每天看42页内容,可以保证月底看完此书) “重点 ...
- ASP.NET导出excel表方法汇总
asp.net里导出excel表方法汇总 1.由dataset生成 public void CreateExcel(DataSet ds,string typeid,string FileName) ...
- ARM指令集----杂项指令
ARM指令集可以分为6类,即是跳转指令,数据处理指令,程序状态传输指令,Load.Store指令,协处理器指令和异常中断指令 跳转指令: 在ARM中有两种方式可以实现程序的跳转,一种是跳转指令,另一种 ...
- 怎么用PHP在HTML中生成PDF文件
原文:Generate PDF from html using PHP 译文:使用PHP在html中生成PDF 译者:dwqs 利用PHP编码生成PDF文件是一个非常耗时的工作.在早期,开发者使用PH ...
- 第四章:更多的bash shell命令
第四章:更多的bash shell命令 监测程序 ps (其他ps内容见#1 ) Unix风格的ps命令参数 参数 描述 -A 显示所有进程 -N 显示与指定参数不符的所有进程 -a 显示除控制进程( ...
- json字符串转换为JSONObject和JSONArray
一.下载json 具体到http://www.json.org/上找java-json下载,并把其放到项目源代码中,这样就可以引用其类对象了 二.具体转化过程 //JSONObject String ...