Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Java [игнор отключен] [закрыт для гостей] / Подскажите по передаче файлов через сокеты / 12 сообщений из 12, страница 1 из 1
23.11.2015, 13:24
    #39110912
bobo96
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Подскажите по передаче файлов через сокеты
Приветствую!
Есть клиент на андроиде, который делает запрос к серверу, а тот в ответ пуляет файлы.
Интересует как правильнее организовать работу:
а) открывать соединение, передавать все файлы, закрывать соединение
б) открывать соединение, передавать один файл, закрывать соединение и так n раз (где n - кол-во файлов)
Так же хотелось бы услышать советы, как правильно организовать отлов ошибок на предмет разрыва соединения, падения клиента или сервера с возможностью последующей докачки.
Ну и было бы здорово, если бы уважаемое сообщество просто поругала код. Заранее благодарю!

Клиент:
Код: 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.
    private boolean downloadFile(Intent intent, String fileName, int bufferSize) {

        intent.putExtra(MainActivity.PI_SIZE_SEND, sizeSend);
        intent.putExtra(MainActivity.PI_SIZE_FILE, sizeFile);
        sendBroadcast(intent);

        byte[] buffer =                 new byte[bufferSize * 1024];

        FileOutputStream fos;
        try {
            fos =                       new FileOutputStream(
                                            getApplicationInfo().dataDir + File.separator + fileName
                                        );

        } catch (FileNotFoundException e) {
            e.printStackTrace();
            return false;
        }

        BufferedOutputStream bos =      new BufferedOutputStream(fos);
        DataInputStream dis;
        DataOutputStream dosTestConnect;

        try {
            dis =                       new DataInputStream(fileSocket.getInputStream());
            dosTestConnect =            new DataOutputStream(fileSocket.getOutputStream());
        } catch (IOException e) {
            e.printStackTrace();
            return false;
        }

        int sizeRead;

        try {

            while ((sizeRead = dis.read(buffer, 0, buffer.length)) != -1) {

                sizeSend +=             sizeRead;
                bos.write(buffer, 0, sizeRead);
                bos.flush();

                intent.putExtra(MainActivity.PI_SIZE_SEND, sizeSend);
                sendBroadcast(intent);

                if (sizeSend == sizeFile) {

                    dosTestConnect.write(1);
                    dosTestConnect.flush();

                    int count =         this.count + 1;

                    intent.putExtra(MainActivity.PI_COUNT, count);
                    sendBroadcast(intent);

                    sizeFile =          0;
                    sizeSend =          0;

                    break;
                }

                if(sizeSend > sizeFile) {
                    dosTestConnect.write(0);
                    dosTestConnect.flush();
                    return false;
                }

            }

        } catch (IOException e) {
            e.printStackTrace();
            try {
                dosTestConnect.write(0);
                dosTestConnect.flush();
            } catch (IOException e1) {
                e1.printStackTrace();
            }
            return false;
        }

        return true;
    }



