Java:通过 LAN 网络进行序列化时遇到问题

标签 java networking ioexception

抱歉,如果这是另一个问题的转发;经过一个小时的谷歌搜索后我找不到任何东西。无论如何,问题是:我在游戏中有一个服务器类和一个客户端类。服务器应该通过网络向客户端发送一个包含所有信息的对象。但是,当我尝试发送它时,它给了我一个 IO.EOFException。这是所有内容的代码:

public class NetworkClient {
private static Socket socket = null;
private static ObjectOutputStream oos;
private static ObjectInputStream ois;
private static FileInputStream fileIn;

public static void startConnection(){
    try {
        socket = new Socket("192.168.1.5", 4445);
        oos = new ObjectOutputStream(socket.getOutputStream());
        ois = new ObjectInputStream(socket.getInputStream());
    } catch (UnknownHostException e) {
        System.err.println("Don't know about host.");
        System.exit(1);
    } catch (IOException e) {
        System.err.println("Couldn't get I/O for "
                           + "the connection to: 192.168.1.5.");

    }
    fileIn = null;
}

public static void getVariables(){
    try
    {
       FileInputStream fileIn =
                     new FileInputStream("variables.ser");
       ois = new ObjectInputStream(fileIn);
       Display.variables = (Variables) ois.readObject();
       ois.close();
       fileIn.close();
   }catch(IOException i)
   {
       i.printStackTrace();
       return;
   }catch(ClassNotFoundException c)
   {
       System.out.println("Variables class not found");
       c.printStackTrace();
       return;
 }
 }
 }

这是服务器:

public class NetworkHost {
    private static ServerSocket serverSocket;
    private static Socket clientSocket;
    private static ObjectInputStream ois;
    private static ObjectOutputStream oos;

public static void startConnection(){

            serverSocket = null;
        try {
            serverSocket = new ServerSocket(4445);
        } catch (IOException e) {
            System.err.println("Could not listen on port: 4444.");
            System.exit(1);
        }
            clientSocket = null;
        try {
            clientSocket = serverSocket.accept();
        } catch (IOException e) {
            System.err.println("Accept failed.");
            System.exit(1);
        }

        try {
            ois = new ObjectInputStream(clientSocket.getInputStream());
            oos = new ObjectOutputStream(clientSocket.getOutputStream());
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

}

public static void sendVariables(){
    try
      {
         FileOutputStream fileOut =
         new FileOutputStream("variables.ser");
         ObjectOutputStream out =
                            new ObjectOutputStream(fileOut);
         out.writeObject(Display.variables);
         out.close();
          fileOut.close();
      }catch(IOException i)
      {
          i.printStackTrace();
      }
}   
}

最后,这是错误:

  java.io.EOFException
    at java.io.ObjectInputStream$PeekInputStream.readFully(ObjectInputStream.java:2280)
    at java.io.ObjectInputStream$BlockDataInputStream.readShort(ObjectInputStream.java:2749)
    at java.io.ObjectInputStream.readStreamHeader(ObjectInputStream.java:779)
    at java.io.ObjectInputStream.<init>(ObjectInputStream.java:279)
    at com.dodger.NetworkClient.getVariables(NetworkClient.java:36)
at com.dodger.Display.main(Display.java:129)

所以,长话短说,我(可能)搞砸了一些愚蠢的事情,现在对象无法在客户端和服务器之间发送。有修复的想法吗?谢谢!

最佳答案

看起来您的服务器实际上并未向客户端发送任何内容。除非显示的代码之外还有其他内容,否则 Display.variables 永远不会发送到网络。

为客户考虑这种方法:

private static Socket socket = null;
private static ObjectOutputStream oos;
private static ObjectInputStream ois;

// snip ...

public static void getVariables()
{
    try
    {
       ois = new ObjectInputStream(socket.getInputStream());
       Display.variables = (Variables) ois.readObject();
       ois.close();
    }
    catch(IOException i)
    {
       i.printStackTrace();
       return;
    }
    catch(ClassNotFoundException c)
    {
       System.out.println("Variables class not found");
       c.printStackTrace();
       return;
    }
}

服务器的这种方法:

private static ServerSocket serverSocket;
private static Socket clientSocket;
private static ObjectInputStream ois;
private static ObjectOutputStream oos;

// snip ...

public static void sendVariables()
{
    try
    {
        ObjectOutputStream out = new ObjectOutputStream(clientSocket.getOutputStream());
        out.writeObject(Display.variables);
        out.close();
    }
    catch(IOException i)
    {
        i.printStackTrace();
    }
}

我不能 100% 确定这将完全按照所写的那样为您工作,这取决于您如何进行初始化以及在何处进行初始化。将此视为指导原则。

而且你的缩进也很糟糕。

关于Java:通过 LAN 网络进行序列化时遇到问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11194350/

相关文章:

具有默认值的类的java数组

java - java网络中的EOFException

python - 使用 BPF 过滤器时 python 脚本的 CPU 使用率

android - 是什么导致 jobb 工具抛出 FAT Full IOException?

java - IOException - 读取 html 文件时流意外结束

java - 将 jar 作为 Linux 服务运行 - init.d 脚本在启动应用程序时卡住

java - 使用 Java 生成基于数组的图

c - Network Programming in C(简单服务器演示代码混淆)

java - 调试 "Too many files open"问题

java - Java 中的 Processbuilder 不会抛出子流程异常