ログインしてさらにmixiを楽しもう

コメントを投稿して情報交換!
更新通知を受け取って、最新情報をゲット!

Java質問&情報提供サイトコミュのスレッドを用いて、複数のクライアントから接続

  • mixiチェック
  • このエントリーをはてなブックマークに追加
はじめまして。
どうにも行き詰ってしまったので、
どうぞお知恵をお貸し下さい。

スレッドを用いて複数のクライアントから接続が可能なようにプログラムを拡張しているのですが、
以下のようなコンパイルエラーが出てしまって困っています;


コンパイルエラー内容↓

Server.java:43: 内部クラスが static 宣言を持つことはできません。
public static void main(String[] args) {
^
エラー 1 個


そして以下がプログラム内容です。↓

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

class ServerThread extends Thread {
protected Socket socket;

public ServerThread(Socket s) {
socket = s;
}

public void run() {
try {
System.out.println("Waiting for connection...");

InputStreamReader isr = new InputStreamReader(socket.getInputStream()) ;
BufferedReader in = new BufferedReader(isr) ;
PrintWriter out = new PrintWriter(socket.getOutputStream(), true) ;

while(true) {
String str = in.readLine() ;
System.out.println(str) ;
if(str != null) {
if(str.equals("QUIT")) {
out.println("Bye");
break ;
}
out.println(str.toUpperCase());

}
}

socket.close();

} catch (UnknownHostException e) {
System.err.println("Can't find Host!") ;
} catch (IOException e) {
System.err.println("Error ocurred!") ;
}
}

public class Server{
public static void main(String[] args) {
try{
int a = Integer.parseInt(args[0]);
ServerSocket server = new ServerSocket(a);

Socket incoming = server.accept() ;
InetAddress addr = incoming.getInetAddress();

//クライアントのホスト情報表示
System.out.println("Addr:" + InetAddress.getLocalHost());
System.out.println("アドレス:" + addr.getHostAddress());
System.out.println("ホスト名:" + addr.getHostName());

incoming = null;

while(true) {
try {
ServerThread s = new ServerThread(incoming);
s.start();
} catch (IOException e) {
System.err.println(e);
}
}
incoming.close() ;

} catch (IOException e) {
System.err.println(e);
}
}
}
}

また他にこうした方が良いというアドバイスがありましたら
是非お願いします。

コメント(11)

mainをServerThreadに定義してください。
えーっと、単純に"{"と"}"の対応関係がおかしくありませんか?
最後の}が一個余分でpublic class Serverの前に}が一つ足りません。

蛇足ですが、普通public classを一番上に書くと思うんですけど。
chunさん、創基さん>コメント有難うございます。

創基さんの言うとおり、{}の対応関係が変だったようです。
お世話がせしました。(汗)


しかし、今度は以下のようなエラーが出てしまいました;
もし宜しければ引き続きご教授お願いします。

エラー内容↓

Server.java:62: 例外 java.io.IOException は対応する try 文の本体ではスローされま
せん。
} catch (IOException e) {
^
Server.java:66: この文に制御が移ることはありません。
server.close() ;
^
エラー 2 個


また、
創基さん>
>普通public classを一番上に書く
というアドバイス有難うございます。そうですね、そっちのほうが見やすいですしね。早速書き直したいと思います。
失礼ですがtry catch finallyの使い方が分かりきってないように思えます。
こちらのスレッドも目を通してはどうでしょう。
http://mixi.jp/view_bbs.pl?id=12751379&comm_id=368966
close()はfinallyで呼び出した方が良いですよ。
しゃもさん>
丁寧な解説有難うございます!
おかげでコンパイルできました。


・・・ですが、何故か以下のように実行結果が出てしまいました。見たところ無限ループになっているようなのですが、どう直せばよいのかよく分かりません(汗)

恐らくこれが最後の質問だと思いますので、どうぞ宜しくお願いします。

以下が実行結果です↓
java.lang.NullPointerException
at ServerThread.run(Server.java:16)
Waiting for connection...
java.lang.NullPointerException
at ServerThread.run(Server.java:16)
以下Ctrl+Cしない限り同文が続きます。
6:創基さん>参考URL有難うございます。そしてわざわざすみません;
>try catch finallyの使い方が分かりきってないように思えます。
はい、実はそうなのです;特にfinallyに関してはcatchが通らずとも通る文を書くとしか認識があまりありません;
創基さんが教えてくれたURLでちょっと勉強しなおしてみます。
アドバイス有難うございます。
プログラムの追跡は出来てますか?

incoming = null;
をした後、
ServerThread s = new ServerThread(incoming);
ServerThreadにはnullが渡されています。
socket = s;
ではsocketにnullが入ります。
InputStreamReader isr = new InputStreamReader(socket.getInputStream()) ;
では、null相手にメソッドを呼び出すので、NullPointerExceptionが発生します。

ちゃんとSocketを渡しましょうよ。
10:創基さん>
>プログラムの追跡は出来てますか?
すみません、出来ていなかったようです;;;

えっと・・・それでは、incoming = null;を消せば、
Socketの内容が入ることになるんですよね?;;;

ログインすると、みんなのコメントがもっと見れるよ

mixiユーザー
ログインしてコメントしよう!

Java質問&情報提供サイト 更新情報

Java質問&情報提供サイトのメンバーはこんなコミュニティにも参加しています

星印の数は、共通して参加しているメンバーが多いほど増えます。

人気コミュニティランキング