Форум программистов, компьютерный форум, киберфорум
Программирование Android
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.50/6: Рейтинг темы: голосов - 6, средняя оценка - 4.50
4 / 1 / 0
Регистрация: 16.12.2015
Сообщений: 21
1

Получить список файлов сервера указав путь

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

Author24 — интернет-сервис помощи студентам
Есть сервер на 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
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
23.06.2016, 18:03
Ответы с готовыми решениями:

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

Получить список процессов а также путь до исполняемых файлов
Здрасти пытливые умы) Столкнулся с такой проблемой. Как то через одно место у меня всё получается...

Как получить список файлов с Web сервера
К примеру есть папка на web сервере http://server.ru/download/ В папке находятся некоторое...

Visual C++ как получить путь к exe, и список файлов , и папок что рядом с ней
Visual C++ как получить путь к exe, и список файлов , и папок что рядом с ней вот #include...

11
Модератор
3388 / 2160 / 352
Регистрация: 13.01.2012
Сообщений: 8,378
23.06.2016, 18:09 2
begginer4815, сам код в плане запроса у вас вроде нормально должен перенестись. Вам нужно просто интерфейс нарисовать вместо консоли. Вы это пробовали делать?
0
4 / 1 / 0
Регистрация: 16.12.2015
Сообщений: 21
23.06.2016, 18:17  [ТС] 3
Да, передаю путь через текствью, но запрос даже не приходит на сервер

Добавлено через 6 минут
Попробую сейчас путь через спинер передавать
0
2883 / 2295 / 769
Регистрация: 12.05.2014
Сообщений: 7,978
23.06.2016, 18:23 4
ну надо начать в разрешения в манифесте
XML
1
    <uses-permission android:name="android.permission.INTERNET" />
2
4 / 1 / 0
Регистрация: 16.12.2015
Сообщений: 21
23.06.2016, 18:42  [ТС] 5
Да, это есть. Без него подключение бы не работало
0
Модератор
3388 / 2160 / 352
Регистрация: 13.01.2012
Сообщений: 8,378
23.06.2016, 18:47 6
begginer4815, так вы знаете что оно есть? В чем же тогда затык? Присвоить возвращаемый текст элементу интерфейса?
0
4 / 1 / 0
Регистрация: 16.12.2015
Сообщений: 21
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
2883 / 2295 / 769
Регистрация: 12.05.2014
Сообщений: 7,978
23.06.2016, 19:20 8
более эффективно выкладывать полную копипасту ошибок из консоли, а не пересказ своими словами типа "что-то там на что-то ругается"

работать с UI потоком из другого потока нельзя, там прямо так и говорится в ошибке
нельзя делать settext из метода doInbackground
для этого есть методы onProgressUpdate или onPostExecute
0
4 / 1 / 0
Регистрация: 16.12.2015
Сообщений: 21
23.06.2016, 19:28  [ТС] 9
Цитата Сообщение от Паблито Посмотреть сообщение
работать с UI потоком из другого потока нельзя, там прямо так и говорится в ошибке
именно это и пишет, так если в метод пост вставить editText.setText(line1), то переменная line1 выйдет из области видимости
0
2883 / 2295 / 769
Регистрация: 12.05.2014
Сообщений: 7,978
23.06.2016, 19:30 10
ну выйдет и что?
значит надо переделать аглоритм
0
4 / 1 / 0
Регистрация: 16.12.2015
Сообщений: 21
23.06.2016, 19:33  [ТС] 11
Без потоков можно сделать данную задачу?
0
2883 / 2295 / 769
Регистрация: 12.05.2014
Сообщений: 7,978
23.06.2016, 19:37 12
в андроиде ВСЕ операции с сетью должны проводиться НЕ из UI потока
поэтому ответ - нет
0
23.06.2016, 19:37
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
23.06.2016, 19:37
Помогаю со студенческими работами здесь

Получить путь до файла скриптом с другого сервера
На сервере1 есть скрипт, в нем переменная с названием файла и расширением. Сам файл находится на...

Вывести название файла, указав путь
Напишите, пожалуйста, такую программу, которая выводит на экран название файла, путь к которому...

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

MySQL: можно ли подключиться к БД напрямую (указав путь к БД)?
Добрый день, хочу узнать, можно ли подключиться к БД напрямую, то есть указав путь к БД, которая...


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

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru