質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.61%

  • Java

    13508questions

    Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

  • Eclipse

    1640questions

    Eclipseは、IBM社で開発された統合開発環境のひとつです。2001年11月にオープンソース化されました。 たくさんのプラグインがあり自由に機能を追加をすることができるため、開発ツールにおける共通プラットフォームとして位置づけられています。 Eclipse自体は、Javaで実装されています。

  • TCP

    160questions

    TCP(Transmission Control Protocol)とは、トランスポート層のプロトコルで、コネクション型のデータサービスです。

クライアント/サーバプログラムの修正について

解決済

回答 3

投稿

  • 評価
  • クリップ 0
  • VIEW 990

straycat

score 6

現在eclipseのJavaを使ってクライアント/サーバプログラムの修正・追加プログラムとしてクライアント側から国名を入力するとサーバ側からその国の時刻が出力されるようにしたいのですがエラーが起こります。自分では、解決できないので協力お願いします。ちなみにTCPを使ってます。

TCPClient.java;

import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.EOFException;
import java.io.IOException;
import java.net.Socket;
import java.net.UnknownHostException;

public class TCPClient {
    public static void main (String args[]) {
        // arguments supply message and hostname
        Socket s = null;
        try{
            int serverPort = 7896;
            s = new Socket(args[1], serverPort);
            DataInputStream in = new DataInputStream( s.getInputStream());
            DataOutputStream out =new DataOutputStream( s.getOutputStream());
            out.writeUTF(args[0]);          // UTF is a string encoding see Sn. 4.4
            String time = in.readUTF();        // read a line of data from the stream
            System.out.println("Received: "+ time) ;
        }catch (UnknownHostException e){System.out.println("Socket:"+e.getMessage());
        }catch (EOFException e){System.out.println("EOF:"+e.getMessage());
        }catch (IOException e){System.out.println("readline:"+e.getMessage());
        }finally {if(s!=null) try {s.close();}catch (IOException e){System.out.println("close:"+e.getMessage());}}
     }
}

コード

TCPserver.java;

import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.EOFException;
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Calendar;
import java.util.TimeZone;

public class TCPServer {
    public static void main (String args[]) {
        try{
            int serverPort = 7896; // the server port
            ServerSocket listenSocket = new ServerSocket(serverPort);
            while(true) {
                Socket clientSocket = listenSocket.accept();
                Connection c = new Connection(clientSocket);
            }
        } catch(IOException e) {System.out.println("Listen socket:"+e.getMessage());}
    }
}
class Connection extends Thread {
    DataInputStream in;
    DataOutputStream out;
    Socket clientSocket;
    public Connection (Socket aClientSocket) {
        try {
            clientSocket = aClientSocket;
            in = new DataInputStream( clientSocket.getInputStream());
            out =new DataOutputStream( clientSocket.getOutputStream());
            this.start();
        } catch(IOException e) {System.out.println("Connection:"+e.getMessage());}
    }
    public void run(){
        try {                             // an echo server
            Calendar cal = Calendar.getInstance();        // カレンダー型で時刻を取得
            String data = in.readUTF();                      // read a line of data from the stream

            String time;                                // int 型から String 型へ変換
            int h = cal.get(Calendar.HOUR_OF_DAY);        // 24時間単位で時間を取得
            int m = cal.get(Calendar.MINUTE);            // 分を取得
            int s = cal.get(Calendar.SECOND);            // 秒を取得
            String hour = String.valueOf(h);
            String minute = String.valueOf(m);
            String second = String.valueOf(s);

            // 第1引数に入れた国のタイムゾーンの情報を取得
            TimeZone tz = TimeZone.getTimeZone(data);

            cal = Calendar.getInstance(tz);
            h = cal.get(Calendar.HOUR_OF_DAY);
            m = cal.get(Calendar.MINUTE);
            s = cal.get(Calendar.SECOND);
            hour = String.valueOf(h);
            minute = String.valueOf(m);
            second = String.valueOf(s);
            // 取得した時刻を time に入れる
            time = tz.getDisplayName() + "の時刻は" + hour + "時" + minute + "分" + second + "秒";

            out.writeUTF(time);

        }catch (EOFException e){System.out.println("EOF:"+e.getMessage());
        } catch(IOException e) {System.out.println("readline:"+e.getMessage());
        } finally{ try {clientSocket.close();}catch (IOException e){/*close failed*/}}


    }
}

