在Java中重置ObjectOutputStream

时间:2014-11-07 02:49:21

标签: java multithreading sockets objectoutputstream

我知道之前已经问过这个问题,但我无法实现如何使用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);

 }

2 个答案:

答案 0 :(得分: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();
  } 
}

然后,您可以多次与sendSnake个实例联系Snake

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

答案 1 :(得分:0)

必须在套接字的生命周期内使用相同的ObjectOutputStream。更准确地说,您必须成对使用ObjectOutputStreamObjectInputStream:当您构建一个时,您必须在对等体上构建另一个。但是,这基本上不可能进行协调,因此适用单ObjectInput/OutputStream条规则。

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