mina做服务socket做客户端(发送数据过大拆成了几条ByteBuffer如何接收)

问题描述

我用java的Mina做服务端接受Socket客户端发送过来的信息,但是发送的信息过大,会给拆成了3-4条ByteBuffer,我通过session将他们可以连接起来,但是关键的问题是如果客户端发送的数据特别多,由于使用了线程池可能出现丢弃数据的可能,而且因为数据特别多mina服务端在过滤器中处理混乱不能拼接成一条完整的数据了。请问那位大侠帮忙出个解决的方法让我能够将数据拼接成功谢谢各位

解决方案

解决方案二:
我只能提供我做过的,用的不是Mina,是自己的发送和接收:每个超长的分段发送,在拆分的时候分配一个唯一ID和一个seq序号以及被拆分成几条的totalNum,数据包头加上这3个值。接收队列是一个HashMap,key为ID,value为一个类,元素:totalNum/待接收num(第一次接收时初始化为totalNum-1)/一个HashMap,类中HashMap的key为seq,value为那段文本。接收处理方法里面,每接收完一段,找对应的队列里面的ID,找到了,则检测对应的ID下的待接收num是否为1(因为当前接收的这段是最后一段,就是说待接收的刚好接收到了),如果是,表示该ID对应的都已经传完,开始按seq组装Hashmap的value,组装完后remove掉,如果不是,则待接收Num+1,对应文本put到类里的HashMap。如果找不到,则接收队列put一个新的ID及类。不知道有帮助没?
解决方案三:
引用1楼crazylaa的回复:

我只能提供我做过的,用的不是Mina,是自己的发送和接收:每个超长的分段发送,在拆分的时候分配一个唯一ID和一个seq序号以及被拆分成几条的totalNum,数据包头加上这3个值。接收队列是一个HashMap,key为ID,value为一个类,元素:totalNum/待接收num(第一次接收时初始化为totalNum-1)/一个HashMap,类中HashMap的key为seq,value为那段文本。接收处理方法里面,每接收完一段,找对应的队列里面的ID,找到了,则检测对应的ID下的待接收num是否为1(因为当前接收的这段是最后一段,就是说待接收的刚好接收到了),如果是,表示该ID对应的都已经传完,开始按seq组装Hashmap的value,组装完后remove掉,如果不是,则待接收Num+1,对应文本put到类里的HashMap。如果找不到,则接收队列put一个新的ID及类。不知道有帮助没?