コード

このプログラムでTCPCient.javaを実行すると、
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 1
    at TCPClient.java.TCPClient.main(TCPClient.java:16)
このような文が出るのですが、どう修正すればいいのか分かりません。

ちなみに、TCPServer.javaを実行すると、
Listen socket:Address already in use: JVM_Bind
となります。

完全に手詰まり状態なのでどうかお願いします。
  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 3

checkベストアンサー

0

new Socket(args[1], serverPort);args[1]は、TCPClientを実行するときの第2パラメーターを示しています。
Socketクラスのコンストラクターの第1引数はサーバーのホストアドレス(IPアドレスなど)を指定します。


ということで、コマンドラインからの実行時に第2パラメーターを指定する必要があるということです。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2015/05/18 14:44

    すいません。解答については一応理解できたのですが、結局どのように修正すると動くのかわかりません。お手数ですが、もう少し簡単に教えていただけるとありがたいです。

    また、初歩的ですが実行はeclipse内ではなくてcmdからですよね。

    キャンセル

  • 2015/05/18 14:53

    Eclipseからでも実行できますよ。その辺はご質問に書かれていないのでどうすればよいかはこちらでも判断ができません。
    どのように修正すると動くのかは、最後の文にかいてあるとおり、cmdなどからのコマンド実行時の第2パラメーターにサーバーのIPアドレスを指定すればArrayIndexOutOfBoundsは出なくなるはずです。

    キャンセル

  • 2015/05/18 15:07

    ではプログラム自体は何も変えなくてもよいということですか?

    キャンセル

  • 2015/05/18 15:10

    また新しい問題が発生する可能性はありますが、少なくともjava.lang.ArrayIndexOutOfBoundsException: 1 の問題はプログラムを変えなくても解消すると思います。

    キャンセル

  • 2015/05/18 15:17

    横やりすいません。

    eclipseで実行時の引数を渡すには、
    メニュー>実行構成
    で実行したいクラスを選択し、右側ペインの引数に入力します。
    複数渡すには、半角スペースで区切ります。
    「第一引数 第二引数」
    ちなみに、第一引数に何も指定がないのであれば、プログラムを
    args[1] ⇒ args[0]
    に変更してください。
    ※Javaのindexは、基本0から1番目が始まります。

    キャンセル

  • 2015/05/18 15:38

    kaputarosさんアドバイスありがとうございます。
    一応自分の考えでは第1引数に国名を入れて、「java TCPClient 国名 サーバのIPアドレス」というような感じと思っているのですがなにか間違っていたりするでしょうか。
    もしあれば教えていただきませんか。

    キャンセル

  • 2015/05/18 16:01

    解決しました。
    色々とアドバイスありがとうございました。

    キャンセル

0

Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 1 
    at TCPClient.java.TCPClient.main(TCPClient.java:16) 
このような文が出るのですが、どう修正すればいいのか分かりません。 

「java.lang.ArrayIndexOutOfBoundsException」
このExceptionは何を表すかは調べましたか?
知らない場合は、まず何を表しているかを調べてみてください。
とても初歩的でよく起こりがちな例外です。

「(TCPClient.java:16)」
TCPClient.java の 16行目でExceptionが発生していると教えてくれています。
この行を見て、なぜArrayIndexOutBoudsExceptionが発生しているかを考えてみてください。


まずは、聞くより調べましょう。


TCPClient.java の 16行目は
DataOutputStream out =new DataOutputStream( s.getOutputStream());
となっています。
s は14行目で new Socket() をしており、引数に args[1] と serverPort を渡しています。
args は mainメソッドを実行する際に、引数としてパラメタを渡したものが入ってくるようになっていますが、実行するときに、パラメタには何を渡していますか?
また、index(argsの[]内) が 1 になっていますが、2つ以上パラメタを渡していますか?

きちんと指定してあげないと、RuntimeException(実行時例外) が発生してしまいます。



ちなみに、TCPServer.javaを実行すると
Listen socket:Address already in use: JVM_Bind 
となります。 

TCPClint.javaとポート番号が同じために起こっているのだと思います。
http://ziddy.japan.zdnet.com/qa4156701.html

