Форум программистов, компьютерный форум CyberForum.ru
Наши страницы

Программирование Android

Войти
Регистрация
Восстановить пароль
 
begginer4815
3 / 0 / 0
Регистрация: 16.12.2015
Сообщений: 17
#1

Получить список файлов сервера указав путь - Программирование Android

23.06.2016, 18:03. Просмотров 236. Ответов 11
Метки нет (Все метки)

Есть сервер на java рабочий. Принимает запросы от клиента и выводит список txt файлов прописанного в путе диска, затем по введенному названию тхт файла выводит его содержимое
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
package test;
 
 
import java.net.*;
import java.io.*;
import java.util.*;
 
public class test {
    public static void main(String[] args){      
        try{
        ServerSocket ss = new ServerSocket(3333);
        while(true)
        new HttpConnect(ss.accept());       
        }catch(ArrayIndexOutOfBoundsException ae)
        {
            System.err.println("Usage server port");
            System.exit(0);
        }catch(IOException e)
        {
            System.out.println(e);
        }
    }
}
 
    class HttpConnect extends Thread{
    private Socket sock;
    HttpConnect(Socket s)
    {
    sock = s;
    setPriority(NORM_PRIORITY - 1);
    start();
    }
    public void run()
    {
    try
    {
        PrintWriter pw = new PrintWriter(new OutputStreamWriter(sock.getOutputStream()),true);
            BufferedReader br = new BufferedReader(new InputStreamReader(sock.getInputStream()));
            String req = br.readLine();
            String files = "";
            System.out.println("Request: " + req);
            StringTokenizer st = new StringTokenizer(req);
            if((st.countTokens() >= 2) && st.nextToken().equals("POST")){
                if((req = st.nextToken()).endsWith("/") || req.equals(""))
                    req += "";
                    File f = new File(req);
                    MyFileFilter filter = new MyFileFilter();
                    File[] list = f.listFiles(filter);
                    for(int i = 0; i < list.length; i++) 
                    {
                       files += list[i].toString() + "\n";
                    }
                    pw.write("HTTP/1.1 200 OK\n");
                    pw.write(files);
                    pw.write("HTTP/1.1 200 OK\n");
                    pw.flush();
                } else pw.println("HTTP/1.1 400 Bad RequestW");
            
            if(req != null)
            {
            String res = br.readLine();
            System.out.println("Request: " + res);
            StringTokenizer st1 = new StringTokenizer(res);
            if((st1.countTokens() >= 2) && st1.nextToken().equals("POST")){
                if((res = st1.nextToken()).endsWith("/") || res.equals(""))
                    res += "";
                try{
                    File f = new File(req + res);
                    BufferedReader bfr = new BufferedReader(new FileReader(f));
                    char[] data = new char[(int)f.length()];
                    bfr.read(data);
                    pw.println("HTTP/1.1 200 OK\n");
                    pw.write(data);
                    pw.flush();
                }
                catch(FileNotFoundException fe)
                {
                    pw.println("HTTP/1.1 404 Not FoundX\n");
                }catch(IOException ioe)
                {
                    System.out.println(ioe);
                }
                } else pw.println("HTTP/1.1 400 Bad RequestW");
            }
            
            sock.close();
            }catch(IOException e)
            {
                System.out.println(e);
            }
    }
}
class MyFileFilter implements FileFilter {
    public boolean accept(File pathname) 
    {
       return pathname.isFile() && pathname.getName().endsWith(".txt");
    }
}

