Форум программистов, компьютерный форум, киберфорум
Java: Сети
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.50/8: Рейтинг темы: голосов - 8, средняя оценка - 4.50
169 / 66 / 15
Регистрация: 24.03.2013
Сообщений: 467
Записей в блоге: 1

Ftp client

03.02.2014, 21:50. Показов 1792. Ответов 4
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Хай всем)

Поделитесь знаниями пожалуйста

Есть идея реализовать FTP server\client | HTTP Server
На данный момент я реализовывaю Ftp Client.
Для того чтобы клиент мог работать с сервером, я скачал\ запустил FileZilla ftp server (OpenSource(c/c++) Server), который слушает localhost на 21 порту.
На данный момент клиент может коннектиться к нему, и больше ничего.

Проблема первая: Я не могу отправить команду на сервер, точнее то что я отправляю на сервер, сервером не переваривается. Стандартный microsoft'ский telnet спокойно с этим сервером дружит, мой нет.
Connect : Все ОК
Любая команда(HELP к примеру) : Все плохо
По логам сервера понятно, что данные отправляются не в той кодировке, и как эту проблему решить?


Вот отправка запроса с клиента на сервер
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
protected void sendButtonClicked() {
 
                String command = this.commandTextField.getText();
 
                this.commandTextField.setText("");
 
                if("".equals(command))
 
                        return;
 
                try {
 
                        execCommand(command);
 
                        showServerAnswer(getServerAnswer());
 
                } catch (Exception e) {
 
                        showErrorMessage(e.getMessage());
 
                }
 
        }
 
        private String getServerAnswer() throws IOException {
 
                byte[] bytes = new byte[CACHE_SIZE];
 
                int read = this.in.read(bytes, 0, bytes.length);
 
                return new String(bytes, 0, read);
 
        }
 
        private void execCommand(String command) throws IOException {
 
                String[] words = command.split(" ");
 
                if("connect".equals(words[0].toLowerCase())){
 
                        connect(words);
 
                        return;
 
                } 
 
                if("exit".equals(words[0].toLowerCase())){
 
                        this.exit();
 
                        return;
 
                }
 
                sendToServer(command);
 
        }
 
        private void sendToServer(String command) throws IOException {
 
                if(this.out == null)
 
                        throw new IOException("No active connection.");
 
                this.out.writeUTF(command.toUpperCase()); 
 
                this.out.flush();
 
        }
Полная версия
Кликните здесь для просмотра всего текста
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
package ui.swing;
 
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.net.Socket;
import java.nio.charset.Charset;
import java.text.SimpleDateFormat;
import java.util.Date;
 
import javax.swing.GroupLayout;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JDialog;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTextField;
import javax.swing.JTextPane;
import javax.swing.LayoutStyle;
import javax.swing.UIManager;
 
import com.jtattoo.plaf.aluminium.AluminiumLookAndFeel;
 
public class Terminal extends JFrame implements Runnable {
    private static final long serialVersionUID = -4666326545105462300L;
    private static final String INFO = "Terminal client for ftp server";
    
    private JTextField commandTextField;
    private JTextPane mainTextPane;
    private JButton sendButton;
    private JScrollPane jScrollPane1;
    private SimpleDateFormat format;
    private Socket ss;
    private DataInputStream in;
    private DataOutputStream out;
    private int CACHE_SIZE = 64*1024;
    
    public Terminal() {
        this.initComponents();
        this.setResizable(false);
        this.setIconImage(new ImageIcon(Terminal.class
                .getResource("/resources/images/vbRecycle-icon.png")).getImage());
        this.getRootPane().setDefaultButton(sendButton);
        this.format = new SimpleDateFormat("HH:MM:ss");
    }
 
    protected void sendButtonClicked() {
        String command = this.commandTextField.getText();
        this.commandTextField.setText("");
        if("".equals(command))
            return;
        try {
            execCommand(command);
        } catch (Exception e) {
            showErrorMessage(e.getMessage());
        }
    }
    private void execCommand(String command) throws IOException {
        String[] words = command.split(" ");
        if("connect".equals(words[0].toLowerCase())){
            connect(words);
            showServerAnswer(getServerAnswer());
            return;
        } 
        if("exit".equals(words[0].toLowerCase())){
            this.exit();
            return;
        }
        if("cls".equals(words[0].toLowerCase()) || "clear".equals(words[0].toLowerCase())){
            this.clearTextPane();
            return;
        }
        sendToServer(command);
    }
    private void clearTextPane() {
        this.mainTextPane.setText(Terminal.INFO);
    }
 
