2014-12-04 66 views
3

好的,我在书中找到了这个例子,所以我知道这段代码没有错误。下面的程序包含两个类,它们都是主类。一个用于客户端,另一个用于服务器。如何使用Eclipse在Java中编译此网络套接字示例?

根据这本书,我应该对它们进行编译如下:

编译客户端和服务器,然后启动服务器,如下所示:

$ java的GreetingServer 6066 等待客户端上的端口6066。 ..

检查客户端程序如下:

$ java的GreetingClient本地主机6066 连接到本地主机端口6066 菊st连接到本地主机/ 127.0.0.1:6066 服务器说感谢您连接到/127.0.0.1:6066 再见!

我希望能够在Eclipse中运行它们,但每次我这样做的时候,它给我这个错误:螺纹 异常“主要” java.lang.ArrayIndexOutOfBoundsException:0 在GreetingServer.main(GreetingServer。的java:47)。

如何在ECLIPSE中运行此程序?谢谢。

//文件名GreetingClient.java

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

public class GreetingClient 
{ 
    public static void main(String [] args) 
    { 
     String serverName = args[0]; 
     int port = Integer.parseInt(args[1]); 
     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(); 
     DataOutputStream out = 
         new DataOutputStream(outToServer); 

     out.writeUTF("Hello from " 
         + client.getLocalSocketAddress()); 
     InputStream inFromServer = client.getInputStream(); 
     DataInputStream in = 
         new DataInputStream(inFromServer); 
     System.out.println("Server says " + in.readUTF()); 
     client.close(); 
     }catch(IOException e) 
     { 
     e.printStackTrace(); 
     } 
    } 
} 


// File Name GreetingServer.java 

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

    public void run() 
    { 
     while(true) 
     { 
     try 
     { 
      System.out.println("Waiting for client on port " + 
      serverSocket.getLocalPort() + "..."); 
      Socket server = serverSocket.accept(); 
      System.out.println("Just connected to " 
        + server.getRemoteSocketAddress()); 
      DataInputStream in = 
        new DataInputStream(server.getInputStream()); 
      System.out.println(in.readUTF()); 
      DataOutputStream out = 
       new DataOutputStream(server.getOutputStream()); 
      out.writeUTF("Thank you for connecting to " 
       + server.getLocalSocketAddress() + "\nGoodbye!"); 
      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 = Integer.parseInt(args[0]); 
     try 
     { 
     Thread t = new GreetingServer(port); 
     t.start(); 
     }catch(IOException e) 
     { 
     e.printStackTrace(); 
     } 
    } 
} 

回答

2

参见这些线

public static void main(String [] args) 
{ 
    String serverName = args[0]; //<-- Expecting a value 
    int port = Integer.parseInt(args[1]); //<-- Expecting a value 

的ARGS []是包含您通过命令行参数传递的字符串数组。当你试图直接从eclipse运行它时,你并没有指定导致args []为空数组的这些值,因此args [0]给出了一个ArrayIndexOutOfBoundsException

要解决此问题, Eclipse中(见截图)

enter image description here

,并指定要日食通过运行这个类时arguements。 YOu可以通过right-clicking the project, select run, then run-configurations --> double click on java_application来完成此操作,并传递您想要的信息。指定参数时可能需要指定主类名,以便eclipse可以识别哪个主类要传递参数。

或者你也可以直接在类中对这些值进行硬编码(用于测试)

0

你需要创建一个运行配置和传递参数那里。在eclipse中运行程序。让它失败。这会自动创建一个运行配置。编辑配置以添加参数。或者创建一个新的运行配置。