質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Linux

Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。

Red Hat Enterprise

Red Hat Enterpriseは、レッドハット社により開発・サポートが行われている業務向けLinuxディストリビューションです。オープンソースで無償で利用することができ、バイナリ版の入手・サポートは有償です。商用ディストリビューションとして人気が高く、代表的なLinuxの選択肢の一つです。

Q&A

解決済

4回答

2993閲覧

RHELまたはJavaのバージョン違いによるFTPの接続について

dohq

総合スコア232

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Linux

Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。

Red Hat Enterprise

Red Hat Enterpriseは、レッドハット社により開発・サポートが行われている業務向けLinuxディストリビューションです。オープンソースで無償で利用することができ、バイナリ版の入手・サポートは有償です。商用ディストリビューションとして人気が高く、代表的なLinuxの選択肢の一つです。

0グッド

0クリップ

投稿2016/08/19 08:10

編集2016/08/19 08:11

プログラミングに関係ある所か微妙に怪しいところですが、
お付き合い頂けますと幸いです。

背景

現在、
Red Hat Enterprise Linux AS release 4 (Nahant Update 3)
から
Red Hat Enterprise Linux Server release 6.4 (Santiago)
へのシステムマイグレーション作業を行なっています。

その中に、Javaを使用したFTPファイル転送のモジュールがあるのですが、
これが旧環境だと問題無く動くのですが新環境だとエラーで失敗します。

変化があったのはREHLのバージョンと、Javaのバージョンです。
Javaのバージョンは1.4→1.8へと変化しました。

逆に言うと、変化があったのは上記2点だけのはずなのですが、
なぜ、ここで失敗しているのか分かりません。

Javaのモジュールは、FTPのコマンドそれぞれクラスで作成し、
それを実際動作を行うメインモジュールから呼び出しています。

といってもメインモジュールも複雑な事はしておらず、
ログイン→ディレクトリ移動→ファイルの存在確認→ファイルPUT
となっています。

環境

旧環境新環境
OSRed Hat Enterprise Linux AS release 4 (Nahant Update 3)Red Hat Enterprise Linux Server release 6.4 (Santiago)
Java1.41.8
接続先Windows2003Windows2003

問題

上記の流れの中の内、
ファイル存在確認(NLST発行)

ファイル送信(PUT発行)
の2箇所が上手く動いていないようです。

ファイルが存在する場合でもファイルの存在はないと認識され、
PUTに至っては、データが流しこまれていないようなのです。
(送信先に空ファイルは存在するので、データ送信のみ上手くいってない?)

背景に書いたような環境の変化によって、上記動作が上手くいかなくなるような事はあるのでしょうか…

当方Javaについてからっきしな為、どこが問題なのかも分かりません。
お手数ですが、御知恵を拝借できましたら幸いです。
以下に使用している、FTPコマンドのクラスを添付します。

何卒宜しくお願い致します。

ソース

java

