2014-11-07 79 views
-1

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

这种方法是在我的Snake类中,我已经读过ObjectOutputStrean不能被初始化多次,但是“我怎样才能发送一次以上的蛇对象?”,它已经变得非常困惑于我:

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

这是我的代码的一部分是问题。谢谢。

下面是我在做什么,而中环一做:

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

} 

回答

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

构建然后你就可以调用sendSnakeSnake实例多次,

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

这是一个好主意,但是当我这样做时,蛇被发现处于相同的状态,即我的蛇被发送到相同的位置,因为OutoutStream只创建一次:C – Pepe 2014-11-07 03:22:50

+0

@Pepe也许你应该更新你的'Snake'在第二次调用'sendSnake()'之前。你没有包含太多的代码。但正如你一再指出你应该真的创建'OutputStream'只有一次。 – 2014-11-07 03:36:39

+0

我已经包含了更多的代码,当我打电话给sendSnake函数时,我收到了游戏中的蛇的列表,然后我进行了必要的操作来移动蛇的每一次迭代,我发送蛇的新位置 – Pepe 2014-11-07 03:49:02

0

必须使用相同ObjectOutputStream为插座的生活。更准确地说,你必须成对使用ObjectOutputStreamObjectInputStream:当你构造一个时,你必须在对等体构造另一个。然而,这基本上不可能协调,因此适用单一的ObjectInput/OutputStream规则。

Snake不应该自己发送,不应该用Socket [或OutputStream任何形式构造或构造自己,这里与其他答案相反]。发送Snake(或其他任何东西)的实体应拥有套接字和输出流,并且应该写入。

+0

在我的蛇类中我有一个来自queueSnake类的对象,所以,我发送queueSnake对象不是蛇,蛇是我正在使用我的queueSnake对象的类,我一直很困惑这个 – Pepe 2014-11-07 04:11:47

+0

声音更加颠倒了很长时间。 Snake不应该知道它所在的队列,它正在发送的套接字,还是用于发送它的ObjectOutputStream。 – EJP 2014-11-07 04:54:12