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