利用SocketAsyncEventArgs类来实现Socket通讯,

代码参考 https://docs.microsoft.com/en-us/dotnet/api/system.net.sockets.socketasynceventargs?redirectedfrom=MSDN&view=netframework-4.8

期中数据粘包是用的固定包头加数据长度解决的.

   /// <summary>/// 接受数据/// </summary>/// <param name="data">接受数据</param>/// <param name="length">接受数据长度</param>public void RecveData(byte[] data, int length){if (!isAction)return;if (0 == length)return;if (currentDataLength < headLength){HandleHeadData(data, length);}else{HandleBodyData(data, length);}}/// <summary>/// 处理包头/// </summary>/// <param name="data"></param>/// <param name="length"></param>private void HandleHeadData(byte[] data, int length){if (!isAction)return;try{var tempLength = currentDataLength + length;if (tempLength < headLength){Buffer.BlockCopy(data, 0, headData, currentDataLength, length);currentDataLength += length;}else{var tempHandLength = headLength - currentDataLength;Buffer.BlockCopy(data, 0, headData, currentDataLength, tempHandLength);currentDataLength += tempHandLength;bodyLength = GetBodyDataLenght(headData);bodyData = new byte[bodyLength];var tempLenght = length - tempHandLength;if (tempLenght > 0){var tempBodyData = new byte[tempLenght];Buffer.BlockCopy(data, tempHandLength, tempBodyData, 0, tempLenght);RecveData(tempBodyData, tempLenght);}else{HandlComplete();}}}catch (Exception e){Log.LogError(e);}}/// <summary>/// 处理包体/// </summary>/// <param name="data"></param>/// <param name="lenth"></param>private void HandleBodyData(byte[] data, int lenth){if (!isAction)return;if (null == bodyData)return;var tempDataLength = currentDataLength - headData.Length + lenth;if (tempDataLength == bodyLength){Buffer.BlockCopy(data, 0, bodyData, currentDataLength - headLength, lenth);currentDataLength += lenth;HandlComplete();}else if (tempDataLength > bodyLength){var tempLength = bodyLength - (currentDataLength - headData.Length);Buffer.BlockCopy(data, 0, bodyData, currentDataLength - headLength, tempLength);currentDataLength += tempLength;HandlComplete();var tempOverLength = lenth - tempLength;var tempOverData = new byte[tempOverLength];Buffer.BlockCopy(data, tempLength, tempOverData, 0, tempOverLength);RecveData(tempOverData, tempOverLength);}else{Buffer.BlockCopy(data, 0, bodyData, currentDataLength, lenth);currentDataLength += lenth;}}

处理数据

工程地址

链接:https://pan.baidu.com/s/1lNNpTBNegRN411m0Lnd47A
提取码:079f

转载于:https://www.cnblogs.com/PandaHome/p/10996731.html

Socket系列3 Socket服务端开发 数据的接收和发送相关推荐

  1. Java中Socket通信-客户端与服务端相互传输对象数据

    场景 Java中Socket通信-服务端和客户端双向传输字符串实现: https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/1084885 ...

  2. java Socket Tcp示例三则(服务端处理数据、上传文件)

    示例一: package cn.itcast.net.p5.tcptest; import java.io.BufferedReader; import java.io.IOException; im ...

  3. 在Java中使用Socket模拟客户端和服务端(多线程)

    1:Socket与ServerSocket的交互 2.Socket和ServerSocket介绍 Socket 构造函数 Socket() Socket(InetAddress address, in ...

  4. Java中利用socket实现简单的服务端与客户端的通信(中级)——实现任意双向通信

    本文计划采用socket实现客户端和服务端的任意双向通信,即客户端可以随时给服务端发消息,服务端也可以随时给客户端发消息,最终结果就是一个类似与QQ的聊天软件的功能. 以下代码可以直接拷贝到Eclip ...

  5. Java中利用socket实现简单的服务端与客户端的通信(基础级)

    在上一篇文章中,简单的介绍了java中入门级的socket编程,简单的实现了客户端像服务器端发送数据,服务器端将数据接收并显示在控制台,没有涉及多线程.上一篇文章的链接:Java中利用socket实现 ...

  6. Python基于socket实现的TCP服务端

    ''' 基于socket实现的TCP服务端 '''import socket # 建立socket对象 server_socket=socket.socket(socket.AF_INET,socke ...

  7. php socket 握手,python Socket之客户端和服务端握手详细介绍

    这篇文章主要为大家详细介绍了python Socket之客户端和服务端握手,具有一定的参考价值,感兴趣的小伙伴们可以参考一下 简单的学习下利用socket来建立客户端和服务端之间的连接并且发送数据 1 ...

  8. php winform通信,C# Winform 通过Socket实现客户端和服务端TCP通信

    操作界面如下: 1.声明Socket 第一个参数:寻址方式,第二个参数:传输数据的方式,第三个参数:通信协议 Socket socket = new Socket(AddressFamily.Inte ...

  9. 网络游戏《丛林战争》开发与学习之(二):粘包分包现象以及服务端解析数据

    本篇博客主要介绍数据发送和接收时遇到的粘包和分包现象,以及实现服务端解析收到消息的代码,本节的代码是在第(一)部分的基础上进行的,可以先浏览下第一部分https://blog.csdn.net/s13 ...

最新文章

  1. 【npm第4期】文件系统操作的跨平台兼容
  2. Service与AIDL详解
  3. 哪款笔记本电脑好_扫地机器人哪个牌子好?口碑最好的扫地机器人
  4. ArrayList实现原理及源码分析之JDK8
  5. 使用PowerDesigner
  6. 2013年计算机试题(四),2013年计算机一级考试试题(精简版):第四套
  7. 第四天 轨道交通仿真入门
  8. Micropython进阶小实验 如何用单片机制作鞋码匹配仪
  9. Quadro P5200 - 最强大的移动工作站显卡 专门为了惠普 VR Z 背包电脑而发布
  10. 卡尔曼(Kalman)滤波 C++
  11. 揭秘电信“龙计划”:合约手机将执行“四统一”
  12. IDEA 导入Junit.jar 包 ,使用 Junit 单元测试过程
  13. 基于单片机c语言的豆浆机,基于单片机的全自动豆浆机控制系统设计.doc
  14. 简析项目中常用的七参数转换法和四参数转换法以及涉及到的基本测量学知识...
  15. TypeScript (TS
  16. 10:满足条件的数累加
  17. Element组件引发的Vue中mixins使用,写出高复用组件
  18. 计算机网络技术班级16字口号,校运会班级口号16字押韵有气势
  19. linux下怎么卸载ogg,linux安装ogg
  20. maya表情blendshape_三维动画表情控制曲线与BlendShape的使用技巧

热门文章

  1. java.lang.ClassCastException: android.widget.LinearLayout$LayoutParams
  2. android 隐藏手机底部虚拟按键
  3. 03-运行时数据区概述及线程
  4. Android Platform Codenames, Versions, API Levels, and NDK Releases
  5. Krpano skin_settings解释
  6. java.lang包—枚举类Enum
  7. MySQL 用户创建及设置
  8. python_atp框架
  9. ant+jmeter
  10. spring 学习总结