Java中有多个输入/输出流?

时间:2011-12-05 16:47:02

标签: java networking

我在Java中使用输入/输出流时遇到了问题。我的想法是有DataInputStream来处理接收文本和PrintStream来从服务器和对象(输出/输入)流向服务器传递消息来处理传递的棋子移动和当前的棋盘图像。 / p>

我的问题是代码在尝试在下面的代码中创建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();
       }

4 个答案:

答案 0 :(得分:2)

不要尝试在同一个底层连接上使用两种不同的流/读取器/写入器。你会在两端遇到缓冲问题,这基本上是不可能的。

我会使用ObjectInputStreamObjectOutputStream来编写对象。

ObjectInputStream的构造函数会阻塞,直到它收到由ObjectOutputStream的构造函数写入的标头,因此如果要构建两者,则必须首先构造ObjectOutputStream。你不需要写任何东西,也不需要冲洗它,它本身就是这样做的。

答案 1 :(得分:0)

我认为你只能要求输入1个inputStream:

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

对于outputStreams

也是如此

答案 2 :(得分:-1)

我从未发现 ObjectInputStream 发生了什么,但我切换到DataInputStream并且我正在修改我的代码,因此它将片段名称,x位置和y位置发送到一个字符串中在客户端分手,董事会将相应修改

答案 3 :(得分:-1)

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