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


Автор: #Maestro# 9.6.2009, 16:26
передаётся по сети файл , он приходит пустым - ошибка может быть как со стороны клиента, так и со стороны сервера?
Фрагмент кода клиента:
Код


  try {

       Socket s = new Socket("192.168.0.78", 8823);


        InputStream inputStream = new FileInputStream("C:\\workbook.xml ");
        InputStreamReader inputStreamReader = new InputStreamReader(inputStream,"UTF-8");

 BufferedReader input = new BufferedReader(new InputStreamReader(s.getInputStream()));


 SocketChannel channel = SocketChannel.open(new InetSocketAddress("192.168.0.78", 8823)); //ot sasha

       byte[] buf = new byte[255];
 int len = 0;

       try{
 // Write the output to a file
                OutputStream out = new FileOutputStream("temp/socketTest.xls");
                wb.write(out);

                out = Channels.newOutputStream(channel);
            Scanner in = new Scanner(inputStreamReader);

                 while ((len = inputStreamReader.read()) > 0)
             {
                  String line = in.nextLine();
                 out.write(buf);
                 out.flush();
             }

            s.close();
         }
           finally {s.close();}
      }
      catch (Exception e) {e.printStackTrace();}

Сервера 
Код

public void run()
    {
        try
    {

while (true)
        {
            ServerSocket s = new ServerSocket(8823);
            Socket incoming = s.accept();
            Runnable r = new TestServerHandler(incoming);
            Thread t = new Thread(r);
            t.start();
        }

    //Socket incoming = s.accept();

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

}
    class TestServerHandler implements Runnable
    {
        Socket incoming;
        public TestServerHandler(Socket incoming)
        {
            this.incoming = incoming;
        }

        public void run()
        {
            try
            {
            BufferedReader in = new BufferedReader(new InputStreamReader(incoming.getInputStream()));

 char[] buf = new char[255];

 OutputStream outputStream = new FileOutputStream("C:\\workbook.xml");
 //Приводим поток к потоку форматированного вывода
 OutputStreamWriter outStreamWriter = new OutputStreamWriter(outputStream, "UTF-8");

  String inS = incoming.getInetAddress().getLocalHost().toString();

 int len = 0;

 while (((len = in.read(buf))) > 0)
 {
     //Выводим в файл полученный пакет
     outStreamWriter.write(buf,0,255);
 }

 in.close();
 outStreamWriter.close();

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


прошу помочь. спосибо

Автор: LSD 9.6.2009, 18:26
Ты везде заводишь переменную len куда пишешь, сколько байт прочитано. Но дальше совершенно игнорируешь эту информацию. Почему?

Автор: #Maestro# 10.6.2009, 08:39
если честно - с переменной len это был пример, найденный в инете. а что с этой переменной следует сделать? подскажите!

Автор: GirroKepasso 10.6.2009, 11:58
Этот код у тебя компилируется?
Код запутаный - какая-то смесь из посимвольного, буферезированого и буферезированого с использованием Scaner , в добавок смешаны работа с блокирующими сокетами(Soket)  и асинхронными сокетами (SocketChanel) и  с ошибками и возможно не компилируется.
Видно , что путаница в методах read . Глянь документацию http://java.sun.com/javase/6/docs/api/java/io/InputStreamReader.html#read()
Без параметров read() возвращает прочитаный символ(тип integer), 
а вот если читать с параметрами read(buf, 0, bufSize) , то метод возвращает количество прочитаных символов, а сами символы записываються в buf.

На клиенте:
Код

 out = Channels.newOutputStream(channel);
            Scanner in = new Scanner(inputStreamReader); 
                 while ((len = inputStreamReader.read()) > 0) //inputStreamReader читаете по одному символу, присваивает символ в len (поэтому лучше назвать ее chr)
             {
                 String line = in.nextLine(); //читаем строку , но никуда ее не пишем
                 out.write(buf);   //отсылает buf , ты его только объявил , но ничего в него не присваивал 
                 out.flush();
             }



По сути если что-то и шлется, то это порции по 255 символов "00" (пустой масив buf)

Я бы посоветовал глянуть в официальном туториале про потоки ввода/вывода ,про работу с сетью , там есть и примеры. А потом вооружившись переписать код.
http://java.sun.com/docs/books/tutorial/essential/io/index.html
http://java.sun.com/docs/books/tutorial/networking/sockets/index.htm



Автор: #Maestro# 10.6.2009, 13:43
извинаюсь, "официальный туториал" это где такое? можно ссылку? был бы очень благодарен! 
кстати, а вот если как-то так, будет работать?
Код

try {
SocketChannel channel = SocketChannel.open(new InetSocketAddress("192.168.0.78", 23));

try{
FileOutputStream out = new FileOutputStream("temp/socketTest.xls");
wb.write(out);
out.flush();
//out.close();
//out = Channels.newOutputStream(channel);
}
//finally {s.close();}
}
catch (Exception e) {e.printStackTrace();}

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