Java клиент / сервер Передача файлов с проблемой многопоточности - PullRequest
0 голосов
/ 27 июня 2011

Я хочу создать простой ускоритель загрузки.

Как это работает

  1. Сервер ожидает входящего соединения.
  2. Клиент подключается к серверу.
  3. Затем сервер отправляет клиенту размер файла и ожидает подключения для загрузки.
  4. Клиент получил размер файла, затем создает поток загрузки, и эти потоки подключаются к серверу.
  5. После того, как сервер получил соединение от каждого потока, сервер будет ожидать начала и конца файла смещения из потока.
  6. Каждый поток отправляет файл смещения начала и конца на сервер.
  7. После того как сервер получил смещения, сервер отправит часть файла в поток.
  8. Каждый поток будет читать и записывать в файл. Например, buffer.p01, buffer.p02, buffer.p03
  9. Клиент объединяет все файлы в один порядок файлов по порядку. ( Еще не реализовано )

Я думаю, что на стороне сервера это работает правильно, но на стороне клиента это имеет некоторые проблемы.

Проблема в том, что если я установлю MAXTHREAD на 1, он будет работать правильно. Но если я установлю более одного, он застрянет где-то навсегда.

Это код на стороне сервера .. http://pastebin.com/TEakGB0c

и это код на стороне клиента с многопоточностью http://pastebin.com/wKhP7DxS

Спасибо.

Ответы [ 3 ]

1 голос
/ 27 июня 2011

У вас довольно большая очевидная проблема.Метод accept ServerSocket каждый раз возвращает новый сокет.В коде вашего сервера здесь

initSocket = servSock.accept();

initSocket - это поле члена класса, которое означает, что вы перезаписываете старый сокет и никогда не закрываете его.Вы должны начать новый поток для обработки этого сокета, и, как я вижу, похоже, что вы просто продолжаете использовать один и тот же сокет.Это не сработает.Посмотрите учебники о том, как открыть сокеты.Извините, я не могу помочь больше, но здесь происходит много вещей, которые просто не сработают.Может быть, вы можете сосредоточиться на части кода, и мы можем помочь больше.

0 голосов
/ 14 сентября 2014
Please close your OutputStream os 

Sending u a snippet


public static boolean sendFile() {
        int start = Integer.parseInt(startAndEnd[0]) - 1;
        int end = Integer.parseInt(startAndEnd[1]) - 1;
        int size = (end - start) + 1;
        try {
            os = initSocket.getOutputStream();
            os.write(byteArr, start, size);
            os.flush();
            System.out.println("Send file to : " + initSocket);
        } catch (IOException e) {
            System.out.println(e.getLocalizedMessage());
            disconnected();
            return false;
        } finally {
            if (os != null) {
                try {
                    os.close();
                } catch (IOException ex) {
                    Logger.getLogger(FileServer.class.getName()).log(Level.SEVERE, null, ex);
                }
            }
        }
        return true;
    }
0 голосов
/ 04 июля 2011

Я согласен, это может быть небольшая проблема, или она может быть большой, пример кода поможет нам помочь вам. Если вы попытаетесь подключиться к серверу 3 раза через один и тот же порт, вы получите ошибку, потому что выможет иметь только 1 соединение на порт, проблема может быть очень простой или очень сложной, если вы отредактируете свое сообщение и добавите свой код, тогда мы сможем вам лучше помочь.

...