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 ...
随机推荐
- 通过userAgent判断手机浏览器类型
我们可以通过userAgent来判断,比如检测某些关键字,例如:AppleWebKit*****Mobile或AppleWebKit,需要注意的是有些浏览器的userAgent中并不包含AppleWe ...
- Android-AnimationDrawable(二)
首先可以先定义一个逐帧播放的xml: <?xml version="1.0" encoding="utf-8"?> <animation-li ...
- ViewPager设置 缓存个数、页卡间距、数据更新
在使用ViewPager常用设置 1)mViewPager.setOffscreenPageLimit(2);//设置缓存view 的个数(实际有3个,缓存2个+正在显示的1个)2)mViewPage ...
- win下Velocity安装和试用
1.eclipse等就不说了 2.velocity的eclipse插件: http://www.oschina.net/p/veloeclipse(介绍) 方法1(现在基本上非常慢)http://pr ...
- Google的通用翻译机能成为未来的巴别鱼吗?
“巴别鱼,”<银河系漫游指南>轻轻朗读着,“体型很小,黄色,外形像水蛭,很可能是宇宙中最奇异的事物.它靠接收脑电波的能量为生,并且不是从其携带者身上接收,而是从周围的人身上.……如果你把一 ...
- MySQL压测中遇到的一些问题
批量insert http://blog.csdn.net/xiaoxian8023/article/details/20155429 Mysql jdbc 批处理数据,需要给jdbc连接加上rewr ...
- bjfu1252 贪心
题目意思是给出一些开区间,这些区间有的相交,有的不相交,问你能否选出一些区间,使这些区间之间都不相交,并且选出的区间数最大. 这是个典型的贪心问题了.按区间的结束位置排序,然后顺序地选取区间,只要当前 ...
- XCode修改工程名注意
以下文字转载过来,在使用的过程中遇到几个问题 1.需要在 Build phases 里面,检查下 Link Binary With Libraries 以及Compline Sources 2.Bul ...
- 使用Redis的理由
Redis是一个远程内存数据库,它不仅性能强劲,而且还具有复制特性以及为解决问题而生的独一无二的数据模型.Redis提供了5种不同类型的数据结构,各式各样的问题都可以很自然地映射到这些数据结构上:Re ...
- C语言反转字符串
也是面腾讯的一道编程题=,= 这题比较简单 代码如下: #include <stdio.h> #include <string.h> // 非递归实现字符串反转 char *r ...