    private void sendToServer(String command) throws IOException {
        if(this.out == null)
            throw new IOException("No active connection.");
        byte[] bytes = command.toUpperCase().getBytes(Charset.forName("windows-1251"));
        this.out.write(bytes);
        this.out.flush();
    }
    private String getServerAnswer() throws IOException {
        byte[] bytes = new byte[CACHE_SIZE];
        int read = this.in.read(bytes, 0, bytes.length);
        return new String(bytes, 0, read);
    }
    private void connect(String[] words) throws IOException {
        if(this.ss != null && this.ss.isConnected()){
            this.ss.close();
        }
        int port = Integer.parseInt(words[2]);
        String host = words[1];
        
        showMessage("Connection " + host + " " + port);
        try{
            this.ss = new Socket(host, port);
        } catch(IOException e){
            throw new IOException("Connection failed!");
        }
        this.in = new DataInputStream(ss.getInputStream());
        this.out = new DataOutputStream(ss.getOutputStream());
        showMessage("Connected to " + host + ":" + port);
    }
 
 
    private void exit() {
        try {
            if(this.out != null){
                this.sendToServer("QUIT");
                this.out.close();
            }
            
            if(this.in != null)
                this.in.close();
            if(this.ss != null)
                this.ss.close();
        } catch (IOException e) {
            e.printStackTrace();
        } finally{
            System.exit(0);
        }
    }
 
    private void showServerAnswer(String text) {
        String message = "[SERVER]: " + format.format(new Date()) + "\n" + text; 
        String txt = this.mainTextPane.getText();
        if("".equals(text)){
            this.mainTextPane.setText(message);
        } else{
            this.mainTextPane.setText(txt + "\n" + message);
        }
    }
 
    private void showErrorMessage(String message) {
        String txt = "[ERROR]: " + format.format(new Date()) + " -> " + message; 
        String text = this.mainTextPane.getText();
        this.mainTextPane.setText(text + "\n" + txt);
    
    }
    private void showMessage(String message){
        String txt = "[INFO]: " + format.format(new Date()) + " -> " + message;
        String text = this.mainTextPane.getText();
        this.mainTextPane.setText(text + "\n" + txt);
    }
    
    
    
    @Override
    public void run() {
        this.setVisible(true);
    
    }
    
 
    public static void main(String[] args) {
        try {
            UIManager.setLookAndFeel(new AluminiumLookAndFeel());
            Terminal terminal = new Terminal();
            Thread th = new Thread(terminal);
            th.setDaemon(true);
            th.start();
            
        } catch (Exception e) {
            System.out.println(e.getMessage());
        }
    }
    private void initComponents() {
        setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE);
        setTitle("Terminal");
        sendButton = new JButton();
        sendButton.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent arg0) {
                sendButtonClicked();
            }
        });
        
        jScrollPane1 = new JScrollPane();
        mainTextPane = new JTextPane();
        mainTextPane.setText(Terminal.INFO);
        mainTextPane.setEditable(false);
        commandTextField = new JTextField();
        
        jScrollPane1.setViewportView(mainTextPane);
        sendButton.setText("OK");
        
        initLayout();
        pack();
    }
    private void initLayout(){
 
        GroupLayout layout = new GroupLayout(getContentPane());
        getContentPane().setLayout(layout);
        layout.setHorizontalGroup(layout
                .createParallelGroup(GroupLayout.Alignment.LEADING)
                .addGroup(
                        layout.createSequentialGroup()
                                .addContainerGap()
                                .addGroup(
                                        layout.createParallelGroup(
                                                GroupLayout.Alignment.LEADING)
                                                .addComponent(jScrollPane1)
                                                .addGroup(
                                                        layout.createSequentialGroup()
                                                                .addComponent(
                                                                        commandTextField,
                                                                        GroupLayout.DEFAULT_SIZE,
                                                                        523,
                                                                        Short.MAX_VALUE)
                                                                .addPreferredGap(
                                                                        LayoutStyle.ComponentPlacement.UNRELATED)
                                                                .addComponent(
                                                                        sendButton)))
                                .addContainerGap()));
        layout.setVerticalGroup(layout
                .createParallelGroup(GroupLayout.Alignment.LEADING)
                .addGroup(
                        layout.createSequentialGroup()
                                .addContainerGap()
                                .addComponent(jScrollPane1,
                                        GroupLayout.PREFERRED_SIZE, 461,
                                        GroupLayout.PREFERRED_SIZE)
                                .addPreferredGap(
                                        LayoutStyle.ComponentPlacement.RELATED)
                                .addGroup(
                                        layout.createParallelGroup(
                                                GroupLayout.Alignment.BASELINE)
                                                .addComponent(
                                                        commandTextField,
                                                        GroupLayout.PREFERRED_SIZE,
                                                        GroupLayout.DEFAULT_SIZE,
                                                        GroupLayout.PREFERRED_SIZE)
                                                .addComponent(sendButton))
                                .addContainerGap(GroupLayout.DEFAULT_SIZE,
                                        Short.MAX_VALUE)));
 
    }
}
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
03.02.2014, 21:50
Ответы с готовыми решениями:

