powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / Ошибка при записи данных в сокет
10 сообщений из 10, страница 1 из 1
Ошибка при записи данных в сокет
    #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
Ошибка при записи данных в сокет
    #34341511
Kachalov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Скорее всего ограничение на количество сетевых соединений. Я всегда считал что возможное количество одновременных сетевых соединений с серверным сокетом, если не задано специальных ограничений, 65 тыс. Возможно я не прав.
...
Рейтинг: 0 / 0
Ошибка при записи данных в сокет
    #34341624
am_sasa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
KachalovСкорее всего ограничение на количество сетевых соединений. Я всегда считал что возможное количество одновременных сетевых соединений с серверным сокетом, если не задано специальных ограничений, 65 тыс. Возможно я не прав. не прав, зависит от ОС и настраивается обычно в ядре.

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

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

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


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