Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java: Работа с сетью > Сокеты


Автор: Sherst 2.2.2006, 19:37
Привет всем!
Проверьте пожайлуста код. Пытаюсь передать gif-файл от сервера клиенту, но ничего не получается.


Клиент
package untitled8;

Код


import java.io.*;
import java.net.*;

public class Frame1 {
  public static void main(String[] args){
    FileOutputStream fis = null;
    try{
      ///////////////////
      Socket s = new Socket("localhost", 8189);
      DataInputStream dataIn = new DataInputStream(new BufferedInputStream(s.getInputStream()));
      DataOutputStream dataOut = new DataOutputStream(new BufferedOutputStream(s.getOutputStream()));
      ///////////////////
      fis = new FileOutputStream("D:\\Image1.gif");
      while (dataIn.read() != -1) {
        fis.write(dataIn.readByte());
      }
      ///////////////////
      dataIn.close();
      dataOut.close();
      s.close();
    }
    catch(IOException i){
      System.err.println(i.toString());
    }
    finally{
      try{
        if (fis!=null){
          fis.close();
        }
      }
      catch(IOException er){
        System.err.println(er);
      }
    }
  }
}



Сервер
Код


package localnetwork;

import java.io.*;
import java.net.*;

public class Server {
  public static void main(String[] args){
    FileInputStream fis = null;

    try {
      ServerSocket ss = new ServerSocket(8189);
      Socket incoming = ss.accept(); //Ожидаем подключение клиента к заданному порту
      DataInputStream dataIn = new DataInputStream(new BufferedInputStream(incoming.getInputStream()));
      DataOutputStream dataOut = new DataOutputStream(new BufferedOutputStream(incoming.getOutputStream()));
      ////////////////////////////////
      ByteArrayOutputStream baos = new ByteArrayOutputStream();
      File f = new File("C:\\Image1.gif");
      fis = new FileInputStream(f);
      byte[] buf = new byte[1024];
      int readed;
      while ((readed = fis.read(buf)) != -1) {
        baos.write(buf, 0, readed);
      }
      dataOut.write(baos.toByteArray());
      ////////////////////////////////
      dataIn.close();
      dataOut.close();
      incoming.close();
      ss.close();
    }
    catch(Exception ex) {
      System.err.println(ex.toString());
    }
    finally{
      try{
        if (fis!=null){
          fis.close();
        }
      }
      catch(IOException er){
        System.err.println(er);
      }
    }
    //********************************************************************************//
  }
}


Заранее спасибо.


Автор: LSD 2.2.2006, 20:35
Ошибка в Frame1 строки 15-16, ты вначале читаешь байт и теряешь его, потом читаешь следующий. Т.е у тебя файл пишется через байт.

И зачем все так усложнять, ведь можно это все проще реализовать.

Автор: LSD 2.2.2006, 21:03
Код
import java.io.*;
import java.net.Socket;

public class Frame1
{
  public static void main(String[] args)
  {
    FileOutputStream fis = null;
    try
    {
      Socket socket = new Socket("localhost", 8189);
      InputStream socketIn = socket.getInputStream();

      fis = new FileOutputStream("new_arh.rar");
      byte[] buffer = new byte[64 * 1024];
      int read;
      while((read = socketIn.read(buffer)) != -1)
        fis.write(buffer, 0, read);

      socket.close();
    }
    catch(IOException ex)
    {
      ex.printStackTrace();
    }
    finally
    {
      try
      {
        if(fis != null)
          fis.close();
      }
      catch(IOException ex)
      {
        ex.printStackTrace();
      }
    }
  }
}

Код
import java.io.*;
import java.net.*;

public class Server
{
  public static void main(String[] args)
  {
    FileInputStream fis = null;
    try
    {
      ServerSocket serverSocket = new ServerSocket(8189);
      Socket socket = serverSocket.accept();
      OutputStream socketOut = socket.getOutputStream();

      fis = new FileInputStream("arh.rar");
      byte[] buffer = new byte[64 * 1024];
      int read;
      while((read = fis.read(buffer)) != -1)
        socketOut.write(buffer, 0, read);

      socket.close();
      serverSocket.close();
    }
    catch(Exception ex)
    {
      ex.printStackTrace();
    }
    finally
    {
      try
      {
        if(fis != null)
          fis.close();
      }
      catch(IOException ex)
      {
        ex.printStackTrace();
      }
    }
  }
}


Автор: Sherst 2.2.2006, 22:16
to LSD
Спасибо, в который раз меня выручил smile

Автор: LSD 2.2.2006, 22:20
Пожалуйста smile

Автор: x4444 7.2.2006, 17:25
А почему сначала сокет закрываешь, а потом файлстрим?

А сокетстрим вообще явно не закрываешь?

Вроде по принципу матрешки надо закрывать.

Автор: Sherst 7.2.2006, 21:20
TO x4444
Но это же пример. Ведь основная идея была в уяснении процесса обмена файлами...

Автор: LSD 7.2.2006, 21:52
Цитата(x4444 @ 7.2.2006, 17:25 Найти цитируемый пост)
А почему сначала сокет закрываешь, а потом файлстрим?

Они независимы, поэтому порядок не важен. В реальном приложении надо будет каждый закрывать в своем блоке try/catch.

Цитата(x4444 @ 7.2.2006, 17:25 Найти цитируемый пост)
А сокетстрим вообще явно не закрываешь?

Вроде по принципу матрешки надо закрывать.

В этом нет необходимости, он закрывается сокетом. Например если использовать комбинацию InputStreamReader+FileInputStream, то закрывать достаточно только Reader.

Автор: x4444 8.2.2006, 13:20
т.е. в цепочке стримов достаточно закрыть самый верхний, а нижние он сам закроет?

например, в этой (чито гипотетической) цепочке достаточно к конце концов закрыть StringReader?
FileInputStream --> BufferedInputStream --> InputStreamReader --> BufferedReader --> StringReader

Автор: LSD 8.2.2006, 15:02
Цитата(x4444 @ 8.2.2006, 13:20 Найти цитируемый пост)
т.е. в цепочке стримов достаточно закрыть самый верхний, а нижние он сам закроет?

Зависит от реализации. В Sun-овских класса именно так и сделано.

Цитата(x4444 @ 8.2.2006, 13:20 Найти цитируемый пост)
например, в этой (чито гипотетической) цепочке достаточно к конце концов закрыть StringReader?
FileInputStream --> BufferedInputStream --> InputStreamReader --> BufferedReader --> StringReader

Это не цепочка, BufferedReader читает из строки, а не из Reader-а.
В такой цепочке: FileInputStream --> BufferedInputStream --> InputStreamReader --> BufferedReader достаточно закрыть BufferedReader.

Автор: x4444 8.2.2006, 23:32
Цитата(LSD @ 8.2.2006, 15:02 Найти цитируемый пост)

Это не цепочка, BufferedReader читает из строки, а не из Reader-а.

да точно, только не BufferedReader, a StringReader имелся ввиду.

Автор: LSD 8.2.2006, 23:43
Цитата(x4444 @ 8.2.2006, 23:32 Найти цитируемый пост)
да точно, только не BufferedReader, a StringReader имелся ввиду.

Угу, опечатался.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)