楼上的这方法属于比较常用的方法了,如果socket自始至终都是同一个的话可以考虑把此socket和接收数据的缓冲区联系起来考虑,每次从相对应的socket读数据进相对应的缓冲里面,这方式简单得多,如果内存不够的话可以把缓冲区直接换成文件操作
解决方案四:
可以参考下列的例子http://blog.csdn.net/hzhxxx/archive/2009/12/09/4970196.aspx下列描述了JNSP(javanetworkserviceplatform)服务的部署和功能,如有不明白之处,自己查看源代码,我无力和没有太多时间回答太多的问题.源代码一起提供,可以随意修改,发布,并商业化,但请保留作者的信息.为了技术的进步,请注意共享成就.目前已经发布于:http://download.csdn.net/source/1885332;http://hzhxxx.download.csdn.net/如果查看后有技术问题探讨和建议的,欢迎致电致信联系.系统架构设计和实现有如下特点:A.采用Accept-Connect通讯模型,能统一管理系统中使用的所有Socket资源;B.系统支持通信和协议分离的实现原则,支持自定义协议解析模块;通信负责数据收发,协议负责数据鉴别,两者配合实现通信和协议的和谐工作;C.灵活支持业务处理功能重定义,分级支持慢业务和快业务的不同业务处理线程;D.丰富灵活的配置参数,能满足高扩展性;E.配合业务处理和通信模型,能异步的管理所有的交互步骤;F.分布式服务设计和部署,实现动态(热拔插)的增加和较少业务服务器,减少乃至拒绝单点服务;
解决方案五:
/***接收内核socket缓冲区的数据到连接自建立的缓冲区(支持自动增长)**@paramin*实际接收到的数据包队列*@returnPACKET_ERROR表示对方关闭连接,PACKET_FULL表示数据发送完毕,PACKET_LESS*表示数据继续接收.*@see#parse(Vector)*/publicDefine.DataRecvStatusrecv(Vector<byte[]>in)throwsException{Define.DataRecvStatusresult=null;result=Define.DataRecvStatus.PACKET_FULL;intreceived=0;m_recvbuff.limit(this.m_recvcapacity);m_onerecvbuff.clear();//尽量把内核接收缓冲区的数据全部读取出来while(received<m_onerecvbuff.limit()&&m_onerecvbuff.hasRemaining()){try{intlen=0;len=m_socketchannel.read(m_onerecvbuff);//通道数据被读取完全,是否表示这个连接已经没有数据了if(len<0){//一般是-1,可以认为连接被对方关闭result=Define.DataRecvStatus.PACKET_ERROR;break;}elseif(len==0){//如果每次都是0,会是什么情况result=Define.DataRecvStatus.PACKET_LESS;break;}else{received+=len;result=Define.DataRecvStatus.PACKET_LESS;}}catch(NotYetConnectedExceptione){result=Define.DataRecvStatus.PACKET_ERROR;logger.error("oops,gotanexception:",e);break;}catch(ClosedByInterruptExceptione){result=Define.DataRecvStatus.PACKET_ERROR;logger.error("oops,gotanexception:",e);break;}catch(AsynchronousCloseExceptione){result=Define.DataRecvStatus.PACKET_ERROR;logger.error("oops,gotanexception:",e);break;}catch(ClosedChannelExceptione){result=Define.DataRecvStatus.PACKET_ERROR;logger.error("oops,gotanexception:",e);break;}catch(IOExceptione){result=Define.DataRecvStatus.PACKET_ERROR;logger.error("oops,gotanexception:",e);break;}}m_onerecvbuff.flip();if(m_onerecvbuff.limit()>m_recvbuff.remaining()){//继续扩大接收缓冲区m_recvbuff.flip();byte[]bytes=newbyte[m_recvbuff.limit()];m_recvbuff.get(bytes,0,m_recvbuff.limit());m_recvcapacity*=2;m_recvbuff=ByteBuffer.allocate(m_recvcapacity);m_recvbuff.put(bytes);}//合并本次实际接收到的数据m_recvbuff.put(m_onerecvbuff);//如果数据没有接收完整,对方关闭连接,最后一段不完整数据可能被丢弃//如果解析协议发生错误,等同于连接被关闭,不过是服务器主动关闭if(result==Define.DataRecvStatus.PACKET_ERROR){if(received>0){parse(in);}}else{if(received>0){result=parse(in);}}returnresult;}
解决方案六:
我在使用MINA编写服务器的过程中,遇到了更国奇怪的问题:先介绍一下背景:我的系统是一个时间证券系统,处理的数据量相当大每秒七八百M,系统监听一个端口,另外一个系统以客户端的身份把发数据发送过来,不超过二十个连接,我的程序对数据做一些处理,然后再发到其它的几个服务器去。系统在开始运行的时候很正常,但过上十几分钟以后,其中的某些连接就接收不到数据了,通过tcpdump查看发现ack报文中的win值相当小,小于256字节,而且相当的慢,不知道是什么原因造成这种情况。服务器是8核linux虚拟机。
解决方案七:
lz有没有自己写ProtocolCodec?永远记住,每个逻辑包(区别于传输时的物理包)的最初几个字节(或者固定位置的几个字节)代表的是包的长度以及包的类型。

时间: 2024-08-01 13:05:16

mina做服务socket做客户端(发送数据过大拆成了几条ByteBuffer如何接收)的相关文章

信息通讯-java客户端 c#服务端(同一台电脑)进行socket通讯 客户端发送文本消息到服务端

问题描述 java客户端 c#服务端(同一台电脑)进行socket通讯 客户端发送文本消息到服务端 socket连接部分可以省略 只要客户端的发送数据部分和服务端的接收数据部分我主要不知道java和C#的字符集以及该用什么方法比较好 解决方案 C#可以用system.text.encoding命名空间下的Encoding.GetEncoding(字符串编码名).GetBytes/GetString编码解码.其中编码名支持常见的编码,比如utf gb2312 unicode等等. 解决方案二: c

socket通讯 android-请求:java写的客户端发送数据失败!!

问题描述 请求:java写的客户端发送数据失败!! 连接时,给服务端发送数据时总是报错!! 11-28 11:15:36.164: D/MainActivity(4212): wifiname:"LcyAP_03001" prxFlag:true substr: LcyAP FirstConn:true 11-28 11:15:36.164: D/MainActivity(4212): Now Ready to create connect to LC:Now wifi stat is

socket服务端向客户端发送字节数组消息时客户端无法接收问题

问题描述 socket服务端向客户端发送字节数组消息时客户端无法接收问题

关于Netty4怎么实现客户端发送数据之后等待服务端的返回结果,谢谢了,非常感谢大侠!!

问题描述 关于Netty4怎么实现客户端发送数据之后等待服务端的返回结果,谢谢了,非常感谢大侠!!

VB WinSocket 连续向 Java写的客户端发送数据出现问题

问题描述 VB6做的服务器端WinSocket,向Java客户端发送数据,第一次发送SendData,Java正常接收.然后再次发送SendData,Java就接收不到数据了.分析原因,发现与http://bbs.csdn.net/topics/120116546这位大哥遇到的问题一模一样.这位大哥在帖子的最后给出来原因:"是VB的服务端程序多发了两个字节的0,这样下一个包的包头就不对了."可是我知道了这个原因之后,却想不出解决办法,所以在此希望各位大哥能帮忙出个好主意解决问题,谢谢!

Java网络编程从入门到精通(26):在服务端接收和发送数据

在建立完ServerSocket对象后,通过accept方法返回的Socket对象,服务端就可以和客户端进行数据交互. Socket类和ServerSocket类都有两个得到输入输出流的方法:getInputStream和getOutputStream.对于Socket类而言,使用getInputStream方法得到的InputStream是从服务端获取数据,而getOutputStream方法得到的OutputStream是向服务端发送数据.而ServerSocket的getInputStre

编程-Java与C#用socket通讯 只求发送数据部分和数据接收部分(发送简单的文本信息)

问题描述 Java与C#用socket通讯 只求发送数据部分和数据接收部分(发送简单的文本信息) 只求发送数据部分和数据接收部分 TCP连接不要 客户端和服务器响应次数也不要 只求发送数据部分和数据接收部分(java发送c#接收) 解决方案 server: Java code public void handleConnection(Socket connection) { System.out.println("客户:" + connection.getInetAddress() +

ajax推技术,在线服务器端向客户端发送数据

问题描述 ajax推技术,在线服务器端向客户端发送数据 ajax推技术,用浏览器访问该网页后,为什么我的代码每次用insert 向数据库插入数据后,当第三次插入数据的时候才会有效果,将$mes显示在浏览器上? 代码如下: <?PHP header("content-type:text/html;charset=utf-8"); set_time_limit(0);//设置服务器脚本的最大执行时间. $conn=mysql_connect('localhost','root','1

服务器-如何利用UDP广播,给同一台电脑的多个客户端发送数据

问题描述 如何利用UDP广播,给同一台电脑的多个客户端发送数据 项目要求一台电脑同时开启多个同样客户端,同时接受服务器发送过来的数据.我想利用UDP广播实现,但是发现,多个客户端不能绑定同一个端口.这怎么实现啊.请教各位大神,小弟万分感谢! 解决方案 这个是很基础的UDP 协议,这个篇文章看能不能够帮到你:http://blog.csdn.net/qq_21792169/article/details/50412940 解决方案二: 我是想同一台电脑的多个客户端都接收另一台电脑发送过来的数据,但