一.事件经过
今晚学习java网络编程,在eclipse中写了两个个java文件,一个发送端UDP_Send2.java,一个接收端UDP_Receive.java。实现发送端键盘录入信息,通过UDP传输方式将数据发送出去,接接收端再接受数据的功能。
源码如下:
1.UDP_Send2.java
package com.ray.net; import java.io.BufferedReader; import java.io.InputStreamReader; import java.net.DatagramPacket; import java.net.DatagramSocket; import java.net.InetAddress; import java.net.SocketException; /* * 键盘录入 * * 需求:通过UDP传输方式,将一段文字数据发送出去。 * 定义一个udp发送端。 * 思路: * 1.建立udpsocket服务。 * 2.提供数据,并将数据封装到数据包中。 * 3.通过socket服务的发送功能,将数据包发送出去。 * 4.关闭资源。 */ public class UDP_Send2 { public static void main(String[] args) throws Exception{ // TODO Auto-generated method stub DatagramSocket ds=new DatagramSocket(); //键盘录入 BufferedReader bufr=new BufferedReader(new InputStreamReader(System.in)); String line=null; while((line=bufr.readLine())!=null){ if("886".equals(line)) break; byte[] buf=line.getBytes(); DatagramPacket dp= new DatagramPacket(buf, buf.length, InetAddress.getByName("192.168.31.190"), 10001); ds.send(dp); } ds.close(); } }
2.UDP_Receive.java
package com.ray.net; import java.net.DatagramPacket; import java.net.DatagramSocket; /* * 需求: 定义一个应用程序,用于接收udp协议传输的数据并处理的。 * * 思路: * 1.定义udpSocket服务。通常会监听一个端口。其实就是给这个就收网络应用程序定义数字标识。 * 2.定义数据包,用于存储接收的数据。 * 3.通过socket服务的receive方法,将接收到的数据存入数据包中。 * 4.通过数据包的方法获取其中的数据。 * 5.关闭资源 * */ public class UDP_Receive { public static void main(String[] args) throws Exception{ //1.创建udp socket, 建立端点,设置监听端口。 DatagramSocket ds=new DatagramSocket(10001); while(true){ //由于ds.receive(dp)方法是阻塞式。 //2.定义数据包,用于存储数据。 byte[] buf=new byte[1024]; DatagramPacket dp=new DatagramPacket(buf,buf.length); //3.通过服务的receive方法,将接收到的数据存入数据包中。 //ds.receive(dp)方法是阻塞式方法,线程运行到此处,便停止。没数据就等,有数据接收数据。 ds.receive(dp); //4.通过数据包的方法获取其中的数据。 String ip=dp.getAddress().getHostAddress(); String data=new String(dp.getData(),0,dp.getLength()); int port=dp.getPort(); System.out.println(ip+"::"+data+"::"+port); } //5.关闭资源 //ds.close(); } }
由于UDP_Send2.java实现了键盘录入功能,而在elclipse中运行之后不能调出给你输入的地方。因此我拷贝了这两个文件到了 E:\Maijor_win7\JAVA\example\NET 目录下。
调用cmd,编译成功,然后执行命令:java UDP_Receive。却报出了
Exception in thread "main" java.lang.NoClassDefFoundError: UDP_Receive (wrong na me: com/ray/net/UDP_Receive)
二.异常信息
Exception in thread "main" java.lang.NoClassDefFoundError: UDP_Receive (wrong na
me: com/ray/net/UDP_Receive)
at java.lang.ClassLoader.defineClass1(Native Method)
at java.lang.ClassLoader.defineClass(ClassLoader.java:800)
at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:14
2)
at java.net.URLClassLoader.defineClass(URLClassLoader.java:449)
at java.net.URLClassLoader.access$100(URLClassLoader.java:71)
at java.net.URLClassLoader$1.run(URLClassLoader.java:361)
at java.net.URLClassLoader$1.run(URLClassLoader.java:355)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:354)
at java.lang.ClassLoader.loadClass(ClassLoader.java:425)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308)
at java.lang.ClassLoader.loadClass(ClassLoader.java:358)
at sun.launcher.LauncherHelper.checkAndLoadMain(LauncherHelper.java:482)
三.解决方案
1.异常发生的原因:
NoClassDefFoundError异常是 java虚拟机在编译时能找到合适的类,但是运行时在Java的classpath路径中却不能找到合适的类 导致的。
而 Exception in thread "main" java.lang.NoClassDefFoundError: UDP_Receive (wrong name: com/ray/net/UDP_Receive),这句话的意思是 main线程出了异常,找不到这个类:UDP_Receive(错误的名字:com/ray/net/UDP_Receive)。
这两个java文件所在目录为:E:\Maijor_win7\JAVA\example\NET,看到这里,立马就知道是包名冲突了。
2.解决异常
删掉这两个java文件中的 package com.ray.net; 后,就都正常了。