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

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

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

FTP(File Transfer Protocol)は、ネットワークでのファイル転送を行うための通信プロトコルの1つである。

Java

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

Eclipse

Eclipseは、IBM社で開発された統合開発環境のひとつです。2001年11月にオープンソース化されました。 たくさんのプラグインがあり自由に機能を追加をすることができるため、開発ツールにおける共通プラットフォームとして位置づけられています。 Eclipse自体は、Javaで実装されています。

Q&A

解決済

1回答

2522閲覧

ディレクトリを指定してファイルをgetしたい

0sksksk

総合スコア17

FTP

FTP(File Transfer Protocol)は、ネットワークでのファイル転送を行うための通信プロトコルの1つである。

Java

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

Eclipse

Eclipseは、IBM社で開発された統合開発環境のひとつです。2001年11月にオープンソース化されました。 たくさんのプラグインがあり自由に機能を追加をすることができるため、開発ツールにおける共通プラットフォームとして位置づけられています。 Eclipse自体は、Javaで実装されています。

0グッド

0クリップ

投稿2020/09/14 00:51

#socket通信を行いFTPサーバーからファイル受信をしています。
FTPサーバーからPCにファイルの受信自体はできているが、保存先のディレクトリを指定する方法がわからないです。
今はeclipseフォルダの中のMainActivityというフォルダに自動的に保存される。
##環境
Eclipse4.4Luna
##試したこと
添付プログラムの247行目の"RETR " + file_nameの前に一度"LCD" + 保存先ディレクトリをという文を入れてみましたが、Unknown Commandというエラーが出てしまいました。
##わからないこと
なぜSTORRETRのコマンドは実行できLCDはUnknownになってしまうのか。
コマンドではなく別の方法で保存先ディレクトリを指定する場合、その方法。
なぜMainActivityというフォルダに自動的に送られるのか。
##プログラムの説明
これとは別にもう一つクラスがあり、そこに引数としてFTPのURLユーザネームパスワードAscii or Binaryを入力して実行する。

Java

1import java.io.BufferedReader; 2import java.io.DataInputStream; 3import java.io.DataOutputStream; 4import java.io.FileOutputStream; 5import java.io.IOException; 6import java.io.InputStreamReader; 7import java.net.InetAddress; 8import java.net.ServerSocket; 9import java.net.Socket; 10import java.net.URL; 11import java.util.StringTokenizer; 12 13class Client 14{ 15 // 受信コード 16 public static final String READY = "220"; 17 public static final String USER = "331"; 18 public static final String PASS = "230"; 19 public static final String COMMAND = "200"; 20 public static final String OPEN = "150"; 21 public static final String TRANSFER = "226"; 22 23 // 定数 24 public static final char return_code = 0x0a; 25 public static final int client_port = 1094; 26 27 // メッセージ送受信用I/Oストリーム 28 BufferedReader input; 29 DataOutputStream output; 30 31 // Publicメンバ変数 32 URL url; 33 String user_name; 34 String password; 35 String type; 36 String file_name; 37 int ip[]; 38 39 // コンストラクタ 40 public Client(String param_url,String user_name,String password,String type) 41 { 42 this.user_name = user_name; 43 this.password = password; 44 this.type = type; 45 46 connection(param_url); 47 } 48 49 // FTPコネクション 50 public void connection(String param_url) 51 { 52 try 53 { 54 url = new URL(param_url); 55 56 // IPアドレスの取得 57 int index = 0; 58 ip = new int[4]; 59 System.out.println("ip = "+ip); 60 StringTokenizer string; 61 62 Socket socket = new Socket(url.getHost(),8021); 63 InetAddress ipaddress = InetAddress.getLocalHost(); 64 System.out.println("ipaddress =" + ipaddress); 65 string = new StringTokenizer(ipaddress.getHostAddress(),"."); 66 System.out.println("string = "+string); 67 while(string.hasMoreTokens()) 68 { 69 ip[index] = Integer.parseInt(string.nextToken()); 70 System.out.println("ip[index] = "+ip[index]); 71 System.out.println("index =" +index); 72 index++; 73 } 74 75 // ファイル名の解析 76 77 string = new StringTokenizer(url.getFile(),"/"); 78 79 System.out.println(url.getFile()); 80 System.out.println("クリア"); 81 String file_name = new String(); 82 while(string.hasMoreTokens()) 83 { 84 file_name = string.nextToken(); 85 System.out.println("ループに入っています"); 86 System.out.println("file_name = " +file_name); 87 System.out.println(url.getFile()); 88 } 89 90 // 送受信用リスナ 91 ServerSocket ssocket = new ServerSocket(client_port); 92 93 // メッセージ送受信用I/Oストリームの取得 94 input = new BufferedReader(new InputStreamReader(socket.getInputStream())); 95 output = new DataOutputStream(socket.getOutputStream()); 96 97 // FTP 通信の開始。 98 ReceiveMessage(READY); 99 System.out.println("FTP通信開始"); 100 System.out.println("ip = " + ip); 101 System.out.println("client_port = "+ client_port); 102 103 UserAuthentication(user_name,password); 104 System.out.println("ユーザ認証通過"); 105 106 SetType(type); 107 System.out.println("タイプ通過"); 108 OpenClientPort(ip,client_port); 109 System.out.println("ip = " + ip); 110 System.out.println("client_port = "+ client_port); 111 System.out.println("オープンクライアントポート通過"); 112 int file_size = ReceiveFile(url.getFile().substring(1));//受信を行う箇所 113 System.out.println("ftp通信完了"); 114 115 // 受信用リスナの構築 116 Socket receive = ssocket.accept(); 117 System.out.println("receive ="+receive); 118 DataInputStream data_in = new DataInputStream(receive.getInputStream()); 119 System.out.println("data_in ="+data_in); 120 DataOutputStream file_out = new DataOutputStream(new FileOutputStream(file_name)); 121 System.out.println("file_out ="+file_out); 122 System.out.println("受信リスナ構築完了"); 123 124 // 受信&書き出し 125 //String str; 126 127 for(int i=0;i<file_size;i++) 128 { 129 System.out.println("for文に入っています"); 130 file_out.writeByte(data_in.readByte()); 131 } 132 133 ReceiveMessage(TRANSFER); 134 System.out.println("Receive OK"); 135 136 // 終了処理 137 socket.close(); 138 ssocket.close(); 139 } 140 catch(Exception e) 141 { 142 System.err.println(e.toString()); 143 } 144 } 145 146 // リターンコードの確認 147 protected boolean isReady(String string,String type) 148 { 149 if(string.substring(0,3).compareTo(type) == 0) 150 { 151 return(true); 152 } 153 return(false); 154 } 155 156 // エラーメッセージルーチン 157 protected void ErrorMessage(String message) 158 { 159 System.out.println(message); 160 System.exit(-1); 161 } 162 163 // メッセージの送信 164 protected void SendMessage(String message) 165 { 166 try 167 { 168 output.writeBytes(message + return_code); 169 } 170 catch(IOException e) 171 { 172 System.err.println(e.toString()); 173 } 174 } 175 176 // 受信メッセージの判断 177 protected String ReceiveMessage(String type) 178 { 179 try 180 { 181 String res = input.readLine(); 182 System.out.println(">" + res); 183 if(!isReady(res,type)) 184 { 185 ErrorMessage("Error: code = " + type); 186 } 187 return(res); 188 } 189 catch(IOException e) 190 { 191 System.out.println(e.toString()); 192 return("Error_Code"); 193 } 194 } 195 196 // ユーザー認証 197 protected void UserAuthentication(String user_name,String password) 198 { 199 SendMessage("USER " + user_name); 200 ReceiveMessage(USER); 201 202 SendMessage("PASS " + password); 203 ReceiveMessage(PASS); 204 } 205 206 // Ascii or Binaryモードセット 207 protected void SetType(String type) 208 { 209 if(type.toLowerCase().compareTo("ascii") == 0) 210 { 211 SendMessage("TYPE A"); 212 ReceiveMessage(COMMAND); 213 } 214 else 215 { 216 SendMessage("TYPE I"); 217 ReceiveMessage(COMMAND); 218 } 219 } 220 221 // データ受信用ポートの通知 222 protected void OpenClientPort(int ip[],int port) 223 { 224 for(int i = 0; i < 4; i++){ 225 System.out.println("ip = "+ ip[i]); 226 } 227 System.out.println("port ="+ port); 228 int high_port_number,low_port_number; 229 230 high_port_number = port / 256; 231 System.out.println("high_port_number ="+ high_port_number); 232 low_port_number = port % 256; 233 System.out.println("low_port_number ="+ low_port_number); 234 SendMessage("PORT " + ip[0] + "," + ip[1] + "," + ip[2] + "," + ip[3] + "," 235 + high_port_number + "," + low_port_number); 236 System.out.println("COMMAND ="+COMMAND); 237 ReceiveMessage(COMMAND); 238 } 239 240 // ファイル受信コマンド 241 protected int ReceiveFile(String file_name) 242 { 243 String receive; 244 System.out.println("受信コマンドに入っています"); 245 System.out.println(file_name); 246 247 SendMessage("RETR " + file_name); 248 receive = ReceiveMessage(OPEN); 249 System.out.println("eceive ="+receive); 250 return(GetFileSize(receive)); 251 } 252 253 // ファイル送信コマンド 254 protected int StoreFile(String file_name) 255 { 256 String receive; 257 System.out.println("送信コマンドに入っています"); 258 System.out.println(file_name); 259 260 SendMessage("STOR " + file_name); 261 receive = ReceiveMessage(OPEN); 262 return(GetFileSize(receive)); 263 } 264 265 // 受信/送信メッセージからファイルサイズを求める 266 protected int GetFileSize(String message) 267 { 268 int size,begin_index,end_index; 269 270 begin_index = message.lastIndexOf('(') + 1; 271 end_index = message.lastIndexOf("bytes") - 1; 272 size = Integer.parseInt(message.substring(begin_index,end_index)); 273 274 return(size); 275 } 276}

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

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

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

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

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

guest

回答1

0

ベストアンサー

LCDは、ftpクライアント自身が処理するコマンドで、FTPサーバーには送られません。プロトコルの規格(RFC 959など)にも規定されていません。

FTPコマンドの一覧 - Wikipedia

今回だと、あなたの作成したプログラム自身がLCDに対応する処理を行なう必要があります。つまり、FTPサーバーからファイル名を取得した後、new FileOutputStream(file_name)するさいに、file_nameの前に保存先ディレクトリの絶対パスか相対パスを付加してください。

投稿2020/09/14 01:20

Daregada

総合スコア11990

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

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

0sksksk

2020/09/14 01:39

無事に指定したディレクトリにファイルを保存することができました。 ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問