java Socket,一个可以创建多个IO流吗?

比如,现在有一个Socket对象s,我可不可以同时DataOutPutStream(s.getOutPutStream),和ByteArrayOutputStream(s... 比如,现在有一个Socket对象s,我可不可以同时DataOutPutStream(s.getOutPutStream),和ByteArrayOutputStream(s.getOutPutStream),这两个流会发生相互干扰吗?如果我想边聊天边传输文件,启两个线程,两个线程不访问相同代码,当然不存在同不同步的问题,但是我的Socket对象是不是要两个呢? 展开
 我来答
duzc2
推荐于2016-02-15 · TA获得超过2512个赞
知道大有可为答主
回答量:1987
采纳率:50%
帮助的人:2074万
展开全部
当然不行。。
一个socket就像一个管道,
你的数据就像水流,
假设不同的数据是不同颜色的墨水,
黑色和红色都往一个管道里面走,
出来的时候就分不出来了。
追问
那,我想做一个在线聊天系统,但问题是:先要用户登录嘛,我会去连接服务器,在服务端查找数据库后,返回true或者false,返回true让客户端连接,false就不能连、如果是true,这时客户端会出现聊天窗口,那是不是这时又重新一个Socket对象去再次连接服务器?如果这样可以的话,那服务端是不是要两个ServerSocket对象,分别在不同的端口,等待接收客户端的连接?
追答
不是啊,你这个明显是有先后顺序的,
客户端要等到服务器返回true的时候,也就是服务器已经把管道里的数据都读完了。
管道里没有红墨水的时候你再放黑墨水,服务器当然就知道是什么了。

但是聊天和发文件是同时进行的,就不行。
发送数据必须在单独线程里面,不然接收那边就错乱了。

你可以把发送的数据写成块,每次只发送一个块,这个块可能是红色,也可能是黑色,服务器一块一块的读,块上面标记类型和长度,读的时候就知道这个块到底是什么了。
可以从多个线程往负责IO的线程发送数据块,由IO线程保证写完一个块再写另外一个块。
这样就不会错乱了。
西二旗码农一枚
2012-12-15 · TA获得超过1640个赞
知道小有建树答主
回答量:1040
采纳率:0%
帮助的人:761万
展开全部
s.getOutPutStream()都是同一个对象,但是你在多线程里调用应该不会冲突,只要你做好同步就行了,也就是要把s.getOutPutStream获取到得对象要同步
追问
这个怕不好吧,有没有先进点的解决方法?
追答
怎么不好了,暂时没别的办法
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式