在Java中重置ObjectOutputStream

在Java中重置ObjectOutputStream,java,multithreading,sockets,objectoutputstream,Java,Multithreading,Sockets,Objectoutputstream,我知道以前有人问过这个问题,但我不知道如何使用ObjectOutputStream多次发送对象,我尝试了人们在这个论坛上所说的。 问题是,我正在用Java开发一个使用多线程和套接字的蛇游戏,我已经画了两条蛇,但是我只能将蛇从一条发送到另一条,所以,当我尝试发送另一条时,我得到了StreamCorruptedException。这是我的密码: 这个方法在我的Snake类中,我读到ObjectOutputStrean不能被多次初始化,但是“我如何才能多次发送Snake对象?”我感到非常困惑: pu

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

这个方法在我的Snake类中,我读到ObjectOutputStrean不能被多次初始化,但是“我如何才能多次发送Snake对象?”我感到非常困惑:

 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);

 }
试试看
{
这是sendSnake();
this.receiveListSnakes();

对于(int i=0;i您可以一次构造
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();
在套接字的生命周期中,您必须使用相同的
ObjectOutputStream
。更准确地说,您必须成对使用
ObjectOutputStream
ObjectInputStream
:当您构造一个对象时,您必须在对等方构造另一个。但是这基本上是不可能协调的,因此单个
ObjectInput/outputstream铰
规则适用


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

这是个好主意,但是当我这样做时,snake以相同的状态发送,也就是说,我的snake以相同的位置发送,因为OutoutStream只创建了一次:C@Pepe也许您应该在调用
sendSnake()之前更新您的
Snake
第二次。你没有包含太多的代码。但是正如你反复指出的那样,你应该只创建一次
OutputStream
。我包含了更多的代码,当我调用sendSnake函数时,我会收到游戏中蛇的列表,然后我会进行nedeed操作,在每次迭代中移动蛇en用新的位置发送snake直到我在上面所做的更改可以正常工作。你是如何构造
snake
?实际上我在snake类中做所有事情,这里我有游戏的所有说明,让我在我的snake类中发布这个部分我有一个来自queueSnake类的对象,所以,我发送的是queueSnake对象而不是Snake,snake是我使用queueSnake对象的类,我很长时间以来一直对它感到困惑,这听起来更颠倒了。snake不应该知道它所在的队列、它正在发送的套接字,或者用来发送它的
ObjectOutputStream