当前位置: 代码迷 >> J2EE >> 使用socket阻塞方式收发数据不能回到-1的疑问
  详细解决方案

使用socket阻塞方式收发数据不能回到-1的疑问

热度:3   发布时间:2016-04-17 23:19:31.0
使用socket阻塞方式收发数据不能返回-1的疑问。
(1)使用的是java.net下面的阻塞socket

(2)Socket为长连接方式

(3)我使用 len = inputStream.read(bytes);来读取数据时,是不返回-1的,因为我使用的是长连接,socket和socket.outputstream是不断的。

问题:如果我读取比较大的数据该如何办(1M数据)?循环读取是无法判断流结尾的(原因是不返回-1)。
看到网上有人使用available()方法判断是否还有数据,这个不可取,因为available为0时,不代表本次数据传输完毕,可能还有未完数据的。
------解决思路----------------------
制定一个简单协议,比如说发送数据前先发一个数字,这个数字表示随后的多少字节数据表示当前这批数据
------解决思路----------------------
为什么不使用成熟的框架,比如netty?
为什么不使用http POST方法?
为什么不直接写servlet来解决这个问题?
------解决思路----------------------
引用:
Quote: 引用:

为什么不使用成熟的框架,比如netty?
为什么不使用http POST方法?
为什么不直接写servlet来解决这个问题?


第一:最近打算使用mina,想问一下,nima和netty哪个好?不是我不用,最近不敢改,想这次测试过了再改。

第二:即使用了netty或者mina 应该也解决不了上面我说的问题吧,我说的是消息界限问题,你说的是数据传输问题。



netty, 同一作者,放弃了mina

我要表达的意思是,最好在标准的协议上实现功能。首先,定义好一个传输协议是很难的一件事,其次无bug的实现也不容易。

那么长连接上数据传输有哪些现有的协议呢?目前,我认为Websocket(RFC 6455)比较好,你只要定义消息内容就可以了,传输层的很多开源架构为你实现了。 JSR 356 是JavaEE7的规范,目前JavaEE7  只有glassfish/wildfly(jbossAS8)实现。

仅仅传输,可以采用netty来实现;传输和业务逻辑一起实现,建议采用JSR356。

无论哪种实现方式,你都可以集中精力在自己的消息处理上,而你遇到的消息界限问题,底层框架都为你做好了。








  相关解决方案