【问题标题】:Reset an ObjectOutputStream in Java在 Java 中重置 ObjectOutputStream
【发布时间】:2015-01-03 18:30:40
【问题描述】:

我知道以前有人问过这个问题,但是我无法实现如何使用 ObjectOutputStream 多次发送对象,我尝试了这个论坛上人们所说的。 问题是我正在使用多线程和套接字在 Java 中开发一个 Snake 游戏,我已经画了两条蛇,但是我只能将蛇从一条蛇发送到另一条蛇,所以,当我尝试发送另一条蛇时,我得到和 StreamCorruptedException。这是我的代码:

这个方法在我的 Snake 类中,我读过 ObjectOutputStrean 不能多次初始化,但是¿我怎样才能多次发送蛇对象?,这让我很困惑:

 public void sendSnake()
 {
    try
    {
        outputStream=socket.getOutputStream();
        oos=new ObjectOutputStream(outputStream);
        oos.writeObject(snakeBody);
    }catch(IOException ioe)
    {
        ioe.printStackTrace();
    }    
}

问题在于我的代码部分。谢谢。

这是我在 do while 循环中所做的:

 try
 {
      this.sendSnake();
      this.receiveListSnakes();

            for(int i=0; i<listaSnakes.size(); i++)
            {
                for(int j=0; j<listSnake.get(i).tam(); j++)
                {
                    mostrar(listSnake.get(i).take(j).part); //this is for display de snake
                }
            }
 }catch(IOException ioex)
 {
     ioex.printStackTrace();
 }

 if( op.equals("up") ) 
 {
     posy--;
     ...


 public Snake(JFrame screen)
 {
      //above I have created the Socket
      socket=new Socket(ipClient, port);


      outputStream=socket.getOutputStream();
      oos=new ObjectOutputStream(outputStream);

 }

【问题讨论】:

    标签: java multithreading sockets objectoutputstream


    【解决方案1】:

    您可以构造一次ObjectOutputStream 并将引用保存为字段。另外,您应该flush()。假设你有一个 Snake 类,我会通过传入 socket.getOutputStream() 来构建类似

    private ObjectOutputStream oos;
    public Snake(OutputStream os) {
      oos = new ObjectOutputStream(os);
    }
    
    public void sendSnake()
    {
      try {
        oos.writeObject(snakeBody);
      } catch(IOException ioe) {
        ioe.printStackTrace();
      } finally {
        oos.flush();
      } 
    }
    

    然后您可以使用您的Snake 实例多次调用sendSnake

    Snake s = new Snake(socket.getOutputStream());
    s.sendSnake();
    s.sendSnake();
    

    【讨论】:

    • 这是个好主意,但是当我这样做时,snake 会以相同的状态发送,即我的蛇会以相同的位置发送,因为 OutoutStream 只创建一次:C跨度>
    • @Pepe 也许您应该在第二次调用sendSnake() 之前更新您的Snake。您没有包含太多代码。但正如您反复指出的那样,您实际上应该只创建一次 OutputStream
    • 我包含了更多代码,当我调用 sendSnake 函数时,我收到了游戏中蛇的列表,然后我进行必要的操作以在每次迭代时移动蛇向蛇发送新位置
    • 我上面的更改仍然可以正常工作。你是如何构建Snake的?
    • 其实我在Snake课上什么都做,这里有游戏的所有说明,让我发布这部分
    【解决方案2】:

    必须在套接字的整个生命周期内使用相同的ObjectOutputStream。更准确地说,您必须成对使用ObjectOutputStreamObjectInputStream:当您构造一个时,您必须在对等方构造另一个。然而,这基本上是不可能协调的,所以单一的ObjectInput/OutputStream 规则适用。

    Snake 不应发送自身,也不应使用 Socket [或任何类型的 OutputStream,与此处的其他答案相反] 构造或构造自身。发送Snake(或其他任何东西)的实体应该拥有套接字和输出流,并且应该进行写入。

    【讨论】:

    • 在我的蛇类中,我有一个来自 queueSnake 类的对象,所以,我发送的是 queueSnake 对象而不是 Snake,蛇是我正在使用我的 queueSnake 对象的类,我真的被这个迷惑了很久
    • 听起来更加颠倒。 Snake 不应该知道它所在的队列、发送它的套接字或用于发送它的 ObjectOutputStream
    猜你喜欢
    • 1970-01-01
    • 2012-08-08
    • 1970-01-01
    • 2015-01-05
    • 1970-01-01
    • 1970-01-01
    • 2016-02-03
    • 2013-04-18
    • 2016-05-31
    相关资源
    最近更新 更多