powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / Подскажите по передаче файлов через сокеты
12 сообщений из 12, страница 1 из 1
Подскажите по передаче файлов через сокеты
    #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
Подскажите по передаче файлов через сокеты
    #39110934
вадя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
используй websocket, и тебя не будут мучать пустяки....
там уже всё решено и сделано...
http://java-websocket.org/
...
Рейтинг: 0 / 0
Подскажите по передаче файлов через сокеты
    #39111607
bobo96
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
вадяиспользуй websocket, и тебя не будут мучать пустяки....
там уже всё решено и сделано...
http://java-websocket.org/
Спасибо за совет.
Прям таки все это сделано ?
А где тогда чуть больше информации по использованию этой библиотеки найти ? На этом сайте только ссылка на github, а там только пример с чатом. Или плохо смотрел ?
...
Рейтинг: 0 / 0
Подскажите по передаче файлов через сокеты
    #39111612
вадя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
bobo96,
вот https://learn.javascript.ru/websockets
описание протокола ,
в той библиотеке есть пример и для андроида . в ws предусмотрено прямо таки всё из твоего описания.
...
Рейтинг: 0 / 0
Подскажите по передаче файлов через сокеты
    #39111614
вадя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
если заинтересует могу дать пример применения. идля передачи бинарных и текстовых данных.
...
Рейтинг: 0 / 0
Подскажите по передаче файлов через сокеты
    #39111624
bobo96
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
вадяесли заинтересует могу дать пример применения. идля передачи бинарных и текстовых данных.
Было бы здорово!
...
Рейтинг: 0 / 0
Подскажите по передаче файлов через сокеты
    #39111751
вадя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
bobo96,
мыло в профиле
...
Рейтинг: 0 / 0
Подскажите по передаче файлов через сокеты
    #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
Подскажите по передаче файлов через сокеты
    #39111844
bobo96
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Blazkowicz,

Спасибо!
А вы можете посоветовать библиотеки для работы с сокетами, наподобие той, что посоветовал Вадя ?
...
Рейтинг: 0 / 0
Подскажите по передаче файлов через сокеты
    #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
Подскажите по передаче файлов через сокеты
    #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
Подскажите по передаче файлов через сокеты
    #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
12 сообщений из 12, страница 1 из 1
Форумы / Java [игнор отключен] [закрыт для гостей] / Подскажите по передаче файлов через сокеты
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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