2011-12-05 172 views
1

我在Java中使用输入/输出流时遇到了问题。我的想法是有一个DataInputStream来处理接收文本和PrintStream将消息从服​​务器和对象(输出/输入)流传递到服务器,以处理经过的片段移动和当前板图像。Java中的多输入/输出流?

我的问题是,代码在尝试在下面的代码中创建ObjectInputStream时挂起。这是因为我想要有多个输入和输出流?如果是的话,我可以使用任何可能的修复方法吗?

 Socket sock = new Socket("127.0.0.1", 1716); 
     input = new DataInputStream(sock.getInputStream()); 
     printer = new PrintStream(sock.getOutputStream()); 

     System.out.println("Test 1"); 
     zelda = new ObjectInputStream(sock.getInputStream()); 
     System.out.println("Test 2"); 
     link = new ObjectOutputStream(sock.getOutputStream()); 
     System.out.println("Test 3"); 

我有很多在我的服务器源代码中的塞尔达传说引用,代码是相当大的。以前的源代码是针对客户端的,虽然服务器连接在这里是我调用ObjectOutputStream的地方。

ObjectOutputStream ganandorf; 

    for(int i = 0; i < clients.size(); i++) 
    { 
     try 
     { 
      ganandorf = new ObjectOutputStream(clients.get(i).getOutputStream()); 
      ganandorf.write(1); 
      ganandorf.flush(); 
      ganandorf.writeObject(something); 
      ganandorf.flush(); 
     } 
+0

可能重复的[getInputStream块?](http://stackoverflow.com/questions/8088557/getinputstream-blocks) –

+0

我切换ObjectInput和ObjectOutput的位置,并强制ObjectOutput刷新,但它仍然挂在ObjectInput – D347th

回答

0

我觉得你可以只要求1周的inputStream参考:

InputStream baseInputStream = sock.getInputStream(); 
input = new DataInputStream(baseInputStream); 
zelda = new ObjectInputStream(baseInputStream); 

同样适用于outputStreams

+0

InputStreams只能读取一次,所以这不是一个好主意。 –

+0

只要他一次只使用一个,应该没有问题。 – njzk2

+0

OP是否打算同步访问is(和os)?尽管如此,它看起来很纠结。当然是Prima facie。 – entonio

-1

我从来没有发现有ObjectInputStream的发生了什么事,但我切换到DataInputStream和我目前正在修改我的代码,因此它会将一个字符串中的名称,x位置和y位置发送给客户端,并且会相应地修改该主板

2

不要尝试在同一底层连接上使用两种不同类型的流/读者/作者。你会在两端遇到缓冲问题,这使得它基本上不可能。

我会使用ObjectInputStreamObjectOutputStream,只是写对象。

ObjectInputStream的构造函数会阻塞,直到它接收到由构造函数ObjectOutputStream写入的头文件,所以如果要构造两者,则必须首先构造ObjectOutputStream。你不需要写任何东西,也不需要刷新它,它本身就是这样。

-1

在另一个端口上打开一个套接字并使用它来创建新的流。