2012-05-30 3 views
1

Мое приложение использует сокеты и потоки для отправки данных в режиме реального времени, которые поступают к клиентам, которые подключаются к нему. Для этого следующие шаги:Оптимизация производительности в сокетах java

  • Подключение к серверу данных, а затем ждет клиентов
  • Launch нить обсудить входящие данные, форматировать их и отправить их клиентам, если таковые имеются.
  • Когда клиент подключается, он открывает для него поток, через который будут отправляться данные.
  • Наконец, используйте другой поток, чтобы проверить, что вы получаете и отправляете данные, иначе он будет подключен к источнику.

Данные, полученные от источника, хранятся в массиве, ожидающем обработки потоком. В каждом потоке клиента полученные данные также сохраняются в массиве, который нужно отправить. Целью этого является отсутствие замятий при получении или отправке данных. данные задерживаются на 10 секунд или более для достижения клиентов

Что я могу сделать для оптимизации производительности? Это работает на сервере Windows, можете ли вы рекомендовать какой-либо профилировщик?

Большое спасибо за помощь.

EDIT: Данные представляют собой строки переменной длины. Часть кода: // создать сокет источника в класс реализует Runnable, а затем клиент ожидает

Socket entrada = new Socket(servidor,Integer.parseInt(puerto)); 
InputStream sIn = entrada.getInputStream(); 
     while (!error) { 
      try { 
       s = salida.accept(); 
       clientes.add(new ClientThread(s));    
// run 
while (((c = sIn.read()) != -1) && ((clientes.size() > 0))) { 
if (c != 13 && c != 10) { 
cad += (char) c; 
} 
if (c == 13) received[i] = cad 

// In SendThread, run 
// format received[i] and send result 
for (i=0; i < clientes.size(); i++) { 
    clientes.get(i).SendData(result); 
} 


// In ClientThread: 
OutputString s1out = socket.getOutputStream(); 
// SendData 
sending[i] = result; 
// run 
if cad forsending 
       for (int j = 0;j<res.length();j++){ 
       try { 
        s1out.write((int)res.charAt(j));   
        } catch (Exception e) { 
        } 
       } 

Спасибо.

+0

На самом деле, только 1 клиент подключен. В будущем их 10. Спасибо. – user1424139

+0

С небольшим количеством данных работает, но при отправке всех данных возникают задержки. Благодарю. – user1424139

+1

Вам нужно будет опубликовать код. Из вашего описания система должна работать оптимально. Ваш код может вводить узкие места. – EJP

ответ

0

В зависимости от того, сколько данных вы отправляете, это может быть способ обработки потоков.

c = sIn.read() читает только несколько байтов за раз. Попробуйте обернуть его BufferedReader и используя readLine(). BufferedReader будет читать несколько килобайт за раз, что намного эффективнее. readLine() также будет разбивать входы в строки для вас, что несколько упростит код.

При подключении клиента PrintWriter может помочь вам вывести целые строки за один раз.

+1

Теперь работает. Большое спасибо. – user1424139

Смежные вопросы