
はじめまして。
プログラミング初心者です。。
ソケットを使用した
簡単なチャットシステムを作ろうとしたのですが
どうしてもエラーが出てしまいます。。。
サーバ側のプログラムを実行して
その後、
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で質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
yyyymmddからyyyy/mm/d...
-
Javaの質問です。テキストファ...
-
テキストファイルにおいて任意...
-
九九を横に表示する。
-
equalsの逆
-
Javaでデータに登録する度にID...
-
ソケットを使ったサーバとクラ...
-
オブジェクトの中のプロパティ...
-
JSPでDBからデータ読み込みブラ...
-
C言語のポインターに関する警告
-
ORA-01858: 数値を指定する箇所...
-
ループ処理の際、最後だけ","を...
-
System.err. printlnとSystem.o...
-
動的配列が存在(要素が有る)か...
-
javaで質問です。 文字列2023/2...
-
flush()とclose()について
-
1~100までの数字を表示したい
-
C# ListBoxのインデックスの値...
-
hiddenの値が期待した値で取得...
-
C#の質問
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
yyyymmddからyyyy/mm/d...
-
csv出力について
-
Javaでデータに登録する度にID...
-
[JAVA]エラーが解決できません。
-
Class.forNameでエラーになる
-
Java int sum = 0は必要ですか?
-
Javaの質問です。テキストファ...
-
javaプログラミングの質問です。
-
equalsの逆
-
ファイル読込みにおける改行表...
-
九九を横に表示する。
-
Servletでテキストボックスに入...
-
BufferedReaderでのエラー
-
Javaの質問です。テキストファ...
-
テキストファイルから空白行をよむ
-
文字列について(続き)
-
javaのfor文が機能してないみた...
-
Pleiades4.4でVectorの使用
-
printfを使って出力
-
ファイルの読み飛ばしが出来ま...
おすすめ情報