如何在java网络中使用ObjectInbputStreem解决java EOFException的问题

问题描述 投票:-1回答:1

我想用网络发送一些对象。我的网络我是用 DatagramSocket, DatagramPacket, ByteArrayInputStream, ObjectInputStream, ByteArrayOutputStreamObjectOutputStream.当我试图使用网络发送一个对象时,我得到的是 java.io.EOFException 而当我使用 try and catch 我失去了我的对象。

服务器端

public class GameServer extends Thread {
private DatagramSocket socket;
private DatagramPacket packet;
private byte[] data;
private ByteArrayInputStream bais;
private ObjectInputStream ois;
private ByteArrayOutputStream baos;
private ObjectOutputStream oos;
private Game game;

public GameServer() {
    try {
        this.socket = new DatagramSocket(1331);
    }
    catch (SocketException e) {
        e.printStackTrace();
    }
    start();
}

@Override
public void run() {
    while (true) {
        data = new byte[6400];
        packet = new DatagramPacket(data, data.length);
        Object object = receive();

        if (object instanceof String) {
            String message = (String) object;
            System.out.println("CLIENT [ " + packet.getAddress().getHostAddress() + " : " + packet.getPort() + " ] >> " + message.trim());
            if (message.equalsIgnoreCase("start")) {
                game = new Game("Tankies", 1200, 700);
                sendObject(game);
            }
        }
        else if (object instanceof State) {
            System.out.println("got state");
        }
        else if (object instanceof Player)
            System.out.println("hi player");

    }
}

private Object receive() {
    bais = new ByteArrayInputStream(data);
    try {
        socket.receive(packet);
        ois = new ObjectInputStream(new BufferedInputStream(bais));
        return ois.readObject();
    } catch (EOFException e) {
        System.out.println("SERVER Got EOFException");
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    } catch (ClassNotFoundException e) {
        e.printStackTrace();
    }

    return null;
}

private void sendData(byte[] data, InetAddress ipAddress, int port) {
    DatagramPacket packet = new DatagramPacket(data, data.length, ipAddress, port);
    try {
        this.socket.send(packet);
    }
    catch (IOException e) {
        e.printStackTrace();
    }
}

private void sendObject(Object object) {
    baos = new ByteArrayOutputStream(6400);
    oos = null;
    try {
        oos = new ObjectOutputStream(baos);
        oos.writeObject(object);
    }
    catch (IOException e) {
        e.printStackTrace();
    }
    sendData(baos.toByteArray(), packet.getAddress(), packet.getPort());
}

}

客户端

public class GameClient extends Thread implements Serializable {

private InetAddress ipAddress;
private transient DatagramSocket socket;
private transient DatagramPacket packet;
private byte[] data;
private transient ByteArrayInputStream bais;
private transient ObjectInputStream ois;
private transient ByteArrayOutputStream baos;
private transient ObjectOutputStream oos;
private Game game;


public GameClient(String ipAddress) {
    try {
        this.socket = new DatagramSocket();
    }
    catch (SocketException e) {
        e.printStackTrace();
    }
    try {
        this.ipAddress = Inet4Address.getByName(ipAddress);
    }
    catch (UnknownHostException e) {
        e.printStackTrace();
    }
    start();
}

@Override
public void run() {
    while (true) {
        data = new byte[6400];
        packet = new DatagramPacket(data, data.length);
        Object object = receive();

        if (object instanceof String) {
            System.out.println("SERVER >> " + object);
        }
        else if (object instanceof Game) {
            this.game = (Game) object;
            this.game.setClient(this);
            this.game.start();
        }

    }
}

private Object receive() {
    bais = new ByteArrayInputStream(data);
    try {
        socket.receive(packet);
        ois = new ObjectInputStream(new BufferedInputStream(bais));
        return ois.readObject();
    }
    catch (IOException | ClassNotFoundException e) {
        e.printStackTrace();
    }
    return null;
}

private void sendData(byte[] data) {
    DatagramPacket packet = new DatagramPacket(data, data.length, ipAddress, 1331);
    try {
        this.socket.send(packet);
    }
    catch (IOException e) {
        e.printStackTrace();
    }
}

public void sendObject(Object object) {
    baos = new ByteArrayOutputStream(6400);
    oos = null;
    try {
        oos = new ObjectOutputStream(baos);
        oos.writeObject(object);
    }
    catch (IOException e) {
        e.printStackTrace();
    }
    sendData(baos.toByteArray());
}

}

向服务器发送对象的代码

public class MultiplayerState extends State{
private World world;
private Tank myTank, playerTank;

public MultiplayerState(Handler handler) {
    super(handler);
}

@Override
public void startState() {
    world = new World(handler,"res/worlds/world1.txt");
    handler.setWorld(world);
    myTank = new Tank(handler, world.getSpawnX(), world.getSpawnY());
    handler.getGame().getRender().addObject(world);
    handler.getGame().getRender().addObject(myTank);
    world.start();
    myTank.start();
    handler.getGame().getClient().sendObject(handler.getGame().getPlayer());
}

}

handler.getGame().getClient().sendObject(handler.getGame().getPlayer());

这一行要发送 player 到服务器......关于代码的一些解释......这是一个游戏,使用多线程在java和我想创建简单的网络,使两个不同的笔记本电脑玩这个游戏在线,因为我做了这个网络。我创建了类 Handler 这是一个管理所有游戏的类,使用对象实例的 Handler 类,我可以在游戏中得到任何东西,我想得到对象的实例。Player 类发送至服务器,因为我想做一些事情来使游戏在线。

java sockets networking
1个回答
0
投票

我通过以下方式解决了这个异常 GameClient 对象 Game 阶层 transient 因为我不想把它序列化。我想要的是使用这个对象来向服务器发送一些东西,从 Game 内部的对象。

© www.soinside.com 2019 - 2024. All rights reserved.