Файл, переданный через сокет: содержимое пусто - PullRequest
0 голосов
/ 24 ноября 2011

Я работаю над передачей файла между двумя компьютерами через сокет. Кажется, все работает, но когда я смотрю на содержимое найденного файла, он пуст. Что я делаю не так?

Вот мой код на стороне сервера. Файл foobar.txt существует, и его содержимое - «Привет, мир!».

try{ 
    ServerSocket ssock = new ServerSocket(12345);
    Socket sock = ssock.accept();
    //here I get the filename from the client, but that works fine.
    File myFile = new File("foobar.txt");
    byte[] mybytearray = new byte[(int) myFile.length()];
    BufferedInputStream bis = new BufferedInputStream(new FileInputStream(myFile));
    bis.read(mybytearray, 0, mybytearray.length);
    OutputStream os = sock.getOutputStream();
    os.write(mybytearray, 0, mybytearray.length);
    os.flush();
    sock.close();
} catch (Exception e){
    e.printStackTrace();
}

А вот мой код клиента:

try {
    Socket socket = new Socket(host, port);
    PrintWriter out = new PrintWriter(socket.getOutputStream(), true);
    out.print("get foobar.txt\r\n");
    out.flush();
    byte[] streamIn = new byte[1024];
    InputStream in = socket.getInputStream();
    FileOutputStream file_src = new FileOutputStream("foobar.txt"); 
    BufferedOutputStream file_writer = new BufferedOutputStream(file_src);
    int i;
    while ((i = in.read()) != -1) {
        file_writer.write(i);
    }
    file_writer.flush();
    file_writer.close();
    file_src.close();
    socket.close();
} catch (Exception e) {
   e.printStackTrace();
}

решаемые

Поскольку я использую несколько потоков и несколько сокетов и тестирую все соединения на одном компьютере, я просто столкнулся с проблемой, когда клиент (в котором есть и код клиента, и серверный код) будет соединяться с самим собой, а не с другим клиент. Изменение порта передачи файлов для разных работающих клиентов заставило все это работать. Спасибо всем, кто взглянул на это и дал мне несколько советов.

Ответы [ 3 ]

1 голос
/ 24 ноября 2011

Возможно, вы закрываете неправильный сокет на клиенте.Когда вы закрываете сокет, вы закрываете поле класса this.socket вместо локальной переменной socket.

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

Еще одна вещь - вам не нужно очищать выходной поток перед его закрытием.При вызове close() поток автоматически очищается.

0 голосов
/ 25 ноября 2011

В дополнение к тому, что сказали все остальные, вы игнорируете результат bis.read (). Заполнение буфера не гарантируется. См. Javadoc.

Правильный способ копирования потоков в Java, который вы должны использовать с обоих концов, заключается в следующем:

byte[] buffer = new byte[8192]; // or whatever
int count;
while ((count = in.read(buffer)) > 0)
{
  out.write(buffer, 0, count);
}
0 голосов
/ 24 ноября 2011

Единственное, о чем я думаю, это то, что вы на самом деле никогда не начинаете получать файл, потому что серверная сторона не читает команду ("get foobar.txt"), поэтому клиентская сторона зависает при отправке команды.

Наличие файла на стороне клиента может быть из предыдущих тестов.

Но я не уверен, что это проблема.Это просто попытка помочь.

...