FTP Client с возможностью докачки.
Простой FTP клиент с возможность докачки... Что лучше использовать

PC -> FTP -> FTP Server
Добрый день! Вопрос такой: при пересылке файла считываю из исходного один байт, затем записываю в выходной файл один байт, пока не...

Jabber client
может соберемся с и напишем свой jabber client на джаве?у кого есть свобное время пишите в эту ветку

4
 Аватар для Skipy
2000 / 1427 / 92
Регистрация: 25.11.2010
Сообщений: 3,611
04.02.2014, 17:16
Завязывайте с writeUTF. Переводите строку вместе с \r\n в iso-8859-1 и отправляйте массив байтов. Или просто на outputStream повесьте writer с кодировкой:

Java
1
2
OutputStreamWriter w = new OutputStreamWriter(this.out, "iso-8859-1");
w.write("HELP\r\n");
P.S. BTW, Вы в курсе концепции control connection / data connection? Разобрались, как работает ftp?
1
169 / 66 / 15
Регистрация: 24.03.2013
Сообщений: 467
Записей в блоге: 1
05.02.2014, 11:06  [ТС]
Цитата Сообщение от Skipy Посмотреть сообщение
Вы в курсе концепции control connection / data connection? Разобрались, как работает ftp?
Спасибо. Есть один момент, кто должен открывать второй(data) сокет - сервер или клиент?

Просто если сервер будет открывать, то возможно этот порт будет уже занят.

[Client] -> connect localhost 21
[Server]-> connected. Welcome
[Client] -> user almaz
[Server]-> User almaz; Password:
[Client] -> pass *****
[Server]-> Almaz - log on
[Client] -> download myTxt.txt
// Что здесь должно быть?

1. Вариант
[Server] -> OPEN 20 [SIZE_OF(myTxt.txt)];
[Client] -> OK | READY | FAIL
IF (OK) {
Server - connect to commandConnection.getAddress() + 20
[Server_data_con] -> transfer myTxt.txt bytes
[Server_com_con] -> finish
Server [Server_data_con] - connection.close();
}
IF(FAIL){
//[Server] -> OPEN 20 [SIZE_OF(myTxt.txt)];
//[Client] -> FAIL

Что здесь делать?
}


2. Вариант
[Server] -> Connect 20 [SIZE_OF(myTxt.txt)];
[Client] -> connect localhost 20
[Server_data_con] -> transfer myTxt.txt bytes
[Server_com_con] -> finish


Мне больше 1 вариант нравится, но есть подводные моменты, ввиде
1. Если клиент не может открыть порты(прав доступа на это нет)
2. Если у клиента этот порт занят, но он может открыть другой порт.
0
 Аватар для Skipy
2000 / 1427 / 92
Регистрация: 25.11.2010
Сообщений: 3,611
05.02.2014, 12:16
Цитата Сообщение от Almaz_1993 Посмотреть сообщение
Спасибо. Есть один момент, кто должен открывать второй(data) сокет - сервер или клиент?
Так. То есть описание протокола Вы не читали. Прошу сюда: http://www.ietf.org/rfc/rfc959.txt

Команды PASV и PORT.
1
169 / 66 / 15
Регистрация: 24.03.2013
Сообщений: 467
Записей в блоге: 1
05.02.2014, 18:34  [ТС]
Цитата Сообщение от Skipy Посмотреть сообщение
То есть описание протокола Вы не читали.
Ток на вики
Думаю разберусь с этим.

Добавлено через 5 часов 52 минуты
Skipy, Сейчас прочитал вашу насчет учебы, в общем спасибо
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
05.02.2014, 18:34
Помогаю со студенческими работами здесь

Client-Server trouble
Пытаюсь написать небольшой конвертер валют, застрял на проблеме общения клиент сервера. Знатоки, требуются ваши светлые головы :) ...

Java RDP client
Знатоки, подскажите пож. 1) Есть ли в java пакеты для работы с RDP? В гугле ничего не нашарил. 2) Нашел клиент на java -...

Broadcast UDP client
Клиент привязан к порту 12345, сервер к 12344. Клиент посылает широковещательный пакет на 255.255.255.255 12344. Не могу понять в чём...

Socket, Client - Server
Создаю Клиент Серверное приложения, столкнулся с проблемой, если открыть клиент и сервер на одном компютере, то все работает, я указал в...

Client-server на java
Решил написать простейший сервер.Вот код:(это клиент)! package educ.mark; import java.awt.FlowLayout; import...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru