- PR -

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

投稿者投稿内容
未記入
常連さん
会議室デビュー日: 2004/08/21
投稿数: 41
投稿日時: 2004-10-04 07:47
Kissingerさん遅くまでテストをしていただいていたなんて本当に感激しております。ありがとうございました。
私の方でもIE、エアーエッジの設定を確認しポート2100、flush()をつけてテストを行いましたが結果は変わらず途中で通信が切れてしまいます。また、アプリケーションにしてもだめでした。(泣
環境はXPSP2、J2SE1.4.1.03です。
差し支えなければKissingerの通信成功したプログラムを参考にさせていただけないでしょうか。


[ メッセージ編集済み 編集者: matsu_on 編集日時 2004-10-04 14:16 ]
Kissinger
ぬし
会議室デビュー日: 2002/04/30
投稿数: 428
お住まい・勤務地: 愛知県
投稿日時: 2004-10-04 13:09
送るのはOKです。

ただし今、出先からのため、夜遅くなると思います。
Kissinger
ぬし
会議室デビュー日: 2002/04/30
投稿数: 428
お住まい・勤務地: 愛知県
投稿日時: 2004-10-05 01:11
matsu_on様、

お約束いたしました、クライアントとサーバのソースです。

ソース使用時の注意:
クライアント側のコードには接続先のホスト名
が書かれていますから、適宜、変更してください。

※それと、サーバ側はパッケージ指定ありますので
ディレクトリ階層に注意するか、パッケージ指定を
外すか都合の好い方にしてください。


matsu_on様が最初に示されたコードをできるだけそのまま使用しています。

matsu_on様の 4日 7時47分の書きこみによれば、
「環境はXPSP2」とのことですから、ファイアウォールの設定
が心配です。(この点は私は詳しくありません)

また、「IE、エアーエッジの設定を確認し…」とありますが、
プログラムのロジックを確認するまでは、1台のPCでサーバ
とクライアントを走らせてテストしたほうが、問題がプログラム
なのかネットなのかの切り分けがし安いと思います。

なお、これが将来のデータ通信を前提としたものでしたら、
DataOutputStream/DataInputStreamの代わりに次のいづれかの
使用を検討してはいかがでしょうか?

1.ObjectOutputStream/ObjectInputStream データをオブジェクトにする場合
2.OutputStream/InputStream バイトデータの場合
3.PrintWriter/BurreredReader 文字列データの場合

2, 3のどちらかを使用して、XMLデータを扱うこともできます。

もう、とっくに検討済みかも知れませんが。

Client side
コード:
import java.io.DataOutputStream;
import java.net.Socket;
/*
 * SocketClient.java
 *
 * Created on 2004/10/04, 0:16
 */

/**
 *
 * @author  kei moses kissinger
 */
public class SocketClient {
	public static void main(String[] args) {
		try {
		new SocketClient();
		
		} catch (Exception ex) {
			ex.printStackTrace();
		}
	}
	
	/** Creates a new instance of SocketClient */
	public SocketClient() throws Exception {
		java.util.Date date1_u = null;
		java.util.Date date2_u = null;
		long time_u = 0; // intを longにした
		int roop_unit = 1000000;//ループを行う回数
		int roop_count = 0;
		int portNo = 2100;//ポート番号
	//	String hostName = getCodeBase().getHost();//ホスト名
	//	String hostName = "localhost";
		String hostName = "192.168.1.128";
		
		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");
			out.writeUTF("1");
			roop_count++;
		}
		System.out.println(roop_count);
		date2_u = new java.util.Date();
		time_u = date2_u.getTime() - date1_u.getTime();//動作時間取得
	}
	
}




Server side
コード:
/*
 * Main.java
 *
 * Created on 2004/10/04, 0:11
 */

package matsuonserver;

import java.io.DataInputStream;
import java.net.ServerSocket;
import java.net.Socket;

/**
 *
 * @author  kei moses kissinger
 */
public class SocketServer {
	public static void main(String args[]) {
		int pNo = 2100;
		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();
				System.out.print(mozi);
			}
		}catch(Exception e){
			e.printStackTrace();
		//	System.out.println("Exception e "+e);
			if(fromClient != null){
				fromClient = null;
			}
			if(client != null){
				client = null;
			}
			if(server != null){
				server = null;
			}
		}
	}
}

未記入
常連さん
会議室デビュー日: 2004/08/21
投稿数: 41
投稿日時: 2004-10-07 14:06
Kissingerさん、ご教授ありがとうございました。
Kissingerさんのソースを参考にいろいろと試してみた結果、当方の環境ではポート80では30数秒でタイムアウト、そのほかの予約されていないポートではセキュリティーエラーになってしまうようです。
よってポート21を使用することにしました。FTPで当サーバーにID、PASSを使用してログインし、実際にファイルをUploadすることによりUploadの最中、途中で途切れることなく測定できるようになりました。
親身な対応とても感謝しております。
ありがとうございました。

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