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

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

新規登録して質問してみよう
ただいま回答率
85.50%
Java

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

TCP

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

Eclipse

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

Q&A

解決済

3回答

2923閲覧

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

straycat

総合スコア11

Java

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

TCP

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

Eclipse

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

0グッド

0クリップ

投稿2015/05/18 04:27

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

lang

1TCPClient.java; 2 3import java.io.DataInputStream; 4import java.io.DataOutputStream; 5import java.io.EOFException; 6import java.io.IOException; 7import java.net.Socket; 8import java.net.UnknownHostException; 9 10public class TCPClient { 11 public static void main (String args[]) { 12 // arguments supply message and hostname 13 Socket s = null; 14 try{ 15 int serverPort = 7896; 16 s = new Socket(args[1], serverPort); 17 DataInputStream in = new DataInputStream( s.getInputStream()); 18 DataOutputStream out =new DataOutputStream( s.getOutputStream()); 19 out.writeUTF(args[0]); // UTF is a string encoding see Sn. 4.4 20 String time = in.readUTF(); // read a line of data from the stream 21 System.out.println("Received: "+ time) ; 22 }catch (UnknownHostException e){System.out.println("Socket:"+e.getMessage()); 23 }catch (EOFException e){System.out.println("EOF:"+e.getMessage()); 24 }catch (IOException e){System.out.println("readline:"+e.getMessage()); 25 }finally {if(s!=null) try {s.close();}catch (IOException e){System.out.println("close:"+e.getMessage());}} 26 } 27} 28 29コード

lang

1TCPserver.java; 2 3import java.io.DataInputStream; 4import java.io.DataOutputStream; 5import java.io.EOFException; 6import java.io.IOException; 7import java.net.ServerSocket; 8import java.net.Socket; 9import java.util.Calendar; 10import java.util.TimeZone; 11 12public class TCPServer { 13 public static void main (String args[]) { 14 try{ 15 int serverPort = 7896; // the server port 16 ServerSocket listenSocket = new ServerSocket(serverPort); 17 while(true) { 18 Socket clientSocket = listenSocket.accept(); 19 Connection c = new Connection(clientSocket); 20 } 21 } catch(IOException e) {System.out.println("Listen socket:"+e.getMessage());} 22 } 23} 24class Connection extends Thread { 25 DataInputStream in; 26 DataOutputStream out; 27 Socket clientSocket; 28 public Connection (Socket aClientSocket) { 29 try { 30 clientSocket = aClientSocket; 31 in = new DataInputStream( clientSocket.getInputStream()); 32 out =new DataOutputStream( clientSocket.getOutputStream()); 33 this.start(); 34 } catch(IOException e) {System.out.println("Connection:"+e.getMessage());} 35 } 36 public void run(){ 37 try { // an echo server 38 Calendar cal = Calendar.getInstance(); // カレンダー型で時刻を取得 39 String data = in.readUTF(); // read a line of data from the stream 40 41 String time; // int 型から String 型へ変換 42 int h = cal.get(Calendar.HOUR_OF_DAY); // 24時間単位で時間を取得 43 int m = cal.get(Calendar.MINUTE); // 分を取得 44 int s = cal.get(Calendar.SECOND); // 秒を取得 45 String hour = String.valueOf(h); 46 String minute = String.valueOf(m); 47 String second = String.valueOf(s); 48 49 // 第1引数に入れた国のタイムゾーンの情報を取得 50 TimeZone tz = TimeZone.getTimeZone(data); 51 52 cal = Calendar.getInstance(tz); 53 h = cal.get(Calendar.HOUR_OF_DAY); 54 m = cal.get(Calendar.MINUTE); 55 s = cal.get(Calendar.SECOND); 56 hour = String.valueOf(h); 57 minute = String.valueOf(m); 58 second = String.valueOf(s); 59 // 取得した時刻を time に入れる 60 time = tz.getDisplayName() + "の時刻は" + hour + "時" + minute + "分" + second + "秒"; 61 62 out.writeUTF(time); 63 64 }catch (EOFException e){System.out.println("EOF:"+e.getMessage()); 65 } catch(IOException e) {System.out.println("readline:"+e.getMessage()); 66 } finally{ try {clientSocket.close();}catch (IOException e){/*close failed*/}} 67 68 69 } 70} 71 72コード

このプログラムで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
となります。

完全に手詰まり状態なのでどうかお願いします。

気になる質問をクリップする

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

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 07:19

kaputaros

総合スコア1844

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

kaputaros

2015/05/18 07:20

あ、解決したんですね。
straycat

2015/05/18 07:25

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

2015/05/18 07:34

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

2015/05/18 08:01

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

0

ベストアンサー

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

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

投稿2015/05/18 05:11

argius

総合スコア9388

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

straycat

2015/05/18 05:44

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

2015/05/18 05:53

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

2015/05/18 06:07

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

2015/05/18 06:10

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

2015/05/18 06:17

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

2015/05/18 06:38

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

2015/05/18 07:01

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

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したインスタンスをつかみっぱなしになっているのかも?
サーバーを再起動してみると良いかもしれません。

投稿2015/05/18 05:08

編集2015/05/18 05:20
kaputaros

総合スコア1844

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問