Так же есть клиент, который запрашивает путь директории и затем имя txt файла, для вывода его содержимого
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
public static void main(String[] args) {
        String host = "182.176.11.3";
        int port = 3333;
        String file = null;
        String path = null;
        Scanner sc = new Scanner(System.in);
        path = sc.nextLine();
        try{
            Socket sock = new Socket(host, port);
            PrintWriter pw = new PrintWriter(new OutputStreamWriter(sock.getOutputStream()),true);
            pw.println("POST " + path + " HTTP/1.1");
            BufferedReader br = new BufferedReader(new InputStreamReader(sock.getInputStream()));
            String line1 = br.readLine();
            StringTokenizer se = new StringTokenizer(line1);
            String res = "HTTP/1.1 200 OK";
            while((line1 = br.readLine()) != null)
            {
                if (res.equals(line1))
                {
                    break;  
                }
                else
                {
                    System.out.println(line1);
                }
            }
            file = sc.nextLine();
            pw.println("POST " + file + " HTTP/1.1\n");
            String line = null;
            line = br.readLine();
            StringTokenizer st = new StringTokenizer(line);
            String code = null;
            while((line = br.readLine()) != null)
                System.out.println(line);
            sock.close();
            byte bKbdInput[] = new byte[256];
            int lenght = System.in.read(bKbdInput);
        }catch(Exception e)
        {
            System.err.println(e);
        }
    }   
}
Подключение к серверу сделал
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
public void conn(View view) {
        AsyncTask<String, Integer, Boolean> task = new AsyncTask<String, Integer, Boolean>() {
            @Override
            protected Boolean doInBackground(String... params) {
                try {
                    s = new Socket(params[0], 3333);
                    is = s.getInputStream();
                    os = s.getOutputStream();
                } catch (Exception ioe) {
                    return false;
                }
                return true;
            }
 
            @Override
            protected void onPostExecute(Boolean param) {
                editText3.setText((param)? "Подключено" : " Нет ответа");
            }
        };
        task.execute(spinner.getSelectedItem().toString());
    }
Как переделать клиент java под андроид чтобы получить хотя бы список файлов например в мултилайн текст?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
23.06.2016, 18:03
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Получить список файлов сервера указав путь (Программирование Android):

Получить список файлов с HTTP-сервера - Программирование Android
Интересует получение списка файлов без вспомогательных серверных скриптов php и пр. Я подозреваю, что скорее всего это невозможно из...

