Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Java [игнор отключен] [закрыт для гостей] / Скорость соединения клиент/сервер / 9 сообщений из 9, страница 1 из 1
26.12.2006, 12:31:47
    #34224813
Мистерио
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Скорость соединения клиент/сервер
Привет всем!

Возникла проблема.
Написал для теста простое клиент-серверное приложение на сокетах без NIO.
Исходный код приводить не буду, т.к. он стандартен на все 100%.
Сервер и клиент шлют друг другу пакеты по 40 байта.
Замеряется пинг, между приемом и ответом на сервере.

Так вот, когда сервер и клиент на localhost'е все работает очень быстро пинг 0-12 мс.
Но стоит запустить сервер на удаленном компе (но в той же локальной сети), как пинг возрастает до 300 мс, введение двух сокетных соединений по разным портам - одно для приема, другое для отправки помогло уменьшить пинг до 200 мс. Но это все равно МНОГО.

Так вот, никто не в курсе каких действительно цифр стоит ждать?
...
Рейтинг: 0 / 0
26.12.2006, 12:39:21
    #34224833
mozheyko_d
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Скорость соединения клиент/сервер
А как измеряете?
...
Рейтинг: 0 / 0
26.12.2006, 13:03:13
    #34224927
Мистерио
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Скорость соединения клиент/сервер
Примерно так:

while(true){

long LastTime = System.currentTimeMillis();
System.out.println("ping is");
System.out.println(pr-LastTime);
LastTime = pr;

...тут прием 40 байт

...тут отправка 40 байт

}
...
Рейтинг: 0 / 0
26.12.2006, 13:11:14
    #34224951
mozheyko_d
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Скорость соединения клиент/сервер
Ну и по скОльким циклам приём/отправка сделан вывод о 200 мс
...
Рейтинг: 0 / 0
26.12.2006, 13:36:17
    #34225038
Мистерио
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Скорость соединения клиент/сервер
ну блин...
не знаю, много (100-1000)...
могу тебя уверить что в подсчетах все правильно :)
...
Рейтинг: 0 / 0
26.12.2006, 14:59:49
    #34225339
mozheyko_d
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Скорость соединения клиент/сервер
Вот даже такой, ужасный с точки зрения оптимизации, код:
Код: 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.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
...
//Server
         try {
            
            Socket socket =  new  ServerSocket(port).accept();
            
            InputStream in = socket.getInputStream();
            
            OutputStream out = socket.getOutputStream();
            
             long  iterations =  0 ;
             long  timeSum =  0 ;
            
            System.out.println("Client connected.");
                    
             while  (true) {
                
                 if  (in.available() >  0 ) {
                    
                     long  begin = System.currentTimeMillis();
                    
                     byte [] buffer =  new   byte [in.available()];
                    
                    in.read(buffer);
                    
                    System.out.print("+");
                    
                     if  (buffer[ 0 ] ==  32 ) {
                        
                         break ;
                        
                    }
                    
                    out.write(buffer);
                    
                    System.out.print("-");
                    
                     long  end = System.currentTimeMillis();
                    
                    timeSum += end - begin;
                    
                    iterations++;
                    
                }  else  {
                    
                    Thread.currentThread().sleep( 1 );
                    
                }
                
            }
            
            System.out.println("AVG time " + ( double )timeSum / iterations + " ms");
            
        }  catch  (IOException e) {
            
            e.printStackTrace();
            
        }  catch  (InterruptedException e) {
            
            e.printStackTrace();
            
        }
...
//Client
         try  {
            
            Socket socket =  new  Socket(host, port);
            
            InputStream in = socket.getInputStream();
            
            OutputStream out = socket.getOutputStream();
            
             byte [] buffer =  new   byte [ 40 ];
            
            System.out.println("Connected.");
            
             for  ( int  i =  0 ; i <  1000 ; i++) {
                
                out.write(buffer);
                
                System.out.print("+");
                
                 while  (in.available() <  39 ) {
                    
                    Thread.currentThread().sleep( 1 );
                    
                }
                
                in.read(buffer);
                
                System.out.print("-");
                
            }
            
            out.write(( byte ) 32 );
            
            System.out.println("\nDone.");
            
        }  catch  (IOException e) {
            
            e.printStackTrace();
            
        }  catch  (InterruptedException e) {
            
            e.printStackTrace();
            
        }
...

Даёт результаты:
Solaris server - Windows client AVG time 0.877 ms
Windows server - Solaris client AVG time 0.015 ms
JDK6
...
Рейтинг: 0 / 0
27.12.2006, 06:36:01
    #34226594
Мистерио
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Скорость соединения клиент/сервер
Странно, вроде точно такой же код писал, а он работал медленно...
буду разбираться...

Спасибо.
...
Рейтинг: 0 / 0
27.12.2006, 07:52:36
    #34226658
Мистерио
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Скорость соединения клиент/сервер
Тогда еще вопрос :)

Поразбирался на свежую голову, и пришел к следующему выводу:

у меня данные отправлялись как бы в два приема. Сначала делал os.write(byte[4]) - это отправлял типа заголовник, который говорит, о размере основного пакета. А уже потом слал основной пакет, так же os.write(byte[mainPack.length]).

И получается, если делать отправку больше чем за один write, то лаг возрастает до 300 мс.
А отпрака одним write'ом дает лаг в среднем 6 мс, что приемлемо.

Это такие особенности реализации сокетов на Java или как?

Может есть способ накапливать данные, а потом скажем вызововом flush() их отпралять?
...
Рейтинг: 0 / 0
27.12.2006, 10:13:31
    #34226926
mozheyko_d
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Скорость соединения клиент/сервер
Угу, меняешь OutputStream на BufferedOutputStream
...
Рейтинг: 0 / 0
Форумы / Java [игнор отключен] [закрыт для гостей] / Скорость соединения клиент/сервер / 9 сообщений из 9, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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