(1)使用的是java.net下面的阻塞socket
(2)Socket为长连接方式
(3)我使用 len = inputStream.read(bytes);来读取数据时,是不返回-1的,因为我使用的是长连接,socket和socket.outputstream是不断的。
问题:如果我读取比较大的数据该如何办(1M数据)?循环读取是无法判断流结尾的(原因是不返回-1)。
看到网上有人使用available()方法判断是否还有数据,这个不可取,因为available为0时,不代表本次数据传输完毕,可能还有未完数据的。
------解决思路----------------------
制定一个简单协议,比如说发送数据前先发一个数字,这个数字表示随后的多少字节数据表示当前这批数据
------解决思路----------------------
为什么不使用成熟的框架,比如netty?
为什么不使用http POST方法?
为什么不直接写servlet来解决这个问题?
------解决思路----------------------
netty, 同一作者,放弃了mina
我要表达的意思是,最好在标准的协议上实现功能。首先,定义好一个传输协议是很难的一件事,其次无bug的实现也不容易。
那么长连接上数据传输有哪些现有的协议呢?目前,我认为Websocket(RFC 6455)比较好,你只要定义消息内容就可以了,传输层的很多开源架构为你实现了。 JSR 356 是JavaEE7的规范,目前JavaEE7 只有glassfish/wildfly(jbossAS8)实现。
仅仅传输,可以采用netty来实现;传输和业务逻辑一起实现,建议采用JSR356。
无论哪种实现方式,你都可以集中精力在自己的消息处理上,而你遇到的消息界限问题,底层框架都为你做好了。