• 締切済み

ソケットを使ったサーバとクライアントのプログラムについて

はじめまして。 プログラミング初心者です。。 ソケットを使用した 簡単なチャットシステムを作ろうとしたのですが どうしてもエラーが出てしまいます。。。 サーバ側のプログラムを実行して その後、 public class ChatClient { public static void main(String args[]){ BufferedReader br; BufferedWriter inw; String logFileName = "chat.log"; Socket s = null ; InputStream sin; DataInputStream dis; OutputStream sout; DataOutputStream dos; String str ; String str1= ("append,"); String str2; try{ s = new Socket("localhost",5432); }catch(IOException e){ } try{ sin = s.getInputStream(); dis = new DataInputStream(sin); sout = s.getOutputStream(); dos = new DataOutputStream(sout); br = new BufferedReader(new FileReader(logFileName)); String line; while((line = br.readLine()) != null){ System.out.println(line ); } BufferedReader in = new BufferedReader(new InputStreamReader(System.in)); while((str=in.readLine())!= null){ if (str.equals("")){ br = new BufferedReader(new FileReader(logFileName)); String line1; while((line1 = br.readLine()) != null){ System.out.println(line1); } }else{ dos.writeUTF(str1+str); dos.flush(); str2 = dis.readUTF(); System.out.println(str2); } } }catch (IOException e){ System.out.println("Error: reading file:"); System.out.println(e); e.printStackTrace(); System.exit(1); } } } としてクライアント側のプログラムを実行します。 ・標準入力から入力を読み込み"ハンドルネーム「,」メッセージ"の形式で「,」で区切って入力する。 そして何も入力せずに"Enter"だけを入力された場合には、チャットログの更新要求と判断して、別途作成してあるチャットログファイルをサーバ側で読み込みクライアント側に渡す。 という感じで作っているのですが 一回目は上手くいくんです。 二回目、同じようにハンドルネーム「,」メッセージを「,」で 区切って入力してエンターを押すと java,io,EOFExceptionのエラーが出てしまいます。。。 どうやったら解決できるのでしょうか。。。

みんなの回答

  • _ranco_
  • ベストアンサー率58% (126/214)
回答No.2

(1)空のcatch節は絶対に書かないこと。エラー判断の手がかりがなくなる。 (2)System.inから作ったBufferedReaderは入力のnullチェックができないので、別の方法でループを終わらせてください。 (3)brをループの中と外で二回使い回ししていることと、ループの中では毎回newしているのは、どちらもおかしいです。なにをしたいのか、はっきりさせないと、正しいアドバイスはできませんが。 (4)サーバがどうやってクライアント側のファイルchat,logに書き込んでいるのか、そのあたりが不明。 (5)I/Oは一般的に、そしてとくにネットワークI/Oは必ず while (!終了条件){  in.readはここに書く!  try{   ...  }  catch ( .... ){   ...  } } の形にしてください。 (6)クライアント側におけるjava,io,EOFExceptionは、サーバのコード(とくに出力部)が正しく書けてないか、またはクライアントがサーバの振る舞いに合わせた書かれ方をしていないことが、ほとんどの場合、原因です。 (7)毎回の出力flushは、たいへんけっこうです。

  • Yanch
  • ベストアンサー率50% (114/225)
回答No.1

> 別途作成してあるチャットログファイルをサーバ側で読み込みクライアント側に渡す。 ソースコードからは、チャットログファイルをクライアント側で読み込んでいる様に見えますよ。 > java,io,EOFExceptionのエラーが出てしまいます。。。 手元の環境で実行出来ないので、確かではありませんが、ファイルの扱いが間違っていると思われます。 ファイルを読み込み用ストリームとしてopenしている処理は、見当たりますが、 ファイルをcloseしている処理が見当たりません。 ファイルは使い終わったらcloseしましょう。 後、ソケットもcloseしている処理が見当たりません。 ソケットも同様に使い終わったらcloseしましょう。

関連するQ&A