java Socket,一个可以创建多个IO流吗?
比如,现在有一个Socket对象s,我可不可以同时DataOutPutStream(s.getOutPutStream),和ByteArrayOutputStream(s...
比如,现在有一个Socket对象s,我可不可以同时DataOutPutStream(s.getOutPutStream),和ByteArrayOutputStream(s.getOutPutStream),这两个流会发生相互干扰吗?如果我想边聊天边传输文件,启两个线程,两个线程不访问相同代码,当然不存在同不同步的问题,但是我的Socket对象是不是要两个呢?
展开
2个回答
展开全部
当然不行。。
一个socket就像一个管道,
你的数据就像水流,
假设不同的数据是不同颜色的墨水,
黑色和红色都往一个管道里面走,
出来的时候就分不出来了。
一个socket就像一个管道,
你的数据就像水流,
假设不同的数据是不同颜色的墨水,
黑色和红色都往一个管道里面走,
出来的时候就分不出来了。
追问
那,我想做一个在线聊天系统,但问题是:先要用户登录嘛,我会去连接服务器,在服务端查找数据库后,返回true或者false,返回true让客户端连接,false就不能连、如果是true,这时客户端会出现聊天窗口,那是不是这时又重新一个Socket对象去再次连接服务器?如果这样可以的话,那服务端是不是要两个ServerSocket对象,分别在不同的端口,等待接收客户端的连接?
追答
不是啊,你这个明显是有先后顺序的,
客户端要等到服务器返回true的时候,也就是服务器已经把管道里的数据都读完了。
管道里没有红墨水的时候你再放黑墨水,服务器当然就知道是什么了。
但是聊天和发文件是同时进行的,就不行。
发送数据必须在单独线程里面,不然接收那边就错乱了。
你可以把发送的数据写成块,每次只发送一个块,这个块可能是红色,也可能是黑色,服务器一块一块的读,块上面标记类型和长度,读的时候就知道这个块到底是什么了。
可以从多个线程往负责IO的线程发送数据块,由IO线程保证写完一个块再写另外一个块。
这样就不会错乱了。
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询