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

影游 2015-03-05 01:13:56
(1)使用的是java.net下面的阻塞socket

(2)Socket为长连接方式

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

问题:如果我读取比较大的数据该如何办(1M数据)?循环读取是无法判断流结尾的(原因是不返回-1)。
看到网上有人使用available()方法判断是否还有数据,这个不可取,因为available为0时,不代表本次数据传输完毕,可能还有未完数据的。
...全文
186 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
tianfang 2015-03-06
  • 打赏
  • 举报
回复
引用 5 楼 boyingyou 的回复:
[quote=引用 3 楼 tianfang 的回复:] 为什么不使用成熟的框架,比如netty? 为什么不使用http POST方法? 为什么不直接写servlet来解决这个问题?
第一:最近打算使用mina,想问一下,nima和netty哪个好?不是我不用,最近不敢改,想这次测试过了再改。 第二:即使用了netty或者mina 应该也解决不了上面我说的问题吧,我说的是消息界限问题,你说的是数据传输问题。 [/quote] netty, 同一作者,放弃了mina 我要表达的意思是,最好在标准的协议上实现功能。首先,定义好一个传输协议是很难的一件事,其次无bug的实现也不容易。 那么长连接上数据传输有哪些现有的协议呢?目前,我认为Websocket(RFC 6455)比较好,你只要定义消息内容就可以了,传输层的很多开源架构为你实现了。 JSR 356 是JavaEE7的规范,目前JavaEE7 只有glassfish/wildfly(jbossAS8)实现。 仅仅传输,可以采用netty来实现;传输和业务逻辑一起实现,建议采用JSR356。 无论哪种实现方式,你都可以集中精力在自己的消息处理上,而你遇到的消息界限问题,底层框架都为你做好了。
影游 2015-03-05
  • 打赏
  • 举报
回复
引用 2 楼 luogui551 的回复:
或者设置数据分隔符,比如http上传文件时,貌似用的{10,13,10,13}.。。。
这个应该是个办法,不过没有上面更正式一些。
影游 2015-03-05
  • 打赏
  • 举报
回复
引用 3 楼 tianfang 的回复:
为什么不使用成熟的框架,比如netty? 为什么不使用http POST方法? 为什么不直接写servlet来解决这个问题?
第一:最近打算使用mina,想问一下,nima和netty哪个好?不是我不用,最近不敢改,想这次测试过了再改。 第二:即使用了netty或者mina 应该也解决不了上面我说的问题吧,我说的是消息界限问题,你说的是数据传输问题。
影游 2015-03-05
  • 打赏
  • 举报
回复
引用 1 楼 luogui551 的回复:
制定一个简单协议,比如说发送数据前先发一个数字,这个数字表示随后的多少字节数据表示当前这批数据
后来想了想,解决这么问题,只能这样了。靠TCP层告诉你消息分割,估计是不可能的。
tianfang 2015-03-05
  • 打赏
  • 举报
回复
为什么不使用成熟的框架,比如netty? 为什么不使用http POST方法? 为什么不直接写servlet来解决这个问题?
W-Aires 2015-03-05
  • 打赏
  • 举报
回复
或者设置数据分隔符,比如http上传文件时,貌似用的{10,13,10,13}.。。。
W-Aires 2015-03-05
  • 打赏
  • 举报
回复
制定一个简单协议,比如说发送数据前先发一个数字,这个数字表示随后的多少字节数据表示当前这批数据

67,513

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