Не удается получить список файлов на хостинге ftp - Программирование Android
Взгляните на код, пожалуйста: FTPClient ftc = new FTPClient(); try { ...

Как получить список файлов в архиве и извлечь только нужные - Программирование Android
Подскажите плиз, как получить список файлов в архиве и извлеч только нужные мне файлы в папку. Перебрал кучу примеров из инета для работы...

Не получается получить путь к карте памяти - Программирование Android
Всем привет. У меня вот такой вопрос: storage/sdcard0 это путь к памяти телефона storage/sdcard1 это собственно карта памяти. ...

Получить абсолютный путь к Assets файлам - Программирование Android
Здравствуйте. Проект под MonoAndroid, но в данном случае это не важно. Использую iTextSharp для создания .pdf файла. И чтобы кирилица...

Получить путь к карте памяти (SD card) - Программирование Android
Не педелитесь методом, который возвращает путь к карте памяти, если она есть? Нащел вот такой метод в интернете, но на некоторых...

11
vxg
Модератор
3172 / 1975 / 222
Регистрация: 13.01.2012
Сообщений: 7,607
23.06.2016, 18:09 #2
begginer4815, сам код в плане запроса у вас вроде нормально должен перенестись. Вам нужно просто интерфейс нарисовать вместо консоли. Вы это пробовали делать?
0
begginer4815
3 / 0 / 0
Регистрация: 16.12.2015
Сообщений: 17
23.06.2016, 18:17  [ТС] #3
Да, передаю путь через текствью, но запрос даже не приходит на сервер

Добавлено через 6 минут
Попробую сейчас путь через спинер передавать
0
Pablito
2505 / 1989 / 619
Регистрация: 12.05.2014
Сообщений: 6,943
Завершенные тесты: 1
23.06.2016, 18:23 #4
ну надо начать в разрешения в манифесте
XML
1
    <uses-permission android:name="android.permission.INTERNET" />
2
begginer4815
3 / 0 / 0
Регистрация: 16.12.2015
Сообщений: 17
23.06.2016, 18:42  [ТС] #5
Да, это есть. Без него подключение бы не работало
0
vxg
Модератор
3172 / 1975 / 222
Регистрация: 13.01.2012
Сообщений: 7,607
23.06.2016, 18:47 #6
begginer4815, так вы знаете что оно есть? В чем же тогда затык? Присвоить возвращаемый текст элементу интерфейса?
0
begginer4815
3 / 0 / 0
Регистрация: 16.12.2015
Сообщений: 17
23.06.2016, 19:03  [ТС] #7
Сейчас, я пробую. Не получится отпишу, уже даже мысль есть

Добавлено через 19 секунд
Просто с потоками проблема

Добавлено через 13 минут
Сделал так, теперь запрос на сервер отправляется, но как сделать вывод инфы в андроид? Ругается на editText.setText(line1);

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
public void getConnection(View view) {
        AsyncTask<String, Integer, Boolean> nt = new AsyncTask<String, Integer, Boolean>() {
            @Override
            protected Boolean doInBackground(String... params) {
                try {
                    s = new Socket(/*params[0]*/"", 9999);
 
                    is = s.getInputStream();
                    os = s.getOutputStream();
 
 
                    buf1 = str.getBytes();
                    len1 = str.length();
                    os.write(buf1, 0, len1);
 
 
 
                    PrintWriter pw = new PrintWriter(new OutputStreamWriter(s.getOutputStream()),true);
                    pw.println("POST " + str + " HTTP/1.1");
                    BufferedReader br = new BufferedReader(new InputStreamReader(s.getInputStream()));
                    String line1 = br.readLine();
                    StringTokenizer se = new StringTokenizer(line1);
                    String res = "HTTP/1.1 200 OK";
                    while((line1 = br.readLine()) != null)
                    {
                        if (res.equals(line1))
                        {
                            break;
                        }
                        else
                        {
                            //editText.setText(line1);
                        }
                    }
 
                    os.flush();
 
                } catch (Exception ioe) {
                    return false;
                }
                return true;
            }
 
            @Override
            protected void onPostExecute(Boolean param) {
                editText3.setText((param)? "Подключено" : " Отключено");
            }
        };
        //nt.execute(spinner.getSelectedItem().toString());
        nt.execute(str = editText2.getText().toString());
    }
0
Pablito
2505 / 1989 / 619
Регистрация: 12.05.2014
Сообщений: 6,943
Завершенные тесты: 1
23.06.2016, 19:20 #8
более эффективно выкладывать полную копипасту ошибок из консоли, а не пересказ своими словами типа "что-то там на что-то ругается"

работать с UI потоком из другого потока нельзя, там прямо так и говорится в ошибке
нельзя делать settext из метода doInbackground
для этого есть методы onProgressUpdate или onPostExecute
0
begginer4815
3 / 0 / 0
Регистрация: 16.12.2015
Сообщений: 17
23.06.2016, 19:28  [ТС] #9
Цитата Сообщение от Паблито Посмотреть сообщение
работать с UI потоком из другого потока нельзя, там прямо так и говорится в ошибке
именно это и пишет, так если в метод пост вставить editText.setText(line1), то переменная line1 выйдет из области видимости
0
Pablito
2505 / 1989 / 619
Регистрация: 12.05.2014
Сообщений: 6,943
Завершенные тесты: 1
23.06.2016, 19:30 #10
ну выйдет и что?
значит надо переделать аглоритм
0
begginer4815
3 / 0 / 0
Регистрация: 16.12.2015
Сообщений: 17
23.06.2016, 19:33  [ТС] #11
Без потоков можно сделать данную задачу?
0
Pablito
2505 / 1989 / 619
Регистрация: 12.05.2014
Сообщений: 6,943
Завершенные тесты: 1
23.06.2016, 19:37 #12
в андроиде ВСЕ операции с сетью должны проводиться НЕ из UI потока
поэтому ответ - нет
0
23.06.2016, 19:37
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
23.06.2016, 19:37
Привет! Вот еще темы с ответами:

Получить полный путь к картинке в ImageView - Программирование Android
Доброго времени суток! Помогите советом. Имеется ImageView c картинкой как получить полный путь к этой картинке. Изображение можно...

Как из data.getData() получить путь к файлу? - Программирование Android
Добрый вечер! Столкнулся с необходимость открыть изображение из галереи устройства. С этой целью использовал: 1) Доступ к галереи...

Получить путь к текстовому файлу по его Uri - Программирование Android
Доброго времени суток. Необходимо прочитать и десериализовать файл XML. Запуская неявный Intent указываю нужный файл и в...

Как получить путь к SD карте на ЛЮБОМ устройстве? - Программирование Android
Повторяю - на ЛЮБОМ устройстве.


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

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru