UDP示例给出java.lang.ClassNotFoundException:packagename.Foo异常;如何修复?

UDP示例给出java.lang.ClassNotFoundException:packagename.Foo异常;如何修复?,java,serialization,udp,datagram,Java,Serialization,Udp,Datagram,我是UDP协议的新手,我想学习一个好的例子。我终于找到了一个好方法,但它给出了java.lang.ClassNotFoundException:packagename.Student异常 我先运行服务器,然后运行客户端 客户端输出: 从客户端发送的消息 服务器回复:谢谢你的留言□□□□□□□□□□□□□□□□□□□□□ 大行□□□□ 在上面 服务器输出: java.lang.ClassNotFoundException:ex_udp_client.Student at java.net.UR

我是UDP协议的新手,我想学习一个好的例子。我终于找到了一个好方法,但它给出了
java.lang.ClassNotFoundException:packagename.Student
异常

我先运行服务器,然后运行客户端

客户端输出:

从客户端发送的消息
服务器回复:谢谢你的留言□□□□□□□□□□□□□□□□□□□□□

大行□□□□ 在上面

服务器输出:

java.lang.ClassNotFoundException:ex_udp_client.Student at java.net.URLClassLoader$1.run(URLClassLoader.java:366)位于 java.net.URLClassLoader$1.run(URLClassLoader.java:355)在 java.security.AccessController.doPrivileged(本机方法)位于 java.net.URLClassLoader.findClass(URLClassLoader.java:354)位于 loadClass(ClassLoader.java:423)位于 sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308)位于 loadClass(ClassLoader.java:356)位于 java.lang.Class.forName0(本机方法)位于 java.lang.Class.forName(Class.java:266)位于 位于的java.io.ObjectInputStream.resolveClass(ObjectInputStream.java:622) java.io.ObjectInputStream.readNonProxyDesc(ObjectInputStream.java:1593) 在 java.io.ObjectInputStream.readClassDesc(ObjectInputStream.java:1514) 在 java.io.ObjectInputStream.ReadOrderinaryObject(ObjectInputStream.java:1750) 位于java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1347) 位于java.io.ObjectInputStream.readObject(ObjectInputStream.java:369) 在 ex_udp_server.UDPSocketServer.createAndListenSocket(UDPSocketServer.java:40)位于ex_udp_server.UDPSocketServer.main(UDPSocketServer.java:72)构建中 成功(总时间:6秒)

我认为在这一行抛出的异常:
Student=(Student)是.readObject()

如何修复

可序列化类复制到客户端和服务器的两个包中

import java.io.Serializable;

public class Student implements Serializable
{

   public Student(int id, String name, String address1)
   {
      this.id = id;
      this.name = name;
      this.addressLine = address1;
   }
   private static final long serialVersionUID = 1L;
   private int id;
   private String name;
   private String addressLine;

   public int getId()
   {
      return id;
   }

   public void setId(int id)
   {
      this.id = id;
   }

   public String getName()
   {
      return name;
   }

   public void setName(String name)
   {
      this.name = name;
   }

   public String getAddressLine()
   {
      return addressLine;
   }

   public void setAddressLine(String addressLine)
   {
      this.addressLine = addressLine;
   }

   public String toString()
   {
      return "Id = " + getId() + " Name = " + getName() + " Address = " + getAddressLine();
   }
}
服务器类

import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException;

public class UDPSocketServer
{

   DatagramSocket socket = null;

   public UDPSocketServer()
   {
   }

   public void createAndListenSocket()
   {
      try
      {
         socket = new DatagramSocket(9876);
         byte[] incomingData = new byte[1024];

         while (true)
         {
            DatagramPacket incomingPacket = new DatagramPacket(incomingData, incomingData.length);
            socket.receive(incomingPacket);
            byte[] data = incomingPacket.getData();
            ByteArrayInputStream in = new ByteArrayInputStream(data);
            ObjectInputStream is = new ObjectInputStream(in);
            try
            {
               Student student = (Student) is.readObject();
               System.out.println("Student object received = " + student);
            } catch (ClassNotFoundException e)
            {
               e.printStackTrace();
            }
            InetAddress IPAddress = incomingPacket.getAddress();
            int port = incomingPacket.getPort();
            String reply = "Thank you for the message";
            byte[] replyBytea = reply.getBytes();
            DatagramPacket replyPacket =
                    new DatagramPacket(replyBytea, replyBytea.length, IPAddress, port);
            socket.send(replyPacket);
            Thread.sleep(2000);
            System.exit(0);
         }

      } catch (SocketException e)
      {
         e.printStackTrace();
      } catch (IOException i)
      {
         i.printStackTrace();
      } catch (InterruptedException e)
      {
         e.printStackTrace();
      }
   }

   public static void main(String[] args)
   {
      UDPSocketServer server = new UDPSocketServer();
      server.createAndListenSocket();
   }
}
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.ObjectOutputStream;
import java.net.*;

public class UDPSocketClient
{

   DatagramSocket Socket;

   public UDPSocketClient()
   {
   }

