はじめまして。
プログラミング初心者です。。
ソケットを使用した
簡単なチャットシステムを作ろうとしたのですが
どうしてもエラーが出てしまいます。。。
サーバ側のプログラムを実行して
その後、
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のエラーが出てしまいます。。。
どうやったら解決できるのでしょうか。。。
A 回答 (2件)
- 最新から表示
- 回答順に表示
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は、たいへんけっこうです。
No.1
- 回答日時:
> 別途作成してあるチャットログファイルをサーバ側で読み込みクライアント側に渡す。
ソースコードからは、チャットログファイルをクライアント側で読み込んでいる様に見えますよ。
> java,io,EOFExceptionのエラーが出てしまいます。。。
手元の環境で実行出来ないので、確かではありませんが、ファイルの扱いが間違っていると思われます。
ファイルを読み込み用ストリームとしてopenしている処理は、見当たりますが、
ファイルをcloseしている処理が見当たりません。
ファイルは使い終わったらcloseしましょう。
後、ソケットもcloseしている処理が見当たりません。
ソケットも同様に使い終わったらcloseしましょう。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# C# DatagridviewにExcelシートを反映するとエラーが出る 2 2023/05/06 17:12
- Ruby 【JAVA】数字をひし形に出力するプログラムについて 2 2022/07/11 23:32
- C言語・C++・C# C# で、あるフォルダー内にあるすべてのテキストファイルを別のフォルダーにコピーする。 4 2022/11/21 13:23
- Java java 入力 3 4 3 出力 ABC DEFG HIJ このようなプログラムの書き方を教えてくだ 2 2022/07/15 14:18
- Excel(エクセル) PHPプログラムをエクセルに張り付けると検索ボックスがでてくる! 3 2022/05/08 07:10
- C言語・C++・C# C#テキストボックスの文字を配列にいれてその後表示する 4 2022/07/17 04:47
- Java javaでのプログラム(配列)について質問です. 2 2022/10/14 22:27
- Ruby vscode 文字化け 1 2022/05/21 19:17
- Java java final 1 2022/06/10 22:49
- オープンソース Try Kotlinで readLine()を使うには 1 2023/03/27 21:06
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
yyyymmddからyyyy/mm/d...
-
csv出力について
-
テキストファイルから空白行をよむ
-
Servletでテキストボックスに入...
-
equalsの逆
-
C言語のポインターに関する警告
-
ループ処理の際、最後だけ","を...
-
パソコンキーボードで時分秒を...
-
BOOL値を逆にしたい
-
ダブルクォーテーションのrepla...
-
<s:iterator>の値をリストで取...
-
C# 半角カナの文字化けについて
-
JSPやサーブレットでSystem.out...
-
ボタンのイベントで異なるウィ...
-
「例外 *** は対応する try 文...
-
Eclipseのコンソールを常に表示...
-
ORA-01858: 数値を指定する箇所...
-
[JAVA]try 内の変数を外で!?
-
Delphiで改行文字の置換がうま...
-
StrutsでJSPからListを受け取り...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
yyyymmddからyyyy/mm/d...
-
equalsの逆
-
InputStream.read()でタイムア...
-
Java int sum = 0は必要ですか?
-
テキストファイルから空白行をよむ
-
csv出力について
-
[JAVA]エラーが解決できません。
-
Servletでテキストボックスに入...
-
Javaの質問です。テキストファ...
-
Javaでデータに登録する度にID...
-
ソケットを使ったサーバとクラ...
-
javaのfor文が機能してないみた...
-
java連結
-
ObjectInputStreamとStreamCorr...
-
テキストファイルにおいて任意...
-
Class.forNameでエラーになる
-
九九を横に表示する。
-
Javaの質問です。テキストファ...
-
javaでCSVの中身から最大値を表...
-
BufferedReaderでのエラー
おすすめ情報