1

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

したがって、クライアントとサーバーが一緒に実行されている様子をシミュレートしたい場合は、最初にサーバーを実行します。サーバーが実行されたら、クライアントを実行する必要があります。

ただし、サーバー ファイルを実行しようとすると、次のエラーが発生します。

実行: スレッド「メイン」の例外 java.lang.ArrayIndexOutOfBoundsException: GreetingServer.main(GreetingServer.java:48) で 0 Java 結果: 1 ビルド成功 (合計時間: 0 秒)

同様に、クライアント プログラムを実行しようとすると、次のエラーが表示されます。

実行: スレッド「メイン」での例外 java.lang.ArrayIndexOutOfBoundsException: GreetingClient.main(GreetingClient.java:10) で 0 Java 結果: 1 ビルド成功 (合計時間: 0 秒)

なぜこうなった?助けてください。

アップデート:

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

現在、サーバー側にエラーはありません。しかし、クライアント側で次のエラーが引き続き発生します。

実行: スレッド「メイン」での例外 java.lang.ArrayIndexOutOfBoundsException: GreetingClient.main(GreetingClient.java:10) で 0 Java 結果: 1 ビルド成功 (合計時間: 0 秒)

4

2 に答える 2

2

あなたのコードは、引数として使用したいポートを渡すことを前提としています。

  • Patryk Roszczyniał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();
      }
   }
}
于 2013-04-24T08:41:52.433 に答える
1

実行SocketServerするには、サーバーが動作するポートを渡す必要があります。例えば:

SocketServer server = new SocketServer(1234);

問題は、Java 引数でポートを渡したいのに、それを行っていないことです。まず、変数を使用する前に、まずそれを検証する必要があります。

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

プログラムにはパラメーターが必要ですが、おそらくパラメーターなしでプログラムを実行していると思います。この方法でプログラムを実行する必要があります:java -jar app.jar 1234 しかし、この方法で実行します:java -jar app.jar

この記事では、netbeans http://netbeanside61.blogspot.com/2009/02/using-command-line-arguments-in.htmlを使用して Java プログラムにパラメーターを渡す方法を説明します。

Java を初めて使用する場合は、最初にこのチュートリアルhttp://docs.oracle.com/javase/tutorial/networking/sockets/を読む必要があります。とても役に立ちます。

于 2013-04-24T08:36:51.240 に答える