Сервер:
Код: 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.
    private boolean sendFiles(ArrayList<String> listNewFiles, PrintWriter out) {

        Socket sendFileClient;

        try {
            sendFileClient =                                serverFile.accept();
        } catch (IOException e) {
            e.printStackTrace();
            return false;
        }


        for (String newFile : listNewFiles) {

            String tmpPath =                                Root.COBA_PATH_NAME + File.separator + deviceId;
            File fileName =                                 new File(tmpPath + File.separator + newFile);

            ImgEncode
                    .getInstance(newFile, Root.COBA_PATH_NAME, tmpPath)
                    .encodeImg();

            out.println(newFile);
            out.flush();

            out.println(fileName.length());
            out.flush();

            FileInputStream fis;

            try {
                fis =                                       new FileInputStream(fileName);
            } catch (FileNotFoundException e) {
                try {
                    fis =                                   new FileInputStream(fileName);
                } catch (FileNotFoundException e1) {
                    try {
                        fis =                               new FileInputStream(fileName);
                    } catch (FileNotFoundException e2) {
                        e2.printStackTrace();
                        return false;
                    }
                }
            }

            BufferedInputStream bis =                       new BufferedInputStream(fis);
            DataOutputStream dos;
            DataInputStream disTestConnect;

            try {
                dos =                                       new DataOutputStream(sendFileClient.getOutputStream());
            } catch (IOException e) {
                try {
                    dos =                                   new DataOutputStream(sendFileClient.getOutputStream());
                } catch (IOException e1) {
                    try {
                        dos =                               new DataOutputStream(sendFileClient.getOutputStream());
                    } catch (IOException e2) {
                        e2.printStackTrace();
                        return false;
                    }
                }
            }

            try {
                disTestConnect =                            new DataInputStream(sendFileClient.getInputStream());
            } catch (IOException e) {
                try {
                    disTestConnect =                        new DataInputStream(sendFileClient.getInputStream());
                } catch (IOException e1) {
                    try {
                        disTestConnect =                    new DataInputStream(sendFileClient.getInputStream());
                    } catch (IOException e2) {
                        e2.printStackTrace();
                        return false;
                    }
                }
            }

            byte[] buffer =                     new byte[Root.BUFFER_SIZE * 1024];
            int count;


            try {

                while ((count = bis.read(buffer, 0, buffer.length)) != -1) {

                    dos.write(buffer, 0, count);
                    dos.flush();

                }

                int result =                    disTestConnect.read();

                if(result == 0) {
                    return false;
                }

            } catch (IOException e) {
                e.printStackTrace();
            } finally {

                try {
                    fis.close();
                    if (!fileName.delete()) {
                        System.out.println(deviceId + ": ОШИБКА УДАЛЕНИЯ ВРЕМЕННОГО ФАЙЛА");
                    }
                } catch (IOException e) {
                    e.printStackTrace();
                }

            }

        }


        if(sendFileClient != null) {
            try {
                sendFileClient.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }

        return true;

    }
...
Рейтинг: 0 / 0
23.11.2015, 13:41
    #39110934
вадя
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Подскажите по передаче файлов через сокеты
используй websocket, и тебя не будут мучать пустяки....
там уже всё решено и сделано...
http://java-websocket.org/
...
Рейтинг: 0 / 0
24.11.2015, 07:22
    #39111607
bobo96
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Подскажите по передаче файлов через сокеты
вадяиспользуй websocket, и тебя не будут мучать пустяки....
там уже всё решено и сделано...
http://java-websocket.org/
Спасибо за совет.
Прям таки все это сделано ?
А где тогда чуть больше информации по использованию этой библиотеки найти ? На этом сайте только ссылка на github, а там только пример с чатом. Или плохо смотрел ?
...
Рейтинг: 0 / 0
24.11.2015, 07:33
    #39111612
вадя
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Подскажите по передаче файлов через сокеты
bobo96,
вот https://learn.javascript.ru/websockets
описание протокола ,
в той библиотеке есть пример и для андроида . в ws предусмотрено прямо таки всё из твоего описания.
...
Рейтинг: 0 / 0
24.11.2015, 07:36
    #39111614
вадя
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Подскажите по передаче файлов через сокеты
если заинтересует могу дать пример применения. идля передачи бинарных и текстовых данных.
...
Рейтинг: 0 / 0
24.11.2015, 08:05
    #39111624
bobo96
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Подскажите по передаче файлов через сокеты
вадяесли заинтересует могу дать пример применения. идля передачи бинарных и текстовых данных.
Было бы здорово!
...
Рейтинг: 0 / 0
24.11.2015, 10:13
    #39111751
вадя
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Подскажите по передаче файлов через сокеты
bobo96,
мыло в профиле
...
Рейтинг: 0 / 0
24.11.2015, 10:27
    #39111779
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Подскажите по передаче файлов через сокеты
bobo96Так же хотелось бы услышать советы, как правильно организовать отлов ошибок на предмет разрыва соединения, падения клиента или сервера с возможностью последующей докачки.

HTTP и FTP уже давным давно изобрели. Зачем свой лисапед городить.

bobo96Ну и было бы здорово, если бы уважаемое сообщество просто поругала код. Заранее благодарю!

Код - обнять и плакать. Тот случай, когда берется какой-нибудь Apache Commons IOUtils и 80% кода выкидывается.

Код: 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.
        byte[] buffer =                 new byte[bufferSize * 1024]; //BufferedInputStream/BufferedOutputStream это уже умеют. Зачем свой буфер?

        FileOutputStream fos;
        try {
            fos =                       new FileOutputStream(
                                            getApplicationInfo().dataDir + File.separator + fileName //Не используйте конкатенацию. Исползуйте IO File, NIO Path API
                                        );

        } catch (FileNotFoundException e) {
            e.printStackTrace();
            return false; //Вся секция выкидывается нафиг и меняется на File.exists() и File.canWrite()
        }

        BufferedOutputStream bos =      new BufferedOutputStream(fos); //Почему без try with resource?
        DataInputStream dis;
        DataOutputStream dosTestConnect;

        try {
            dis =                       new DataInputStream(fileSocket.getInputStream()); //Где ж вы постоянно эти Data...Stream находите, когда они вам нафиг не нужны???
            dosTestConnect =            new DataOutputStream(fileSocket.getOutputStream());
        } catch (IOException e) {
            e.printStackTrace();
            return false; //Замена исключения на return code пагубная практика.
        }

        int sizeRead;

        try {

            while ((sizeRead = dis.read(buffer, 0, buffer.length)) != -1) { //У вас уже BufferedOutputStream но вы ещё один буфер на него нагородили.

                sizeSend +=             sizeRead;
                bos.write(buffer, 0, sizeRead);
                bos.flush();

                intent.putExtra(MainActivity.PI_SIZE_SEND, sizeSend);
                sendBroadcast(intent);

                if (sizeSend == sizeFile) { //Корявый английский. Не понятно это size to send или size sent.

                    dosTestConnect.write(1);
                    dosTestConnect.flush();

                    int count =         this.count + 1;

                    intent.putExtra(MainActivity.PI_COUNT, count);
                    sendBroadcast(intent);

                    sizeFile =          0;
                    sizeSend =          0;

                    break;
                }

                if(sizeSend > sizeFile) {
                    dosTestConnect.write(0);
                    dosTestConnect.flush();
                    return false;
                }

            }

        } catch (IOException e) {
            e.printStackTrace();
            try {
                dosTestConnect.write(0);
                dosTestConnect.flush();
            } catch (IOException e1) {
                e1.printStackTrace();
            }
            return false;
        }

        return true;
    }



