2013-04-24 159 views
1

我试图在NetBeans上运行java中的客户端服务器程序。在NetBeans上运行用Java编写的客户端 - 服务器程序

下面是该服务器的代码:

// 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]); #line 48, error arises here. 
     try 
     { 
     Thread t = new GreetingServer(port); 
     t.start(); 
     }catch(IOException e) 
     { 
     e.printStackTrace(); 
     } 
    } 
} 

这里的客户端代码:

// File Name GreetingClient.java 

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

public class GreetingClient 
{ 
    public static void main(String [] args) 
    { 
     String serverName = args[0]; #line 10, error arises here 
     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(); 
     } 
    } 
} 

所以,当我要模拟的客户端和服务器运行起来我第一次运行服务器。 一旦服务器运行,我需要运行客户端。

然而,当我尝试运行服务器上的文件,我得到以下错误:

运行: 异常线程 “main” java.lang.ArrayIndexOutOfBoundsException:0 在GreetingServer.main(GreetingServer.java: 48) Java结果:1个 BUILD SUCCESSFUL(总时间:0秒)

同样,当我尝试运行客户端程序,我得到以下错误:

运行: 异常在线程“主” java.lang.ArrayIndexOutOfBoundsException:0 在GreetingClient.main(GreetingClient.java:10) Java结果:1个 BUILD SUCCESSFUL(总时间:0秒)

这究竟是为什么?请帮忙。

UPDATE:

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

public class GreetingServer extends Thread 
{ 
    private static int port; 
    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) 
    { 
     port=9000; 
     try 
     { 
     Thread t = new GreetingServer(port); 
     t.start(); 
     }catch(IOException e) 
     { 
     e.printStackTrace(); 
     } 
    } 
} 


// File Name GreetingClient.java 

import java.io.*; 
import java.net.*; 
public class GreetingClient 
{ 
    private static String serverName; 
    public static void main(String [] args) 
    { 
     String sName = "MyServerName"; 
     int port = 9000; 
     try 
     { 
     System.out.println("Connecting to " + sName 
          + " on port " + port); 
     Socket client = new Socket(sName, 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) 
     { 
     } 
    } 
} 

有在服务器端没有错误了。但我仍然得到下面的错误在客户端:

运行: 异常线程 “main” java.lang.ArrayIndexOutOfBoundsException:0 在GreetingClient.main(GreetingClient.java:10) Java结果:1 BUILD SUCCESSFUL(总时间:0秒)

+0

当土特产品运行您的程序,你传递任何参数呢? – user902383 2013-04-24 08:34:24

+0

你如何运行服务器? – Padrus 2013-04-24 08:35:41

+0

不,我不是。如果我应该,那么我在哪里以及如何通过它们? – Anon 2013-04-24 08:36:14

回答

1

您的代码假设你传递你想作为一个参数,所以使用的端口:

  • 要么运行带有线PatrykRoszczyniała发布

  • 如果你不想让你的应用程序使用它,只是删除行:

    String serverName = args[0]; 
    int port = Integer.parseInt(args[0]); 
    

    ,并通过硬编码值一样代替他们:

    String serverName = "MyServerName"; 
    int port = 3000; 
    

更新:

我只是测试你的代码,其实ServerName是地址用于连接到服务器,因此通过"localhost"替换它,如果你同时运行客户端和服务器在同一台机器上。

测试代码:

这里是我测试更新的代码,如果你在同一台机器上同时运行它应该很好地工作。

客户:

import java.io.*; 
import java.net.*; 
public class GreetingClient 
{ 
    private static String serverName; 
    public static void main(String [] args) 
    { 
     String sName = "localhost"; 
     int port = 9000; 
     try 
     { 
     System.out.println("Connecting to " + sName 
          + " on port " + port); 
     Socket client = new Socket(sName, 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) 
     { 
     } 
    } 
} 

服务器:

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

public class GreetingServer extends Thread 
{ 
    private static int port; 
    private ServerSocket serverSocket; 

    public GreetingServer(int port) throws IOException 
    { 
     serverSocket = new ServerSocket(port); 
     serverSocket.setSoTimeout(20000); 
    } 

    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) 
    { 
     port=9000; 
     try 
     { 
     Thread t = new GreetingServer(port); 
     t.start(); 
     }catch(IOException e) 
     { 
     e.printStackTrace(); 
     } 
    } 
} 
+0

请更新 – Anon 2013-04-24 09:18:43

+0

我编译并运行了你的代码,我没有发现异常,但是你要将serverName设置为“localhost”来连接它。 检查我的编辑 – Padrus 2013-04-24 09:37:23

+0

我发布了你测试过的更新代码,检查它,它在我的电脑上完美运行,只需在Eclipse中运行它们。 – Padrus 2013-04-24 09:43:19

1

要运行SocketServer您需要传递服务器将工作的端口。例如:

SocketServer server = new SocketServer(1234); 

的问题是,你要通过java的参数传递端口,你不这样做。首先,在使用任何变量之前,应首先验证它。

if (args.length>0) { 
    int port = Integer.parseInt(args[0]); #line 48, error arises here. 
} 

你的程序需要params,但我认为你可能运行你的程序没有params。 你应该以这种方式运行程序:java -jar app.jar 1234 但你这样做:java -jar app.jar

在这篇文章中,你会发现如何使用NetBeans http://netbeanside61.blogspot.com/2009/02/using-command-line-arguments-in.html参数传递给Java程序。

如果您是新手,请先阅读本教程http://docs.oracle.com/javase/tutorial/networking/sockets/。这非常有帮助。

+0

请查看更新。 – Anon 2013-04-24 09:18:59

+0

你有与客户端相同的问题。您尝试将'arg [0]'作为端口传递,但'arg'数组为空。你应该在使用它之前验证arg数组,并且使用命令行或客户机的硬编码端口为客户机传递端口。 – pepuch 2013-04-24 09:26:21

+0

有另一个样子,我硬编码的端口号。现在是:String sName =“MyServerName”; int port = 9000; – Anon 2013-04-24 09:38:47

相关问题