繁体   English   中英

如何在 java 网络中使用 ObjectInbputStreem 修复 java EOFException

[英]How to fix java EOFException using ObjectInbputStreem in java network

我想使用网络发送一些对象。 我的网络是使用DatagramSocketDatagramPacketByteArrayInputStreamObjectInputStreamByteArrayOutputStreamObjectOutputStream制作的。 When I was trying to send an object using network I got java.io.EOFException and when I handled this exception using try and catch I lost my object.

服务器端

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

}

将 object 发送到服务器的代码

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 中使用多线程的游戏,我想创建简单的网络来让两台不同的笔记本电脑在线玩这个游戏,因为我做了这个网络。 I created class Handler this is a class to manage all the game, using object instance of Handler class I can get anything in the game and I want to get object instance of Player class to send it to server because I want to do something to make游戏在线。

我通过在Game class transient中制作GameClient object 解决了这个异常,因为我不想序列化它。 我想要的是使用这个 object 在内部从Game object 向服务器发送一些东西。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM