我知道之前已经问过这个问题,但我无法实现如何使用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);
}
答案 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
。更准确地说,您必须成对使用ObjectOutputStream
和ObjectInputStream
:当您构建一个时,您必须在对等体上构建另一个。但是,这基本上不可能进行协调,因此适用单ObjectInput/OutputStream
条规则。
Snake
不应发送自己,也不应使用Socket
[或OutputStream
任何类型构建或构建自身,与此处的其他答案相反]。发送Snake
(或其他任何内容)的实体应该拥有套接字和输出流,并且应该写入。