Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Java [игнор отключен] [закрыт для гостей] / Ошибка при записи данных в сокет / 10 сообщений из 10, страница 1 из 1
19.02.2007, 15:50:52
    #34341415
spirit83
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ошибка при записи данных в сокет
Добрый день!

Есть следующий тестовый код:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
 class  Client {

     public   static   void  main(String args[]) {
         try  {
             Socket s =  new  Socket("127.0.0.1",  21 );

              byte  testbytes[] =  new   byte [ 100000 ];
              for  ( int  i =  0 ; i < testbytes.length; i++) {
                 testbytes[i] =  56 ;
             }
             // исходящий поток
             OutputStream printout = s.getOutputStream();
             printout.write(testbytes);
             printout.flush();

        }
         catch  (Exception e) {
            e.printStackTrace();
        } // вывод исключений
    }    

Когда размер тестового массива 100000 все нормально данные уходят на тестовый сервер, но если
размер к примеру увеличивается до 200000, то при записи данных вот такая ошибка:
Код: plaintext
1.
2.
3.
4.
5.
     java.net.SocketException: Connection reset by peer: socket write error
	at java.net.SocketOutputStream.socketWrite0( Native  Method)
	at java.net.SocketOutputStream.socketWrite(SocketOutputStream.java: 92 )
	at java.net.SocketOutputStream.write(SocketOutputStream.java: 124 )
	at Client.main(Client.java: 22 )
Из-за чего такое происходит и как это можно попобороть?

Заранее спасибо.
...
Рейтинг: 0 / 0
19.02.2007, 16:08:56
    #34341511
Kachalov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ошибка при записи данных в сокет
Скорее всего ограничение на количество сетевых соединений. Я всегда считал что возможное количество одновременных сетевых соединений с серверным сокетом, если не задано специальных ограничений, 65 тыс. Возможно я не прав.
...
Рейтинг: 0 / 0
19.02.2007, 16:33:26
    #34341624
am_sasa
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ошибка при записи данных в сокет
KachalovСкорее всего ограничение на количество сетевых соединений. Я всегда считал что возможное количество одновременных сетевых соединений с серверным сокетом, если не задано специальных ограничений, 65 тыс. Возможно я не прав. не прав, зависит от ОС и настраивается обычно в ядре.

Грохается у тебя сервер, ftp?
...
Рейтинг: 0 / 0
19.02.2007, 17:30:33
    #34341904
spirit83
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ошибка при записи данных в сокет
am_sasa KachalovСкорее всего ограничение на количество сетевых соединений. Я всегда считал что возможное количество одновременных сетевых соединений с серверным сокетом, если не задано специальных ограничений, 65 тыс. Возможно я не прав. не прав, зависит от ОС и настраивается обычно в ядре.

Грохается у тебя сервер, ftp?

Нет на сервере все ок, он продолжает обарабытывать запросы. Никаких ошибок на нем нет. Ошибка именно на клиентской части.
...
Рейтинг: 0 / 0
19.02.2007, 17:36:03
    #34341929
spirit83
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ошибка при записи данных в сокет
На всякий случай вот код тестового сервера (в нем ничего сверхестественного нет):

Код: plaintext
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.
 import  java.io.*;
 import  java.net.*;

 class  Server  extends  Thread {

    Socket s;
     int  num;

     public   static   void  main(String args[]) {
         try  {
             int  i =  0 ; // счётчик подключений

            ServerSocket server =  new  ServerSocket( 21 ,  0 , InetAddress.getByName("localhost"));
            System.out.println("server is started");
            // слушаем порт
             while  (true) {
                 new  Server(i, server.accept());
                i++;
            }
        }  catch  (Exception e) {
            System.out.println("init error: " + e);
        }
    }

     public  Server( int  num, Socket s) {
        // копируем данные
         this .num = num;
         this .s = s;

        // и запускаем новый вычислительный поток (см. ф-ю run())
        setDaemon(true);
        setPriority(NORM_PRIORITY);
        start();
    }

     public   void  run() {
         try  {
            // из сокета клиента берём поток входящих данных
            InputStream is = s.getInputStream();
            // и оттуда же - поток данных от сервера к клиенту
            OutputStream os = s.getOutputStream();

            // буффер данных в 64 килобайта
             byte  buf[] =  new   byte [ 64  *  1024 ];
            // читаем 64кб от клиента, результат - кол-во реально принятых данных
             int  r = is.read(buf);

            // создаём строку, содержащую полученную от клиента информацию
            String data =  new  String(buf,  0 , r);

            System.out.println("data from emulator:" + data);
            
            // завершаем соединение
            s.close();
        }
         catch  (Exception e) {
            System.out.println(e);
        }
    }
}
...
Рейтинг: 0 / 0
19.02.2007, 18:39:10
    #34342131
am_sasa
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ошибка при записи данных в сокет
для теста мож и ничего, но так...
попробуй в цикле почитать этот кусок, тогда все будет ОК! но скорее всего сервер будет висеть до бесконечности... протокол будет нужен))))
Код: plaintext
1.
2.
3.
4.
5.
 int  r = is.read(buf);