1import java.io.*; 2import java.net.*; 3import java.util.*; 4 5/** 6 * FTP Clientクラス<BR> 7 *<BR> 8 * RFC959仕様のFTPコマンドを発行する<BR> 9 *<BR> 10 */ 11public class FtpClient 12{ 13 14 private Socket sock = null; 15 private PrintWriter log = new PrintWriter(System.out); 16 private boolean logflag; 17 18 19 /** 20 * FTPサーバにログインを行う。<BR><BR> 21 * @param String server サーバホスト名(IPアドレス等) 22 * @param int Port ポート番号(大抵は21です) 23 * @param String user ユーザー名 24 * @param String pass パスワード 25 * @throws Exception エラーが発生した場合にスローされる。 26 */ 27 public FtpClient(String server, int Port, String user, String pass) throws Exception 28 { 29 logflag = true; 30 this.login( server, Port, user, pass ); 31 logflag = false; 32 } 33 34 35 /** 36 * FTPサーバからリプライコードを取得。<BR> 37 * <BR> 38 * <BR> 39 * @param String strPass エンコードしたいパスワード 40 * @return int リプライコード 41 * @throws java.io.IOException 入出力エラーが発生した場合にスローされる。 42 */ 43 private int getReplyCode() throws IOException 44 { 45 //↓ソケット通信の時、getInputStreamは上等手段っぽい 46 // そのオブジェクトをBufferedReaderでやるかObjectInputStreamでやるかは作り手次第 47 BufferedReader reader = new BufferedReader(new InputStreamReader(sock.getInputStream())); 48 String buffer; 49 50// buffer = reader.readLine(); 51// this.log(buffer); 52// return Integer.parseInt(buffer.substring(0,3)); 53 54 do 55 { 56 buffer=reader.readLine(); 57 this.log(buffer); 58 } while(buffer.charAt(3) == '-'); 59 return Integer.parseInt(buffer.substring(0,3)); 60 } 61 62 /** 63 * FTPサーバにコマンドを送信する。<BR> 64 * <BR> 65 * @param String command FTPコマンド 66 * @throws java.io.IOException 入出力エラーが発生した場合にスローされる。 67 */ 68 private void sendCommand(String command) throws IOException 69 { 70 BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(sock.getOutputStream())); 71 writer.write(command); 72 writer.newLine(); //行区切文字を送る。\nとは限らないのでこれを使う。 73 writer.flush(); 74 this.log(">"+command); 75 } 76 77 /** 78 * FTPサーバにログイン認証を行う。<BR> 79 * 通常、インスタンス生成時に呼ばれる。<BR> 80 * <BR> 81 * @param String server サーバホスト名(IPアドレス等) 82 * @param int Port ポート番号(大抵は21です) 83 * @param String user ユーザー名 84 * @param String pass パスワード 85 * @throws Exception エラーが発生した場合にスローされる。 86 */ 87 public void login(String server, int port, String user, String pass) throws Exception 88 { 89 sock = new Socket(server, port); 90 sock.setSoTimeout(100000); 91 92 93 // 接続チェック 94 if(getReplyCode() != 220) 95 { 96 throw( new Exception("接続失敗") ); 97 } 98 99 sendCommand("USER " + user); 100 if(getReplyCode() != 230) 101 { 102 //パスワードも必要 103 sendCommand("PASS " + pass); 104 if(getReplyCode() != 230) 105 { 106 throw( new Exception("IDまたはパスワードが違います")); 107 } 108 } 109 } 110 111 /** 112 * サーバソケットを作成する。<BR> 113 * <BR> 114 * @throws Exception エラーが発生した場合にスローされる。 115 */ 116 private ServerSocket port() throws Exception 117 { 118 String command = "PORT"; 119 120 //サーバソケットを作成し、指定されたバックログで指定された 121 //ローカルポート番号にバインドします。 122 //ポート番号に 0 を指定すると、空いているポート上にソケットが作成されます。 123 //受信する接続 (接続要求) の待ち行列の最大長は、 124 //backlog パラメータの値に設定されます。 125 ServerSocket mySocket = new ServerSocket(0,1); 126 127 //ポートは4桁の数字が入る?(1254とか1255とか…) 128 int iPort = mySocket.getLocalPort(); 129 130 // 自マシンのIPアドレス取得 131 String ip = sock.getLocalAddress().getHostAddress(); 132 133 //ここら辺は他人のソースのパクリ 134 command = command + " " + ip.replace('.',','); 135 command = command + "," + (iPort >> 8) + "," + (iPort & 0xFF); 136 137 sendCommand( command ); 138 if( getReplyCode() != 200) 139 { 140 throw( new Exception(command + "は失敗しました") ); 141 } 142 return mySocket; 143 } 144 145 /** 146 * NLSTにコマンドを付記して発行する。<BR> 147 * <BR> 148 * @param String command コマンド 149 * @return String[] 取得したファイル情報 150 * @throws Exception エラーが発生した場合にスローされる。 151 */ 152 public String[] nlst(String command) throws Exception 153 { 154 if (command.length() == 0) return listSub("NLST"); 155 return listSub("NLST " + command); 156 } 157 158 159 /** 160 * LISTまたはNLSTコマンドを実行してサーバから情報取得し<BR> 161 * 文字配列型で返す。<BR> 162 * <BR> 163 * @param String command コマンド 164 * @return String[] 取得したファイル情報 165 * @throws Exception エラーが発生した場合にスローされる。 166 */ 167 private String[] listSub(String command) throws Exception 168 { 169 String resp[] = null; 170 Vector v = new Vector(); //JDK1.5対策 171 172 BufferedReader readData=null; 173 ServerSocket myDataSocket = port(); 174 175 // 2002.12.06追加 176 myDataSocket.setSoTimeout(5000); 177 178 sendCommand(command); 179 180 if(getReplyCode() != 150) 181 { 182 throw( new Exception(command+"は失敗しました") ); 183 } 184 185 186 Socket socRead = myDataSocket.accept(); 187 188// ↓e*Gateから呼び出すとウィンドウ変えたりしてると止まるときがあった。 189// acceptしたら即切り離すようにした 2002.12.09 190// 同winマシン内にあるIISのFTPに対してだと、ここで処理が止まることがある・・・ 191 if (myDataSocket != null) myDataSocket.close(); 192 readData = new BufferedReader(new InputStreamReader(socRead.getInputStream())); 193 194 String buffer = null; 195 while(true) 196 { 197 buffer = new String(); 198 buffer = readData.readLine(); 199 if(buffer == null) 200 { 201 break; 202 } 203 v.addElement(new String(buffer)); 204 } 205 206 try 207 { 208 if (socRead != null) socRead.close(); 209 210// ↓acceptしたら即切り離すようにした 2002.12.09 211// if (myDataSocket != null) myDataSocket.close(); 212 213 } 214 catch( IOException e ){} 215 216 if(getReplyCode() != 226) 217 { 218 throw( new Exception(command+"は失敗しました") ); 219 } 220 221 resp = new String[v.size()]; 222 for (int i = 0; i < resp.length; i++) 223 { 224 resp[i] = (String)v.elementAt(i); 225 } 226 return resp; 227 } 228 229 /** 230 * ローカルファイルをサーバにファイル名つけてプットする。 231 * <BR> 232 * @param String localfile ローカルファイル名 233 * @param String serverfile サーバファイル名 234 * @throws Exception エラーが発生した場合にスローされる。 235 */ 236 public void put(String localfile, String serverfile) throws Exception 237 { 238 String command = "STOR"; 239 DataInputStream readData = null; 240 DataOutputStream writeData = null; 241 ServerSocket myDataSocket = null; 242 Socket socWrite = null; 243 244 try 245 { 246 myDataSocket = port(); 247 248 sendCommand(command + " " + serverfile); 249 if(getReplyCode() != 150) 250 { 251 throw( new Exception(command+"は失敗しました") ); 252 } 253 254 socWrite = myDataSocket.accept(); 255 readData = new DataInputStream(new FileInputStream(localfile)); 256 writeData = new DataOutputStream(socWrite.getOutputStream()); 257 258 while(true) 259 { 260 byte[] byteRead=new byte[10240]; 261 int iReadLen=readData.read(byteRead); 262 if(iReadLen==(1)) 263 { 264 break; 265 } 266 writeData.write(byteRead,0,iReadLen); 267 } 268 269 writeData.close(); 270 readData.close(); 271 socWrite.close(); 272 if( getReplyCode() != 226) 273 { 274 throw( new Exception(command+"による転送は失敗しました") ); 275 } 276 } 277 catch( Exception e ) 278 { 279 e.printStackTrace( this.log ); 280 throw( new Exception() ); 281 } 282 finally 283 { 284 try 285 { 286 if (socWrite != null) socWrite.close(); 287 if (myDataSocket != null) myDataSocket.close(); 288 if (writeData != null) writeData.close(); 289 } 290 catch( IOException e ){} 291 } 292 } 293 294 /** 295 * PWDを発行する。<BR> 296 * <BR> 297 * @return boolean true・・・成功、false・・・失敗 298 * @throws Exception エラーが発生した場合にスローされる。 299 */ 300 public boolean pwd() throws Exception 301 { 302 sendCommand("PWD"); 303 if(getReplyCode() != 257) 304 { 305 return false; 306 } 307 return true; 308 } 309} 310

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

tkmtmkt

2016/08/19 13:04

「~の2箇所が上手く動いていない」というのを、エラーメッセージが表示されたことで判断されたのであれば、エラーメッセージも上げておいたほうが良いです。 スタックトレース出力しているようなので、原因究明の材料になるかと思います。
guest

回答4

0

RHELからの接続先はWindows2003なんですね。
・Javaをよく見たらポートを入力する場所があるので・・・

・ポート20,21のうち、20が閉じていませんか?
(Telnet ip ポート番号)で確認できます。

・ポートが固定の場合はJava側でPASVモードになっていますか?

・そもそもポート20,21ですか?

・受け側windows2003とのポート番号に差異がありませんか?

・コマンドラインでの接続はどうですか?(takasima20さんと同じ)
(コマンドラインでは成功:Javaの中での問題)←id/pass/portとか?
(コマンドラインからも失敗:linux側でのfirewallの問題(moonphaseさんと同じ)

・エラーが何かわからない(tkmtmkt)
→それぞれのエラー表示でコマンドが表示されているようですので、見たいですね。

なんとなくネットワーク(ポート関係)かなぁと思いますーーー

投稿2016/08/21 01:38

inuaproject

総合スコア30

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

firewallの設定は問題ないですか?

投稿2016/08/19 15:49

moonphase

総合スコア6621

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

とりあえず、手動で ftp を実行してみて、
原因を切り分けるあたりから始めてみては
いかがでしょうか。
なんか環境設定とか違ってるかもしれませんし。

投稿2016/08/19 09:41

takasima20

総合スコア7458

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

自己解決

解答下さったみなさん、ありがとうございました。
頂いた内容を確認していきましたところ、
結局はこちらのコーディングミスでした。
接続先のOSがWindowsServer2012の為、IISからのレスポンスコードに一部
変更が入っていたようでした。
そこの対応が出来ていなかったようです。

自己解決となってしまいましたが、みなさんありがとうございました。

投稿2016/08/30 01:08

dohq

総合スコア232

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問