0

对不起,如果这是另一个问题的转贴;经过一个小时的谷歌搜索,我找不到任何东西。无论如何,问题是:我在游戏中有一个服务器类和一个客户端类。服务器应该通过网络向客户端发送一个包含所有信息的对象。但是,当我尝试发送它时,它给了我一个 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)

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

4

3 回答 3

2

看起来您的服务器实际上并未向客户端发送任何内容。除非显示的代码之外还有其他内容,否则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% 确定这将完全按照书面说明对您有用,这取决于您如何进行初始化以及在何处进行初始化。将此视为准则。

你的缩进也很糟糕。

于 2012-06-25T18:03:16.097 回答
1

我无法理解这一点。

  1. 您的标题说“通过 LAN 网络进行序列化”,但是您说的代码不起作用是从文件中读取的。

  2. 您的服务器写入文件;您的客户端从文件中读取。因此,套接字实际上是用来做什么的?如果服务器和客户端不在同一台机器上,这怎么可能工作?

  3. EOFException读取时ObjectInputStream仅表示您已到达流的末尾:对等方已关闭连接并且没有更多对象。

  4. 除非您的服务器设计为仅服务一个客户端,否则 clientSocket 和流变量不能是静态的,并且它们必须位于每个连接实例化的不同类中,通常是 Runnable,它管理连接并以自己的方式启动线。

于 2012-06-26T00:42:17.243 回答
0

客户端很可能正在尝试读取仍然为空的文件。你是如何运行这个应用程序的?主要方法在哪里?这不是序列化问题。

于 2012-06-25T17:44:07.387 回答