java - 当我在 ObjectInputStream 上调用 readObject() 时出现 ClassNotFoundException

标签 java sockets networking server

我正在为棋盘游戏制作一个 super 简单的服务器。它获取客户端连接,为我创建的板对象创建输入流并将其发送回。每当我在服务器或客户端中调用 readObject 时,都会收到 java.lang.ClassNotFoundException 错误。这是什么原因造成的?

服务器套接字

import java.net.*;
import java.io.*;

public class GreetingServer extends Thread {
   private ServerSocket serverSocket;

   public GreetingServer(int port) throws IOException {
      serverSocket = new ServerSocket(port);
      //serverSocket.setSoTimeout(10000);  //Don't timeout
   }

   public void run() {
      while(true) {
         try {
            PlayerBoard board;
            System.out.println("Waiting for client on port " + 
               serverSocket.getLocalPort() + "...");
            Socket server = serverSocket.accept();

            System.out.println("Just connected to " + server.getRemoteSocketAddress());
            ObjectInputStream in = new ObjectInputStream(server.getInputStream());

            //Get PlayerBoard Object from server.
            board = (PlayerBoard)in.readObject();      //LINE THAT GIVES ME EXCEPTION

            //Send PlayerBoard back
            ObjectOutputStream out = new ObjectOutputStream(server.getOutputStream());
            out.writeObject(board);

            //Close server
            server.close();

         }catch(SocketTimeoutException s) {
            System.out.println("Socket timed out!");
            break;
         }catch(IOException e) {
            e.printStackTrace();
            break;
         }
      }
   }

   public static void main(String [] args) {
      int port = 25565;
      try {
         Thread t = new GreetingServer(port);
         t.start();
      }catch(IOException e) {
         e.printStackTrace();
      }
   }
}

客户端套接字

import apcslib.*;
import java.net.*;
import java.io.*;

public class GreetingClient {

   public static void main(String [] args) {
      String serverName = "76.88.3.218";
      PlayerBoard board;
      int port = 25565;
      try {
         System.out.println("Connecting to " + serverName + " on port " + port);
         Socket client = new Socket(serverName, port);

         System.out.println("Just connected to " + client.getRemoteSocketAddress());
         OutputStream outToServer = client.getOutputStream();
         ObjectOutputStream out = new ObjectOutputStream(outToServer);

         //Send server PlayerBoard object
         out.writeObject(new PlayerBoard());

         InputStream inFromServer = client.getInputStream();
         ObjectInputStream in = new ObjectInputStream(inFromServer);

         //Get PlayerBoard object back from server
         board = (PlayerBoard)in.readObject(); //LINE THAT GIVES ME EXCEPTION

         /*Loop to print out board to console
         System.out.println("Board:");
         System.out.print("   ");

         for(int y = 1; y <= board.getWidth(); y++)
         {
            System.out.print(y + " ");
         }
         System.out.println();
         for(int y = 0; y < board.getHeight(); y++)
         {
            System.out.print(Format.left(y+1, 3));
            for (int x = 0; x < board.getWidth(); x++)
               System.out.print(board.displaySpot(x, y) + " ");
            System.out.println();
         }*/

         //Close connection
         client.close();
      }catch(IOException e) {
         e.printStackTrace();
      }
   }
}

我收到的消息:

错误:(28, 44) java: 未报告的异常 java.lang.ClassNotFoundException;必须被捕获或宣布被抛出

最佳答案

我知道发生了什么,但是作为引用,您可以将您的 PlayerBoard 类放上来吗?

有关我的想法的引用:请参阅 here

这是确保您能够正确读取对象的通用解决方案。如果服务器和客户端位于不同的项目中,那么有两种方法可以获得正确的结果:

  1. 您必须有两个相同的 PlayerBoard 类(具有相同的包名称)。
  2. PlayerBoard 位于您提供给服务器和客户端项目的共享 jar 中。

对于您的演示(这种可能性更大),如果您在同一个项目中同时拥有服务器和客户端,那么您无需担心上述注意事项。

剩下的就是:PlayerBoard 必须实现Serializable。如果您有两个 PlayerBoard 类,则两者都必须以相同的方式实现 Serialized

关于java - 当我在 ObjectInputStream 上调用 readObject() 时出现 ClassNotFoundException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43988155/

相关文章:

Linux:从哪里可以找到/proc 的 "segments retransmited"?

java - 调用 webservice 时绕过 HTTPS 证书验证

java - Java 中的虚拟操纵杆

java - TLS 1.2 客户端问候失败

javascript - 无法使用 Socket.IO 发送到 Node 服务器

java - 获取应用程序的端口号

java - 不使用 lambda 实现 `IntegerMath addition` 和 `IntegerMath subtraction` 吗?

sockets - 使用 SSL/TLS 比自己处理加密有什么优势

c - 索拉里斯 10 : handle gracefully ENOBUFS error when changing socket buffer

networking - 如何通过 UNC 路径使用 CMD 通过网络登录?