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

J2EE 码拜 10年前 (2015-04-03) 1110次浏览 0个评论

(1)使用的是java.net下面的阻塞socket

(2)Socket为长连接方式

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

问题:如果我读取比较大的数据该如何办(1M数据)?循环读取是无法判断流结尾的(原因是不返回-1)。
看到网上有人使用available()方法判断是否还有数据,这个不可取,因为available为0时,不代表本次数据传输完毕,可能还有未完数据的。

使用socket阻塞方式收发数据不能返回-1的疑问。
20分
制定一个简单协议,比如说发送数据前先发一个数字,这个数字表示随后的多少字节数据表示当前这批数据
使用socket阻塞方式收发数据不能返回-1的疑问。
或者设置数据分隔符,比如http上传文件时,貌似用的{10,13,10,13}.。。。
使用socket阻塞方式收发数据不能返回-1的疑问。
10分
为什么不使用成熟的框架,比如netty?
为什么不使用http POST方法?
为什么不直接写servlet来解决这个问题?
使用socket阻塞方式收发数据不能返回-1的疑问。
引用 1 楼 luogui551 的回复:

制定一个简单协议,比如说发送数据前先发一个数字,这个数字表示随后的多少字节数据表示当前这批数据

后来想了想,解决这么问题,只能这样了。靠TCP层告诉你消息分割,估计是不可能的。

使用socket阻塞方式收发数据不能返回-1的疑问。
引用 3 楼 tianfang 的回复:

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

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

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

使用socket阻塞方式收发数据不能返回-1的疑问。
引用 2 楼 luogui551 的回复:

或者设置数据分隔符,比如http上传文件时,貌似用的{10,13,10,13}.。。。

这个应该是个办法,不过没有上面更正式一些。

使用socket阻塞方式收发数据不能返回-1的疑问。
10分
引用 5 楼 boyingyou 的回复:
Quote: 引用 3 楼 tianfang 的回复:

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

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

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

netty, 同一作者,放弃了mina

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

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

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

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


CodeBye 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明使用socket阻塞方式收发数据不能返回-1的疑问。
喜欢 (0)
[1034331897@qq.com]
分享 (0)

文章评论已关闭!