Сервер:
Код: 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.
    private boolean sendFiles(ArrayList<String> listNewFiles, PrintWriter out) {

        Socket sendFileClient;

        try {
            sendFileClient =                                serverFile.accept();
        } catch (IOException e) {
            e.printStackTrace();
            return false;
        }


        for (String newFile : listNewFiles) {

            String tmpPath =                                Root.COBA_PATH_NAME + File.separator + deviceId;
            File fileName =                                 new File(tmpPath + File.separator + newFile);

            ImgEncode
                    .getInstance(newFile, Root.COBA_PATH_NAME, tmpPath)
                    .encodeImg();

            out.println(newFile);
            out.flush();

            out.println(fileName.length());
            out.flush();

            FileInputStream fis;
            ///WTF???
            try {
                fis =                                       new FileInputStream(fileName);
            } catch (FileNotFoundException e) {
                try {
                    fis =                                   new FileInputStream(fileName);
                } catch (FileNotFoundException e1) {
                    try {
                        fis =                               new FileInputStream(fileName);
                    } catch (FileNotFoundException e2) {
                        e2.printStackTrace();
                        return false;
                    }
                }
            }

            BufferedInputStream bis =                       new BufferedInputStream(fis); //try with resource!!
            DataOutputStream dos;
            DataInputStream disTestConnect;

            ///WTF???
            try {
                dos =                                       new DataOutputStream(sendFileClient.getOutputStream());
            } catch (IOException e) {
                try {
                    dos =                                   new DataOutputStream(sendFileClient.getOutputStream());
                } catch (IOException e1) {
                    try {
                        dos =                               new DataOutputStream(sendFileClient.getOutputStream());
                    } catch (IOException e2) {
                        e2.printStackTrace();
                        return false;
                    }
                }
            }

            //OMFG!!
            try {
                disTestConnect =                            new DataInputStream(sendFileClient.getInputStream());
            } catch (IOException e) {
                try {
                    disTestConnect =                        new DataInputStream(sendFileClient.getInputStream());
                } catch (IOException e1) {
                    try {
                        disTestConnect =                    new DataInputStream(sendFileClient.getInputStream());
                    } catch (IOException e2) {
                        e2.printStackTrace();
                        return false;
                    }
                }
            }

            byte[] buffer =                     new byte[Root.BUFFER_SIZE * 1024];
            int count;


            try {

                while ((count = bis.read(buffer, 0, buffer.length)) != -1) {

                    dos.write(buffer, 0, count);
                    dos.flush();

                }

                int result =                    disTestConnect.read();

                if(result == 0) {
                    return false;
                }

            } catch (IOException e) {
                e.printStackTrace();
            } finally {

                try {
                    fis.close();
                    if (!fileName.delete()) { //Если использовать NIO API для работы с файлами, то можно получить исключение с внятным текстом ошибки из ОС
                        System.out.println(deviceId + ": ОШИБКА УДАЛЕНИЯ ВРЕМЕННОГО ФАЙЛА");
                    }
                } catch (IOException e) {
                    e.printStackTrace();
                }

            }

        }


        if(sendFileClient != null) {
            try {
                sendFileClient.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }

        return true;

    }



Помимо замечаний указаных выше, много косяков с инкапсуляцией и Single Responsibility Principle. Методы делают много всего и сразу. И копируют и перекачивают и кодируют и знают какие-то конфигурационные директории и т.п. Код получается сильно сцепленным.
...
Рейтинг: 0 / 0
24.11.2015, 11:13
    #39111844
bobo96
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Подскажите по передаче файлов через сокеты
Blazkowicz,

Спасибо!
А вы можете посоветовать библиотеки для работы с сокетами, наподобие той, что посоветовал Вадя ?
...
Рейтинг: 0 / 0
15.12.2015, 16:38
    #39128812
bobo96
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Подскажите по передаче файлов через сокеты
Апну тему.


Код: 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.
    public static void main(String[] args) {

        SystemTrayIcon.createTrayIcon();

        ExecutorService executorService =                               null;

        try(ServerSocket serverSocket = new ServerSocket(Settings.getInstance().getConnectPort());
            ServerSocket serverFileSocket = new ServerSocket(Settings.getInstance().getConnectPortFiles())) {

            executorService =                                           Executors.newCachedThreadPool();

            System.out.println("Сервер запущен");

            while (true) {
                executorService.submit(new ClientConnectThread(serverSocket.accept(), serverFileSocket));
            }

        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if(executorService != null) {
                executorService.shutdown();
            }
        }

    }




Сервер "слушает" 2 порта и при подключении клиента создается для него отдельный поток, в конструктор класса которого передаются ссылка на сам сокет (serverSocket.accept()) и ссылка на объект ServerSocket, который слушает второй порт.
В дальнейшем этот объект ServerSocket в своем потоке несколько раз используется для создания еще одного подключения на второй порт для непосредственно передачи файла(-ов).
Вопрос в следующем: получается же, что несколько потоков при создании подключения (serverFileSocket.accept()) обращаются к одному и тому же объекту ? Нужно ли создание этого подключения засовывать в синхронизированный блок или еще какие действия выполнять ?
Почему спрашиваю: сегодня обнаружил, что при передаче файлов одному из клиентов у того по всей видимости отвалился интернет и сервер выплюнул "socket write error". Через некоторое время подключился второй клиент, но завис и не смог получить доступ к сокету, который выдал socket write error, помогла только перезагрузка программы.
...
Рейтинг: 0 / 0
15.12.2015, 16:53
    #39128843
Petro123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Подскажите по передаче файлов через сокеты
bobo96сегодня обнаружил, что при передаче файлов одному из клиентов у того по всей видимости отвалился интернет
я так понимаю, вы пишите сокет-сервер
https://www.google.ru/search?q=socet ыукмук&ie=utf-8&oe=utf-8&gws_rd=cr&ei=zBpwVreSKIXRswGI7KLQCw#newwindow=1&q=socket server
- конечно он должен обработать все события. В том числе и потеря коннекта.
...
Рейтинг: 0 / 0
15.12.2015, 17:01
    #39128853
bobo96
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Подскажите по передаче файлов через сокеты
Понимаю.
Вот функция, которая непосредственно занимается передачей файлов:

Код: 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.
    private boolean sendFiles(ArrayList<String> listNewFiles, PrintWriter out) {

        System.out.println(deviceId + ": Получен запрос на скачивание");

        Socket fileSocket;

        try {
            fileSocket =                                                serverFileSocket.accept();
        } catch (IOException e) {
            System.out.println(deviceId + ": ОШИБКА ПОДКЛЮЧЕНИЯ 6667");
            return false;
        }


        try {
            fileSocket.setSoTimeout(Settings.getInstance().getAcceptTimeOut());
        } catch (SocketException e) {
            e.printStackTrace();
        }



        for (String newFile : listNewFiles) {

            String tmpPath =                                            Settings.getInstance().getFilesPath() + File.separator + deviceId;
            File fileName =                                             new File(tmpPath + File.separator + newFile);

            ImgEncode
                    .getInstance(newFile, Settings.getInstance().getFilesPath(), tmpPath)
                    .encodeImg();

            out.println(newFile);
            out.println(fileName.length());

            FileInputStream fis;

            try {
                fis =                                       new FileInputStream(fileName);
            } catch (FileNotFoundException e) {
                e.printStackTrace();
                return false;
            }

            BufferedInputStream bis =                       new BufferedInputStream(fis);
            DataOutputStream dos;
            DataInputStream disTestConnect;

            try {
                dos =                                       new DataOutputStream(fileSocket.getOutputStream());
            } catch (IOException e) {
                e.printStackTrace();
                return false;
            }

            try {
                disTestConnect =                            new DataInputStream(fileSocket.getInputStream());
            } catch (IOException e) {
                e.printStackTrace();
                return false;
            }

            byte[] buffer =                                 new byte[Settings.getInstance().getBufferSize() * 1024];
            int count;


            try {

                while ((count = bis.read(buffer, 0, buffer.length)) != -1) {

                    dos.write(buffer, 0, count);
                    dos.flush();

                }

                int result =                                disTestConnect.read();

                if(result == 0) {
                    System.out.println(deviceId + ": " + newFile + " ОШИБКА ПЕРЕДАЧИ ФАЙЛА. result == 0");
                    try {
                        bis.close();
                        dos.close();
                        disTestConnect.close();
                        fileSocket.close();
                    } catch (IOException e1) {
                        e1.printStackTrace();
                    }
                    return false;
                }

                System.out.println(deviceId + ": Файл " + newFile + " передан");

            } catch (IOException e) {
                e.printStackTrace();
                System.out.println(deviceId + ": " + newFile + " ОШИБКА ПЕРЕДАЧИ ФАЙЛА");

                try {
                    bis.close();
                    dos.close();
                    disTestConnect.close();
                    fileSocket.close();
                } catch (IOException e1) {
                    e1.printStackTrace();
                }

                return false;
            } finally {

                try {
                    fis.close();
                    if (!fileName.delete()) {
                        System.out.println(deviceId + ": ОШИБКА УДАЛЕНИЯ ВРЕМЕННОГО ФАЙЛА");
                    }
                } catch (IOException e) {
                    e.printStackTrace();
                }

            }

        }

        try {
            fileSocket.close();
        } catch (IOException e) {
            System.out.println(deviceId + ": ОШИБКА ЗАКРЫТИЯ FILE-СОКЕТА");
        }

        return true;

    }




Она уже была в теме, я ее лишь немного после советов допилил.
В блоке catch вроде как все позакрывал, но, видимо, этого мало. Ну или я чего-то не понимаю :(
...
Рейтинг: 0 / 0
Форумы / Java [игнор отключен] [закрыт для гостей] / Подскажите по передаче файлов через сокеты / 12 сообщений из 12, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]