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

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

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

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

Java

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

Socket.IO

Socket.IOはNode.js上で動くライブラリであり、すべてのブラウザとモバイルデバイスでリアルタイムのアプリを作動させる事を目的としています。

Eclipse

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

Q&A

解決済

1回答

1856閲覧

ftpサーバーのファイル情報をFile型で取得したい

0sksksk

総合スコア17

FTP

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

Java

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

Socket.IO

Socket.IOはNode.js上で動くライブラリであり、すべてのブラウザとモバイルデバイスでリアルタイムのアプリを作動させる事を目的としています。

Eclipse

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

0グッド

0クリップ

投稿2020/09/28 04:31

#実現したいこと
ftpサーバーに保存されているファイル情報をsocket通信を使用してFile型で取得したいです。

##背景
FFFTPのようなFtpクライアントソフトを作成しており、APIのjava.clientではなくsocket通信を使用して作成したいと考えています。
ファイルの受信や送信は別クラスで作成しており、ftpサーバーに保存されているファイルをFile型で取得し、一覧表示する方法を模索しています。
下記プログラムでString型では取得することができたのですが、File型で取得する方法がわからないので教えていただきたいです。

Java

1import java.io.BufferedReader; 2import java.io.InputStreamReader; 3import java.io.PrintWriter; 4import java.net.ServerSocket; 5import java.net.Socket; 6 7class test { 8 9 public static void main(String args[]) { 10 String host = "ipアドレス"; 11 int ctrl_port = 8021; 12 String user = "ユーザネーム"; 13 String pass = "パスワード"; 14 String home = "/"; 15 16 Socket ctrlSocket = null; 17 PrintWriter ctrlOutput = null; 18 19 Socket dataSocket = null; 20 BufferedReader dataReader = null; 21 22 try { 23 // FTPサーバと8021番ポートでコネクションをはる 24 ctrlSocket = new Socket(host, ctrl_port); 25 26 // コマンドを書くよう 27 ctrlOutput = new PrintWriter(ctrlSocket.getOutputStream()); 28 29 // FTPクライアント(このプログラムを実行するホスト)のアドレスを取得 30 byte[] local_address = ctrlSocket.getLocalAddress().getAddress(); 31 32 // FTPログイン 33 ctrlOutput.println("USER " + user); 34 ctrlOutput.flush(); 35 ctrlOutput.println("PASS " + pass); 36 ctrlOutput.flush(); 37 38 // ディレクトリに移動 39 ctrlOutput.println("CWD " + home); 40 ctrlOutput.flush(); 41 42 // 接続をまつ 43 ServerSocket dataServerSocket = new ServerSocket(0, 1); 44 // 待ちうけポートを取得 45 int data_port = dataServerSocket.getLocalPort(); 46 47 // PORTコマンドを作成 48 String port_command = "PORT "; 49 for (byte b : local_address) { 50 port_command += (b & 0xff) + ","; 51 } 52 port_command += (data_port / 256) & 0xff; 53 port_command += ","; 54 port_command += data_port & 0xff; 55 56 // FTPサーバに待ちうけている場所を教えてあげる 57 ctrlOutput.println(port_command); 58 ctrlOutput.flush(); 59 60 // NLSTコマンド 61 ctrlOutput.println("LIST"); 62 ctrlOutput.flush(); 63 64 // サーバからの接続をうけつける 65 dataSocket = dataServerSocket.accept(); 66 dataServerSocket.close(); 67 68 // サーバから送られてくる情報をよみとる 69 dataReader = new BufferedReader(new InputStreamReader( 70 dataSocket.getInputStream())); 71 72 System.out.println("dataReader =" + dataReader); 73 74 for (String line = dataReader.readLine(); line != null; line = dataReader 75 .readLine()) { 76 // 表示 77 System.out.println("line ="+line); 78 } 79 80 } catch (Exception e) { 81 e.printStackTrace(); 82 } finally { 83 if (dataReader != null) { 84 try { 85 dataReader.close(); 86 } catch (Exception e) { 87 e.printStackTrace(); 88 } 89 } 90 if (dataSocket != null) { 91 try { 92 dataSocket.close(); 93 } catch (Exception e) { 94 e.printStackTrace(); 95 } 96 } 97 98 if (ctrlOutput != null) { 99 ctrlOutput.close(); 100 } 101 if (ctrlSocket != null) { 102 try { 103 ctrlSocket.close(); 104 } catch (Exception e) { 105 e.printStackTrace(); 106 } 107 } 108 } 109 } 110 111} 112

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

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

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

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

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

maisumakun

2020/09/28 04:35

なぜFile型でなければならないのでしょうか?
0sksksk

2020/09/28 04:52

アプリで一覧表示を行う際ファイルアイコンを表示するメソッドも実装しているのですが、その引数をファイル型で設定しており、そのメソッドを再利用できると考えたからです。 private static class FileListCellRenderer extends DefaultListCellRenderer { // ファイルアイコン表示 private final FileSystemView fs = FileSystemView.getFileSystemView(); public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) { super.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus); if (value instanceof File) { File f = (File) value; setText(fs.getSystemDisplayName(f)); setIcon(fs.getSystemIcon(f)); } return this; } }
guest

回答1

0

ベストアンサー

これでどうですか。

java

1 DataInputStream di = new DataInputStream(dataSocket.getInputStream()); 2 File file = new File("書込ファイルパス"); 3 FileOutputStream fo = new FileOutputStream(file); 4 5 int length = di.readInt(); 6 if(length > 0) { 7 byte[] data = new byte[length]; 8 di.readFully(data, 0, data.length); 9 fo.write(data); 10 }

投稿2020/09/28 04:56

yureighost

総合スコア2183

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

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

0sksksk

2020/10/02 01:38

yureighostさん 回答ありがとうございます。 教えていただいたコードで実行した結果、アクセスが拒否されましたというエラーが出てしまうのですがが、なぜでしょうか。
dodox86

2020/10/02 03:09

>質問者さん > 教えていただいたコードで実行した結果、アクセスが拒否されましたというエラーが出てしまうのですがが、なぜでしょうか。 この新しい問題について次の質問を立てたのであれば、Fileクラスを使うという当初の疑問は解消されたはずですので、本質問は閉じるべきだと思います。 [ftpサーバーのファイル情報取得時にアクセス拒否されてしまう] https://teratail.com/questions/295425 そうでないと回答してくださったyureighostさんはじめ閲覧した方々が混乱します。
0sksksk

2020/10/02 04:11

dodox86さん ご指摘ありがとうございます。 ここで質問していることはyureighosのおかげで解決しているので 閉じます。 yureighostさん ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問