2014-09-03 66 views
-1

我正在学习在Java中使用套接字。我在网上得到了这个例子,并试图实现它。它是一个猜测数字的游戏。服务器获取一个随机数供用户从客户端猜测。我在Eclipse 4.2.2中构建了这个项目。但是,当我试图启动从MAC终端服务器,它显示了这一点:在Java套接字编程中发生“线程异常”主“java.lang.NoClassDefFoundError”

ritekiMacBook-Pro:test Michael$ javac ServerApp.java 
ServerApp.java:45: ?Ҳ??????? 
???ţ? ???? ClientApp 
λ?ã? ?? test.ServerApp.ServerThread 
       ClientApp.finished = true; 
       ^
ServerApp.java:48: ?Ҳ??????? 
???ţ? ???? ClientApp 
λ?ã? ?? test.ServerApp.ServerThread 
       ClientApp.finished = false; 
       ^
ServerApp.java:51: ?Ҳ??????? 
???ţ? ???? ClientApp 
λ?ã? ?? test.ServerApp.ServerThread 
       ClientApp.finished = false; 
       ^
ServerApp.java:54: ?Ҳ??????? 
???ţ? ???? ClientApp 
λ?ã? ?? test.ServerApp.ServerThread 
       if (!ClientApp.finished){ 
       ^
ServerApp.java:60: ?Ҳ??????? 
???ţ? ???? ClientApp 
λ?ã? ?? test.ServerApp.ServerThread 
      if (!ClientApp.finished){ 
       ^
ServerApp.java:63: ?Ҳ??????? 
???ţ? ???? ClientApp 
λ?ã? ?? test.ServerApp.ServerThread 
      ClientApp.finished = true; 
      ^
6 ???? 



ritekiMacBook-Pro:test Michael$ java ServerApp 
Exception in thread "main" java.lang.NoClassDefFoundError: ServerApp 
Caused by: java.lang.ClassNotFoundException: ServerApp 
    at java.net.URLClassLoader$1.run(URLClassLoader.java:202) 
    at java.security.AccessController.doPrivileged(Native Method) 
    at java.net.URLClassLoader.findClass(URLClassLoader.java:190) 
    at java.lang.ClassLoader.loadClass(ClassLoader.java:306) 
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301) 
    at java.lang.ClassLoader.loadClass(ClassLoader.java:247) 

而这也恰好给ClientApp.java。 我完全对此感到困惑。我不确定它是因为我MAC的默认语言是中文。

这里是ServerApp和ClientApp代码:

ServerApp.java:

package test; 
    import java.io.*; 
    import java.net.*; 

    public class ServerApp{ 
     static final int PORT = 9000; 
     private ServerSocket serverSocket; 
     private Socket socket; 
     private BufferedReader netIn; 
     private PrintWriter netOut; 
     public ServerApp() throws IOException{ 
     serverSocket = new ServerSocket(PORT); 
     System.out.println("server start"); 
     while (true){ 
      // waiting for connect; 
      socket = serverSocket.accept(); 
      ServerThread st = new ServerThread(socket); 
      new Thread(st).start(); 
     } 
     } 
     class ServerThread implements Runnable{ 
     private Socket socket; 
     private int randomNumber; 
     private int clientGuessNumber; 
     public ServerThread(Socket s) throws IOException{ 
      socket = s; 
      netIn = new BufferedReader(new InputStreamReader(socket.getInputStream())); 
      netOut = new PrintWriter(socket.getOutputStream()); 
     } 
     public void run(){ 
      System.out.println("client" + socket.getInetAddress() + " is connect"); 
      randomNumber = (int) (Math.random() * 100); 
      System.out.println("random number is:" + randomNumber); 
      try{ 
      clientGuessNumber = Integer.parseInt(netIn.readLine()); 
      System.out.println("client guess number is:" + clientGuessNumber); 
      for (int i = 3; i > 0; i--){ 
       if (clientGuessNumber == randomNumber){ 
       netOut.println("OK, you got it right"); 
       ClientApp.finished = true; 
       } else if (clientGuessNumber < randomNumber){ 
       netOut.println("Your number is smaller than it, you still have " + (i - 1) + "chances"); 
       ClientApp.finished = false; 
       } else if (clientGuessNumber > randomNumber){ 
       netOut.println("Your number is bigger than it, you still have" + (i - 1) + "chances"); 
       ClientApp.finished = false; 
       } 
       netOut.flush(); 
       if (!ClientApp.finished){ 
       clientGuessNumber = Integer.parseInt(netIn.readLine()); 
       } else{ 
       break; 
       } 
      } 
      if (!ClientApp.finished){ 
       netOut.println("OK, game over. You used all your chances."); 
      } 
      ClientApp.finished = true; 
      } catch (IOException e){ 
      } finally{ 
      try{ 
       netOut.close(); 
       netIn.close(); 
       socket.close(); 
      } catch (IOException ee){ 
      } 
      } 
     } 
     } 
     public static void main(String[] args) throws IOException{ 
     new ServerApp(); 
     } 
    } 

ClientApp.java:

package test; 
import java.io.*; 
import java.net.*; 

public class ClientApp{ 
      private Socket socket; 
      private BufferedReader netIn; 
      private PrintWriter netOut; 
      private BufferedReader keyboardIn; 
      static Boolean finished = false; 

      public ClientApp() throws IOException{ 
      System.out.println("Please input the server address, for local server please input localhost"); 
      keyboardIn = new BufferedReader(new InputStreamReader(System.in)); 
      try{ 
       if (keyboardIn.readLine().equalsIgnoreCase("localhost")){ 
       socket = new Socket(InetAddress.getLocalHost(), ServerApp.PORT); 
       } else{ 
       socket = new Socket(InetAddress.getByName(keyboardIn.readLine()), ServerApp.PORT); 
       } 
       System.out.println(ServerApp.PORT); 
       netIn = new BufferedReader(new InputStreamReader(socket.getInputStream())); 
       netOut = new PrintWriter(socket.getOutputStream()); 
      } catch (UnknownHostException e){ 
       System.err.println("cannot connect to server"); 
       System.exit(-1); 
      } 
      System.out.println("Connect suceeded"); 
      while (!finished){ 
       System.out.println("Please input a number between 0 and 100"); 
       netOut.println(keyboardIn.readLine()); 
//   netOut.print(keyboardIn.readLine()); 
       netOut.flush(); 
//   System.out.println(ServerApp.PORT); 
       String str = netIn.readLine(); 
       if (str == null){ 
       finished = true; 
       break; 
       } 
       System.out.println(str); 
       if (str.startsWith("OK")){ 
       finished = true; 
       break; 
       } 
      } 
      netIn.close(); 
      netOut.close(); 
      keyboardIn.close(); 
      socket.close(); 
      } 
      public static void main(String[] args) throws IOException{ 
      new ClientApp(); 
      } 

} 

有人能帮助我吗?谢谢。

+0

检查,如果您使用的是保存版本的编译和运行你的代码。 – Hannes 2014-09-03 18:53:15

+0

是的,他们都是1.6.0_65版本。 – 2014-09-03 19:20:18

+0

该编译器输出错误!你期望什么? – chrylis 2014-09-03 19:51:18

回答

2

您正在test文件夹中运行java命令。改为父目录并改为运行。

Java编译器希望在与包结构匹配的目录结构中查找类。您的ClientApp类位于test包中,因此编译器会在名为test的当前目录的子文件夹中查找它。您正在运行test文件夹中的javac,因此编译器会在名为test的子文件夹test中查找该类。这不是ClientApp类的地方,所以javac找不到它。

当您切换到父目录并从那里运行javac时,这两个类都位于当前目录test的子文件夹中,编译器可以找到它们。

当我使用Java编译器从test文件夹编译代码,我得到以下输出:

C:\Users\Luke\Java\test>javac ServerApp.java 
ServerApp.java:40: error: cannot find symbol 
       ClientApp.finished = true; 
       ^
    symbol: variable ClientApp 
    location: class ServerApp.ServerThread 

    (5 similar errors omitted) 

这些可能是你所得到的同样的错误。

如果我更改到父目录,然后再试一次,你的代码编译好:

C:\Users\Luke\Java\test>cd .. 

C:\Users\Luke\Java>javac test/ServerApp.java 

C:\Users\Luke\Java> 
+0

它的工作!非常感谢! – 2014-09-03 20:17:08

相关问题