// создаём строку, содержащую полученную от клиента информацию
String data =  new  String(buf,  0 , r);

System.out.println("data from emulator:" + data);
...
Рейтинг: 0 / 0
19.02.2007, 18:45:17
    #34342151
Kachalov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ошибка при записи данных в сокет
Прошу прощения - невнимательно посмотрел на код клиента (мне показалось, что сокеты создаются в цикле).
А зачем вам писать блок в 200000 байт, пишите в цикле по байту, чтобы не происходило переполнение буфера:
Код: plaintext
1.
2.
3.
4.
5.
OutputStream printout = s.getOutputStream();
 for  ( int  i =  0 ; i <  200000 ; i++) {
    printout.write( 56 );
    printout.flush();
}
...
Рейтинг: 0 / 0
20.02.2007, 10:27:04
    #34342993
spirit83
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ошибка при записи данных в сокет
KachalovПрошу прощения - невнимательно посмотрел на код клиента (мне показалось, что сокеты создаются в цикле).
А зачем вам писать блок в 200000 байт, пишите в цикле по байту, чтобы не происходило переполнение буфера:
Код: plaintext
1.
2.
3.
4.
5.
OutputStream printout = s.getOutputStream();
 for  ( int  i =  0 ; i <  200000 ; i++) {
    printout.write( 56 );
    printout.flush();
}


Это понятно, что одним из решений проблемы является уменьшение размера блока. А не могли бы Вы по подробней написать о переполнении буфера, или где можно об этом почитать?
...
Рейтинг: 0 / 0
20.02.2007, 10:45:44
    #34343076
am_sasa
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ошибка при записи данных в сокет
spirit83
Это понятно, что одним из решений проблемы является уменьшение размера блока. А не могли бы Вы по подробней написать о переполнении буфера, или где можно об этом почитать? эт он пошутил)) переполнения в ПОТОКЕ не бывает! клиент с сервером д.б. отрабатывать единый протокол, вот сделай его и все будет ок! передаешь 1000000000 в клиенте, тогда на сервере стока и читай, а то у тебя стоит слозе после 64К, вот и слиент получает по лбу!
чини сервер!
...
Рейтинг: 0 / 0
20.02.2007, 11:43:38
    #34343265
Kachalov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ошибка при записи данных в сокет
am_sasaэт он пошутил)) переполнения в ПОТОКЕ не бывает!
- вообще то, нет, не шутил :) Ошибка в клиенте происходит из за попытки записать в поток блок длиной 200000 байт (одновременно), который не влазит в буфер native-метода, соответствующего методу write() в OutputStream-е. А вот если разбить этот блок на небольшие части и стравливать их в поток по очереди, то тогда действительно, проблема исчезнет. Т. е. переполнение происходит не в потоке :) , а в методе write, точнее в его сишной реализации.
...
Рейтинг: 0 / 0
Форумы / Java [игнор отключен] [закрыт для гостей] / Ошибка при записи данных в сокет / 10 сообщений из 10, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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