   public void createAndListenSocket()
   {
      try
      {

         Socket = new DatagramSocket();
         InetAddress IPAddress = InetAddress.getByName("localhost");
         byte[] incomingData = new byte[1024];
         Student student = new Student(1, "Bijoy", "Kerala");
         ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
         ObjectOutputStream os = new ObjectOutputStream(outputStream);
         os.writeObject(student);
         byte[] data = outputStream.toByteArray();
         DatagramPacket sendPacket = new DatagramPacket(data, data.length, IPAddress, 9876);
         Socket.send(sendPacket);
         System.out.println("Message sent from client");
         DatagramPacket incomingPacket = new DatagramPacket(incomingData, incomingData.length);
         Socket.receive(incomingPacket);
         String response = new String(incomingPacket.getData());
         System.out.println("Response from server:" + response);
         Thread.sleep(2000);

      } catch (UnknownHostException e)
      {
         e.printStackTrace();
      } catch (SocketException e)
      {
         e.printStackTrace();
      } catch (IOException e)
      {
         e.printStackTrace();
      } catch (InterruptedException e)
      {
         e.printStackTrace();
      }
   }

   public static void main(String[] args)
   {
      UDPSocketClient client = new UDPSocketClient();
      client.createAndListenSocket();
   }
}
客户端类

import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException;

public class UDPSocketServer
{

   DatagramSocket socket = null;

   public UDPSocketServer()
   {
   }

   public void createAndListenSocket()
   {
      try
      {
         socket = new DatagramSocket(9876);
         byte[] incomingData = new byte[1024];

         while (true)
         {
            DatagramPacket incomingPacket = new DatagramPacket(incomingData, incomingData.length);
            socket.receive(incomingPacket);
            byte[] data = incomingPacket.getData();
            ByteArrayInputStream in = new ByteArrayInputStream(data);
            ObjectInputStream is = new ObjectInputStream(in);
            try
            {
               Student student = (Student) is.readObject();
               System.out.println("Student object received = " + student);
            } catch (ClassNotFoundException e)
            {
               e.printStackTrace();
            }
            InetAddress IPAddress = incomingPacket.getAddress();
            int port = incomingPacket.getPort();
            String reply = "Thank you for the message";
            byte[] replyBytea = reply.getBytes();
            DatagramPacket replyPacket =
                    new DatagramPacket(replyBytea, replyBytea.length, IPAddress, port);
            socket.send(replyPacket);
            Thread.sleep(2000);
            System.exit(0);
         }

      } catch (SocketException e)
      {
         e.printStackTrace();
      } catch (IOException i)
      {
         i.printStackTrace();
      } catch (InterruptedException e)
      {
         e.printStackTrace();
      }
   }

   public static void main(String[] args)
   {
      UDPSocketServer server = new UDPSocketServer();
      server.createAndListenSocket();
   }
}
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.ObjectOutputStream;
import java.net.*;

public class UDPSocketClient
{

   DatagramSocket Socket;

   public UDPSocketClient()
   {
   }

   public void createAndListenSocket()
   {
      try
      {

         Socket = new DatagramSocket();
         InetAddress IPAddress = InetAddress.getByName("localhost");
         byte[] incomingData = new byte[1024];
         Student student = new Student(1, "Bijoy", "Kerala");
         ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
         ObjectOutputStream os = new ObjectOutputStream(outputStream);
         os.writeObject(student);
         byte[] data = outputStream.toByteArray();
         DatagramPacket sendPacket = new DatagramPacket(data, data.length, IPAddress, 9876);
         Socket.send(sendPacket);
         System.out.println("Message sent from client");
         DatagramPacket incomingPacket = new DatagramPacket(incomingData, incomingData.length);
         Socket.receive(incomingPacket);
         String response = new String(incomingPacket.getData());
         System.out.println("Response from server:" + response);
         Thread.sleep(2000);

      } catch (UnknownHostException e)
      {
         e.printStackTrace();
      } catch (SocketException e)
      {
         e.printStackTrace();
      } catch (IOException e)
      {
         e.printStackTrace();
      } catch (InterruptedException e)
      {
         e.printStackTrace();
      }
   }

   public static void main(String[] args)
   {
      UDPSocketClient client = new UDPSocketClient();
      client.createAndListenSocket();
   }
}

您是在服务器中还是在客户端中获得此异常
在这两种情况中,无论哪一种情况下,它都表示您没有
该类在运行时存在(在客户端或服务器中)
我的意思是,你没有把它放在类路径上。

可序列化类复制到客户端和服务器的两个包

import java.io.Serializable;

public class Student implements Serializable
{

   public Student(int id, String name, String address1)
   {
      this.id = id;
      this.name = name;
      this.addressLine = address1;
   }
   private static final long serialVersionUID = 1L;
   private int id;
   private String name;
   private String addressLine;

   public int getId()
   {
      return id;
   }

   public void setId(int id)
   {
      this.id = id;
   }

   public String getName()
   {
      return name;
   }

   public void setName(String name)
   {
      this.name = name;
   }

   public String getAddressLine()
   {
      return addressLine;
   }

   public void setAddressLine(String addressLine)
   {
      this.addressLine = addressLine;
   }

   public String toString()
   {
      return "Id = " + getId() + " Name = " + getName() + " Address = " + getAddressLine();
   }
}

这就是问题所在。一个名为
client.Student
的类与
server.Student
不同,不管源代码怎么说。您需要在适当的目录中拥有该类的一个副本,并将.class文件部署到服务器和客户端。

何时/何地出现此错误?@prmottajr在服务器端;我先运行服务器,然后运行客户机,然后两者的输出都会出来,此时服务器抛出了一个异常;请参阅服务器中更新的question.exception。我已经将Serializable类复制到客户端和服务器的两个包中。请参阅更新的问题。您的学生课程包是什么?确保客户端和服务器在运行时都使用正确的包名将其放在其类路径上。这应该可以解决问题。