socket 通信 异步接收

问题描述

privatevoidReceiveCallBack(IAsyncResultar){StateObjectstate=(StateObject)ar.AsyncState;SocketserverSocket=state.workSocket;try{intbytesRead=serverSocket.EndReceive(ar);if(bytesRead>0){byte[]data=newbyte[bytesRead];//实际接收的数据Buffer.BlockCopy(state.buffer,0,data,0,data.Length);ar.AsyncWaitHandle.Close();Event_ReceiveData(serverSocket,data);state.buffer=newbyte[StateObject.BufferSize];serverSocket.BeginReceive(state.buffer,0,StateObject.BufferSize,SocketFlags.None,newAsyncCallback(ReceiveCallBack),state);}}catch(SocketExceptionex){if(ex.Message.IndexOf("远程主机强迫关闭了一个现有的连接")!=-1){listSocket.Remove(serverSocket);}else{throwex;}}}publicclassStateObject{//服务器/客户端的套接字publicSocketworkSocket=null;//缓冲区的大小.publicconstintBufferSize=1024;//缓冲区bufFer.publicbyte[]buffer=newbyte[BufferSize];//将收到的buffer转出string.publicStringBuildersb=newStringBuilder();}

以上代码是异步接收数据的代码服务器端给我发送一次数据的时候这个方法走了两次是什么情况

解决方案

解决方案二:
参考一下吧
解决方案三:
TCP粘包导致的多次接受
解决方案四:
如果你发过来的包太长了,就分两次接收,这是正常的。
解决方案五:
引用3楼wyd1520的回复:

如果你发过来的包太长了,就分两次接收,这是正常的。

我定义的是1024每次发送都小于1024
解决方案六:
还有Socket发包时有一个缓冲区,如果底层的缓冲区被修改为较短的话也会分包;总而言之,就是一个半包的现象,你再从发送到接收的流程过一遍,看看是什么地方导致了这个问题。这个问题如果是在不同电脑间传数据,是会经常发生的,其他还有粘包现象。
解决方案七:
引用楼主l397870376的回复:

privatevoidReceiveCallBack(IAsyncResultar){StateObjectstate=(StateObject)ar.AsyncState;SocketserverSocket=state.workSocket;try{intbytesRead=serverSocket.EndReceive(ar);if(bytesRead>0){byte[]data=newbyte[bytesRead];//实际接收的数据Buffer.BlockCopy(state.buffer,0,data,0,data.Length);ar.AsyncWaitHandle.Close();Event_ReceiveData(serverSocket,data);state.buffer=newbyte[StateObject.BufferSize];serverSocket.BeginReceive(state.buffer,0,StateObject.BufferSize,SocketFlags.None,newAsyncCallback(ReceiveCallBack),state);}}catch(SocketExceptionex){if(ex.Message.IndexOf("远程主机强迫关闭了一个现有的连接")!=-1){listSocket.Remove(serverSocket);}else{throwex;}}}publicclassStateObject{//服务器/客户端的套接字publicSocketworkSocket=null;//缓冲区的大小.publicconstintBufferSize=1024;//缓冲区bufFer.publicbyte[]buffer=newbyte[BufferSize];//将收到的buffer转出string.publicStringBuildersb=newStringBuilder();}

以上代码是异步接收数据的代码服务器端给我发送一次数据的时候这个方法走了两次是什么情况

很正常,tcp是基于流的,发送一次,多次接收,或者发送了多个小包,一次接收,都正常只要发送和接收双方约定好数据格式,做好数据拼包和分包就没有问题
解决方案八:
TCP是数据流,只管顺序正确不管批次,你以为的发一次数据不一定是收一次就全了,要自己拼接
解决方案九:
引用4楼l397870376的回复:

Quote: 引用3楼wyd1520的回复:
如果你发过来的包太长了,就分两次接收,这是正常的。

我定义的是1024每次发送都小于1024

就算你定义2字节,也有可能1个1个的接收。。。
解决方案十:
引用8楼wyd1520的回复:

Quote: 引用4楼l397870376的回复:
Quote: 引用3楼wyd1520的回复:
如果你发过来的包太长了,就分两次接收,这是正常的。

我定义的是1024每次发送都小于1024

就算你定义2字节,也有可能1个1个的接收。。。

我每次接收到的都是完整数据啊我解析出来的数据也是服务器发送的数据现在的问题是服务器发送一次数据我这接收两次而且两次都是完整的

时间: 2024-10-01 00:07:37

socket 通信 异步接收的相关文章

Java Socket通信(一)之客户端程序 发送和接收数据_java

网络应用分为客户端和服务端两部分,而Socket类是负责处理客户端通信的Java类.通过这个类可以连接到指定IP或域名的服务器上,并且可以和服务器互相发送和接受数据. 对于Socket通信简述,服务端往Socket的输出流里面写东西,客户端就可以通过Socket的输入流读取对应的内容.Socket与Socket之间是双向连通的,所以客户端也可以往对应的Socket输出流里面写东西,然后服务端对应的Socket的输入流就可以读出对应的内容. 例1:客户端的简略写法(一). Socket clien

socket通信inputStream.read(byte)读取速度小于接收速度,导致多帧数据叠加在一起。

问题描述 在socket通信中,由于inputStream.read(byte)是尽可能的读byte[]大小的数据,当服务端发送数据速度大于客户端读取数据的速度时,就会出现客户端读到多帧连在一起的报文.而这些发送数据,读取数据的速度是未知的.怎么解决这个问题,服务器端不能改变, 解决方案 解决方案二:想办法将读取的后续动作的耗时降低.比如读取动作只负责读取,读取的内容传给多线程进行处理.解决方案三:没用.....解决方案四:想到了一个办法,把所有读的数据放到一起,不管每次读的是多少,放在所接收数

java nio socket 异步接收数据

问题描述 nio socket 异步接收数据,如何确定收接的数据,就是发送的返回的?有谁研究过没. 问题补充:如果不用id,nio客户端是否可以同步接收数据呢?是把socketChannel.configureBlocking(true)吗? 解决方案 在消息中增加UUID,在调用端记录UUID,并将UUID和消息一起发送到服务端,服务端的回传消息附件上UUID,调用端根据收到的消息包含的UUID确定给哪个调用者.解决方案二:异步调用的常见问题.因为没有办法实施返回,只有打标志了.要你把通信协议

C#使用Protocol Buffer(ProtoBuf)进行Unity中的Socket通信_C#教程

首先来说一下本文中例子所要实现的功能: 基于ProtoBuf序列化对象 使用Socket实现时时通信 数据包的编码和解码 下面来看具体的步骤: 一.Unity中使用ProtoBuf 导入DLL到Unity中, 创建网络传输的模型类: using System; using ProtoBuf; //添加特性,表示可以被ProtoBuf工具序列化 [ProtoContract] public class NetModel { //添加特性,表示该字段可以被序列化,1可以理解为下标 [ProtoMem

使用Socket通信实现Silverlight客户端实时数据的获取(模拟GPS数据,地图实时位置)

原文:使用Socket通信实现Silverlight客户端实时数据的获取(模拟GPS数据,地图实时位置) 在上一篇中说到了Silverlight下的Socket通信,在最后的时候说到本篇将会结合地图.下面就来看看本文实现的功能: Silverlight 与服务器利用Socket通讯,实时从服务器获取数据(本文中的数据是地理坐标),由于没有GPS,所以本文在服务器写了一个构造新坐标的函数(本文是一个三角函数),然后利用Timer组件,实时调用,得到新的坐标,并将新的坐标发送给客户端,客户端接收到发

AgileEAS.NET SOA 中间件平台.Net Socket通信框架-介绍

一.前言      AgileEAS.NET SOA 中间件平台是一款基于基于敏捷并行开发思想和Microsoft .Net构件(组件)开发技术而构建的一个快速开发应用平台.用于帮助中小型软件企业建立一条适合市场快速变化的开发团队,以达到节省开发成本.缩短开发时间,快速适应市场变化的目的.      AgileEAS.NET SOA中间件平台提供了敏捷快速开发软件工程的最佳实践,通过提供大量的基础支撑功能如IOC.ORM.SOA.分布式体系及敏捷并发开发方法所支撑的插件开发体系,以及提供了大量的

socket-androidSocket通信TCP接收数据问题

问题描述 androidSocket通信TCP接收数据问题 rivate Button send; private TextView rec; private static Socket client; private PrintWriter write; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layou

Android客户端与PC服务器如何实现Socket通信

本文介绍Android终端持续扫描AP信息并发送给服务器端的实现.首先基于TCP协议在Android终端和PC两端之间形成网络虚拟链路.使用ServerSocket创建TCP服务器端,然后在Android客户端使用Socket的构造器来连接服务器.其中Android终端通过WIFI连接和PC处于同一局域网. 1. PC服务器启用ServerSocket 两个通信实体在建立虚拟链路之前,需要有一方先准备好,主动接受来自其他通信实体的连接请求. 使用ServerSocket对象监听来自客户端的Soc

PHP的Socket通信之UDP通信实例

本文实例讲述了PHP的Socket通信之UDP通信方法.分享给大家供大家参考.具体如下: 1.创建一简单的UDP服务器 ? 18//服务器信息 $server = 'udp://127.0.0.1:9998'; //消息结束符号 $msg_eof = "n"; $socket = stream_socket_server($server, $errno, $errstr, STREAM_SERVER_BIND); if (!$socket) { die("$errstr ($