- PR -

DataOutputStreamのループ中に通信が切れてしまう

投稿者投稿内容
未記入
常連さん
会議室デビュー日: 2004/08/21
投稿数: 41
投稿日時: 2004-10-02 22:20
一定量のデータの出力を行い、その動作時間を取得するプログラムを作成しているのですが、whileループが回っている途中で通信が切れてしまいます。
writeBytes()のほかに、writeByte()、writeUTF()を使ってもだめでした。
なぜか分かりません。分かる方ご教授お願いします。

java.util.Date date1_u = null;
java.util.Date date2_u = null;
int time_u = 0;
int roop_unit = 1000000;//ループを行う回数
int roop_count = 0;
int portNo = 21;//ポート番号
String hostName = getCodeBase().getHost();//ホスト名

Socket server = new Socket(hostName,portNo);
DataOutputStream out = new DataOutputStream(server.getOutputStream());
date1_u = new java.util.Date();
while (roop_count < roop_unit) {
out.writeBytes("1");
roop_count++;
}
date2_u = new java.util.Date();
time_u = date2_u.getTime() - date1_u.getTime();//動作時間取得


[ メッセージ編集済み 編集者: matsu_on 編集日時 2004-10-02 23:26 ]
Kissinger
ぬし
会議室デビュー日: 2002/04/30
投稿数: 428
お住まい・勤務地: 愛知県
投稿日時: 2004-10-02 23:47
matsu_onさん、こんにちは。

『回っている途中で通信が切れ…』とありますが、
途中まではうまくいったということでしょうか?

クライアントのコードが示されていますが、サーバ側のプロ
グラムには問題ないことを確認されたからなのですね?
未記入
常連さん
会議室デビュー日: 2004/08/21
投稿数: 41
投稿日時: 2004-10-03 00:05
Kissingerさんご返答ありがとうございます。

while文のループカウントが少ない場合はループを抜けるのですが、タスクトレイのネットワーク接続を見ていると通信時間が長くなると途中で通信が終わってしまうようです。
一定量のデータの出力を行い、その動作時間を取得できればよいのでサーバー側のプログラムを作成していなかったのがいけなかったのでしょうか。(冷汗
taro
ぬし
会議室デビュー日: 2003/10/20
投稿数: 316
投稿日時: 2004-10-03 03:03
単にタイムアウトしているということではないでしょうか?
コードは以下のようにして例外をcatchしたらそれまでの動作時間は取れますよね。
コード:
while (roop_count < roop_unit) {
try{
 out.writeBytes("1"); 
}catch(IOException e){
 break;
}
roop_count++; 
}

connect(SocketAddress endpoint, int timeout)を使ってみるのはいかがでしょうか?
未記入
常連さん
会議室デビュー日: 2004/08/21
投稿数: 41
投稿日時: 2004-10-03 19:11
taroさんご返答ありがとうございました。

java.util.Date date1_u = null;
java.util.Date date2_u = null;
int time_u = 0;
int roop_unit = 1000000;//ループを行う回数
int roop_count = 0;

Socket server = new Socket();
InetSocketAddress address = new InetSocketAddress(InetAddress.getByName("ホスト名"), 21);
server.connect(address,0);//タイムアウト秒数0(無限)
DataOutputStream out = new DataOutputStream(server.getOutputStream());

date1_u = new java.util.Date();
while (roop_count < roop_unit) {
try{
out.writeBytes("1");
roop_count++;
}catch(Exception ex){System.out.println("Exception ex "+ex);}
}
date2_u = new java.util.Date();

time_u = date2_u.getTime() - date1_u.getTime();//動作時間取得

としてタイムアウト秒数を無限にしても以前と同様に途中で通信がきれ、一向にwhileループから出ません。
またExceptionも発生しませんでした。タスクトレイの接続アイコンを見ていると、クライアント側の通信が切れて、サーバー側に何か通信を送ってサーバー側が答えて通信が切れているような感じでした。またクライアント側の通信が切れるのはいつも決まった秒数後のようです。
Kissinger
ぬし
会議室デビュー日: 2002/04/30
投稿数: 428
お住まい・勤務地: 愛知県
投稿日時: 2004-10-03 20:46
繰り返しますが、サーバ側はどうなっているのでしょう?

一般に、TCPの 21番は、FTPに使用されると思うのですが。
相手次第では、ちゃんとしたシーケンスで通信しないと、
エラーになったり、タイムアウトになりますよ。
未記入
常連さん
会議室デビュー日: 2004/08/21
投稿数: 41
投稿日時: 2004-10-03 21:05
申し訳ありませんでした。
server側は、

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

public class SocketServer{
public static void main(String args[]) {
int pNo = 21;
ServerSocket server = null;
Socket client = null;
DataInputStream fromClient = null;
String mozi = null;
try {
server = new ServerSocket(pNo);
client = server.accept();
fromClient = new DataInputStream(client.getInputStream());

while(true){
mozi=fromClient.readUTF();
}
}catch(Exception e){
System.out.println("Exception e "+e);
if(fromClient != null){
fromClient = null;
}
if(client != null){
client = null;
}
if(server != null){
server = null;
}
}
}
}

上のようなjavaファイルを作成しテストをしてみました。Exceptionが発生したらDBに更新をかけるなどの処理を追加してみたのですがこのプログラムは処理を行っていないようです。clientがわで送信処理を行う前にインスタンスを生成してみたりしたのですがだめでした。
ご教授お願いします。
Kissinger
ぬし
会議室デビュー日: 2002/04/30
投稿数: 428
お住まい・勤務地: 愛知県
投稿日時: 2004-10-04 02:32
matsu_onさん、こんにちは。

プログラム上の気になる点や、異常に時間がかかる点を除いて、
サーバ、クライアント(最初の版)は一応、動作しています。

ただし、ポート番号を 2100とし、クライアント側もアプレット
ではなくアプリケーションにしました。

確認に使用した、Win98と Solaris 8/SPARC V9 の両方で OKの
ようです。(Solarisではまだ途中なので)
共に JDK 1.5.0 RC(まだ FCS入れてないもので…)

matsu_onさんの環境では、何かの設定上のタイムアウトとか、
変なサービスパック(失礼)とか当たってませんかね。


それにしても、100万件もの単純なデータを
DataInputStream/DataOutputStreamで送受信するのは、とんでも
なく時間か掛かりますね。 
ほんの少し工夫すれば、劇的に速くなると思いますよ。せめて、
出力時に flushするとか。

スキルアップ/キャリアアップ(JOB@IT)