2017-02-06 3 views
1

javaでクライアントサーバプログラムを作成しました。プログラムを実行している間にポート番号とIPアドレスを取得する必要がありますが、Client.javaを実行している間はエラーが発生します。以下は私の両方のファイルです。ここでクライアント/サーバプログラミングでエラーが発生する

Server.java

package serverpro; 


import java.io.*; 
import static java.lang.ProcessBuilder.Redirect.to; 
import java.net.*; 
import java.util.logging.Level; 
import java.util.logging.Logger; 

public class Server extends Thread { 

public static final int PORT_NUMBER = 12345; 
protected Socket socket; 

public static void main(String[] args) { 
    ServerSocket server = null; 
    try { 
    server = new ServerSocket(PORT_NUMBER); 
    while (true) { 
     new Server(server.accept()); 
    } 
    } 
    catch(IOException ex) { 
    System.out.println("Unable to start server or acccept connections "); 
    System.exit(1); 
    } 
    finally { 
    try { 
     server.close(); 
    } 
    catch(IOException ex) { 
     // not much can be done: log the error 
     // exits since this is the end of main 
    } 
    } 
} 

private Server(Socket socket) { 
    this.socket = socket; 
    start(); 
} 

// the server services client requests in the run method 
    public void run() { 
    InputStream in = null; 
    OutputStream out = null; 

    BufferedReader inReader = new BufferedReader(newInputStreamReader(in)); 
    // the constructor argument “true” enables auto-flushing 
    PrintWriter outWriter = new PrintWriter(out, true); 
    outWriter.println("Echo server: enter bye to exit."); 

    //outWriter.println(“Echo server: enter ‘bye’ to exit.”); 
    while (true) { 
    // readLine blocks until a line-terminated string is available 
    String inLine; 
     try { 
      inLine = inReader.readLine(); 
     } catch (IOException ex) { 
      Logger.getLogger(Server.class.getName()).log(Level.SEVERE, null, ex); 
     } 
    // readLine returns null if the client just presses <return> 

    try { 
    in = socket.getInputStream(); 
    out = socket.getOutputStream(); 
    // ... do useful stuff ... 
    } 
    catch(IOException ex) { 
    System.out.println("Unable to get Stream from "); 
    } 
    finally { 
    try { 
     in.close(); 
     out.close(); 
     socket.close(); 
    } 
    catch(IOException ex) { 
     // not much can be done: log the error 
    } 
    } 
    } 
    } 
} 

Client.java

package serverpro; 

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

public class Client { 
public static void main(String args[]) throws IOException { 
    new Client(args[0]); 
} 

    public Client(String host) throws IOException { 
    Socket socket; 
    try { 
    socket = new Socket(host, Server.PORT_NUMBER); 
    } 
    catch(UnknownHostException ex) { 
    System.out.println(host + " is not a valid host name."); 
    return; 
    } 
    catch(IOException ex) { 
    System.out.println("Error connecting with" + host); 
    return; 
    } 
    // … initialize model, GUI, etc. ... 
    InputStream in = null; 
    OutputStream out = null; 
    try { 
    in = socket.getInputStream(); 
    out = socket.getOutputStream(); 
    // ... do useful stuff ... 
    } 
    finally { 
    try { 
     in.close(); 
     out.close(); 
     socket.close(); 
    } 
    catch(IOException ex) { 
     // not much can be done ... 
    } 
    } 
} 

}

client.javaファイル

Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 1 
at serverpro.Client.main(Client.java:13) 
/Users/Puja Dudhat/Library/Caches/NetBeans/8.2/executor- snippets/run.xml:53: Java returned: 1 
BUILD FAILED (total time: 0 seconds) 
+0

を実行すると、クライアントクラスを実行すると、必要なコマンドライン引数を渡す? – saurabh

+0

コマンドライン引数を渡さずに自動的に実行する必要があります。どうやってするか ? –

答えて

0

を実行している間、私は取得していますエラーコードですあなたがいると仮定します必要なコマンドライン引数を渡しません。このコードを実行したとき、必要な引数が渡されたかハードコードされていれば正常に動作しました。すなわち:

public static void main(**String args[]**) throws IOException { 
    new Client(**args[0]**); 
} 
+0

コマンドライン引数を渡さずに自動的に実行する必要があります。どうやってするか ? –

+0

どこを変更する必要がありますか?詳細を教えてください。今日はこのプロジェクトのための私の提出です。エラーが発生しています –

0

あなたのコードを期待args[0]で保存されているクライアントポート、ように見えるmainメソッドへ渡された引数。したがって、メインメソッドに1つを提供する必要があります。ポートを設定する例= 12345:

java Server 12345 

あなたはより多くの引数を必要としたい場合は、(例えばargs[1]での値)のメイン起動する際、単に別の引数を追加します。あなたがある場合

java Server 12345 secondArg 
+0

どこを変更する必要がありますか?あなたは正確に指摘できますか?あなたは全体の行を書くことができますか? –

+0

私はすでにこの行を書きました。アプリケーションを起動するときには、引数を指定する必要があります。私の例では、あなたがコマンドラインから実行していると仮定していました。もしあなたがEclipseのようなIDEからやっているのであれば、Javaのプログラム引数を設定するGUIのどこを見つけなければならないでしょうか。もしそれがmainメソッドを呼び出す他のコードであれば、呼び出し側が 'new Server(new String [] {12345});' – Keith

+0

のように引数を指定する必要があることをはっきりと明かす必要があります。手動で何も入力せずにポート番号を入力します。それを変えて何をする必要がありますか? –

0

同じマシン上のサーバとクライアントの両方を実行している、あなたは、コマンドライン引数

Javaクライアントはlocalhost

として localhostのを渡すことができます

また、あなたができるハードコードホスト値(注:これはしかし良い習慣ではありません)、

public static void main(String args[]) throws IOException { 
    new Client("localhost"); 
} 

また提案として、あなたはステップであなたのコードのステップをデバッグするためにEclipseやIntelliJのようにIDEを使用することができます。あなたは、Javaのオンラインビデオチュートリアルを通過することができます多くのyoutube

関連する問題