実行時例外が発生して、ポート番号7896でnewしたインスタンスをつかみっぱなしになっているのかも?
サーバーを再起動してみると良いかもしれません。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

0

こちらにコメント移動します。

実行構成>(x)=引数タブ>プログラムの引数
に「国名 サーバのIPアドレス」
と指定しているのであれば、IndexOutOfBoundsExceptionは発生しないと思います。
もしかしてなのですが、区切っているスペースが全角とかになっていませんか?
全角スペースだと区切り文字として認識されず、IPアドレスまでが1つの引数と認識されているんではないかと。


また、ソースで指定している引数の型をみると、
public Socket(String host, int port)
(Java(tm) Platform Standard Edition 8 > クラスSocket)
こちらのコンストラクタを使用しているのだと思いますが、
straycatさんの考えでは、この引数hostがIPアドレスを想定しているのですね?

このコンストラクタが求めているのはホスト名であってIPアドレスではないです。
指定されたホスト名からIPアドレスを決定しようとしています。
なので、引数に指定するのであれば、
「国名 ホスト名」にすればよいと思います。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2015/05/18 16:20

    あ、解決したんですね。

    キャンセル

  • 2015/05/18 16:25

    ありがとうございます。
    IndexOutOfBoundsExceptionの方はcmdで実行ではなくeclipse内に実行をしていたからだと思います。
    IPアドレスの方は自分の勘違いですね。確かにホスト名でした。

    キャンセル

  • 2015/05/18 16:34

    解決してよかったです。

    eclipse でも cmd で実行するときと同じことができるんですよ。
    メニュー> 実行 >実行構成 で見てみてくださいね。

    キャンセル

  • 2015/05/18 17:01

    それもできたんですが、cmdのほうが文字化けして文字コードをMS932にしたら直ったのですが、今度はコードのコメントが文字化けしてしまったので結局辞めました。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 90.61%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

  • 解決済

    Javaにおけるfinally

    import java.io.FileWriter; import java.io.IOException; public class n1{     public static

  • 受付中

    [java][日付チェック]質問

    java初心者です。 テキストファイルを一行づつ読み込んで行く時に、 32日や14月など、異常な日付が紛れていた場合例外として処理する方法はありますでしょうか? while ((

  • 解決済

    java 日付の取得と変更について

    javaの日付の取得と変更に関するコードについて質問です 参考書のとおりに、下記のコードを書いて実行してみたのですが 実行してみても、現在の日付から5日後の日付が出力されず、現在

  • 解決済

    javaの入出力について

    年、月、日を順番に入力して、 yyyy年m月d日(曜日)のように、 出力させたいです。 下に日付までの結果を表示させるだけの プログラムを作成しました。 そこで2つ教えていただき

  • 解決済

    JAVAでの正規表現

    JAVAで入力された文字列がyyyy/mm/ddの日付形式になっているかどうかチェックをしたいのですが、 どうすればよいのでしょうか。

  • 受付中

    javaである期間の経過年月日時分秒を算出したい

    下記のようなStringで与えられる年月日時分秒 "2014/12/20 23:45:23"と 現在の時刻を比較し、 与えられた時刻から現在までyy年mmか月dd日 hh時間

  • 受付中

    JAVA dateの複数のデータの時刻だけを加算するには

    date型で 複数の日時と時刻が含まれるデータがあります、これをjavaで全部足して合計時間を出すにはどうすればいいでしょうか。 例えば 2016-2-25 06:30:10

  • 解決済

    SimpleDateFormatで日時形式判定

    実現したいこと Javaの初心者です。 ログ解析用のツールを作成しているのですが、 標準入力から入力された日時が以下のいづれかの形式でなければエラーとなり、もう一度標準入力を

同じタグがついた質問を見る

  • Java

    13508questions

    Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

  • Eclipse

    1640questions

    Eclipseは、IBM社で開発された統合開発環境のひとつです。2001年11月にオープンソース化されました。 たくさんのプラグインがあり自由に機能を追加をすることができるため、開発ツールにおける共通プラットフォームとして位置づけられています。 Eclipse自体は、Javaで実装されています。

  • TCP

    160questions

    TCP(Transmission Control Protocol)とは、トランスポート層のプロトコルで、コネクション型のデータサービスです。