2013-12-11 21 views
0

我是UDP協議新手,我想從一個很好的例子中學習。我終於找到了一個好的example,但它給了java.lang.ClassNotFoundException: packagename.Student異常UDP示例給出java.lang.ClassNotFoundException:packagename.Foo異常;怎麼修?

我先運行服務器然後客戶端。

客戶端輸出:

消息從客戶
響應從服務器發送:謝謝你的留言□□□□□□□□□□□□□□□□□□□ □□

的□□□□大線以上

服務器輸出:

拋出java.lang.ClassNotFoundException:ex_udp_client.Student在 java.net.URLClassLoader的$ 1.run(URLClassLoader.java:366)在 java.net.URLClassLoader的$ 1.run(URLClassLoader.java:355)在 java.security.AccessController.doPrivileged(本機方法)在在 java.lang.ClassLoader.loadClass(ClassLoader.java:423) java.net.URLClassLoader.findClass(URLClassLoader.java:354)在 sun.misc。啓動器$ AppClassLoader.loadClass(Launcher.java:308)at java.lang.ClassLoader.loadClass(ClassLoader.java:356)at java.lang.Class.forName0(Native Method)at java.lang.Class.for名稱(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.readOrdinaryObject(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)BUILD 成功(總時間:6秒)

我想在這行拋出的異常:
Student student = (Student) is.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(); 
    } 
} 

Server類的兩個包的Serializable類

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

Client類

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

何時/你在哪裏得到這個錯誤? – prmottajr

+0

@prmottajr在服務器端;我先運行服務器,然後客戶端然後輸出兩者,服務器在那個時候拋出異常;查看更新的問題。 –

回答

0

複製到客戶端和服務器

的兩個包這就是問題的Serializable類。無論源代碼如何說,client.Studentserver.Student都不是一回事。您需要在適當的目錄中將一個此類的副本與部署到服務器和客戶端的.class文件一起使用。

0

您是否在服務器或客戶端中出現此異常?
無論你在哪裏獲得它,這意味着你沒有
這個類在運行時(在客戶端或在服務器)。
你的類路徑中沒有它,我的意思是。

+0

服務器異常。我已經將Serializable類複製到客戶端和服務器的兩個包中。查看更新的問題。 –

+0

你的學生課程包是什麼?確保客戶端和服務器在運行時在其類路徑上使用正確的軟件包名稱。應該修復它。 –