Обычная версия
Java форум JavaTalks
форум программистов

Поиск   Пользователи   Группы   Регистрация 
 Профиль   Личные сообщения 

 Вход 

Локальный чат
Список форумов
 ->  Сети


На страницу Пред.  1, 2, 3, 4, 5, 6, 7, 8  След. 
Начать новую тему 
Предыдущая тема :: Следующая тема  
Автор Сообщение
epos : 5
Новичок

СообщениеАпр 07, 2011 16:05 
Ответить с цитатой
Ужас!!! Каменный век есть же куча мультикастовых вещей где все это сделано. Куча убитого времени потраченого в пустую.

Jgroups, Shoal, TreeCache - хочешь фотками, хочешь сообщениями, хочешь файлами обменивайся. Very Happy
К началу Посмотреть профиль Отправить личное сообщение
escalade : 244
Новичок
Откуда: Kiev, Ukraine

СообщениеАпр 07, 2011 19:10 
Ответить с цитатой
epos писал(а):
Ужас!!! Каменный век есть же куча мультикастовых вещей где все это сделано. Куча убитого времени потраченого в пустую.

Jgroups, Shoal, TreeCache - хочешь фотками, хочешь сообщениями, хочешь файлами обменивайся. Very Happy


Деревянный век после каменного!!!.
Убьешь еще больше времени изучая все это.
К началу Посмотреть профиль Отправить личное сообщение
Yoman : 2
Новичок

СообщениеАпр 16, 2011 12:50 
Ответить с цитатой
escalade писал(а):
Да, при некоторых обстоятельствах, вполне возможно.
Нужно синхронизировать список:
Код:

final private LinkedList<SocketHandler> userList = (LinkedList) Collections.synchronizedList(new LinkedList<SocketHandler>());


А можно поподробнее, как реализовать безопасность потока при добавлении/удалении пользователей из списка ?

Если можно, то в применении к примеру чата, который ты написал.

Только не ругайтесь сильно, я только начал изучать Java.
К началу Посмотреть профиль Отправить личное сообщение
escalade : 244
Новичок
Откуда: Kiev, Ukraine

СообщениеАпр 16, 2011 15:02 
Ответить с цитатой
Методами синхронизации доступа. Прочитайте в книгах, или в интернете если только начали изучать яву.
Суть такова чтобы только один поток мог изменять состояние обьекта или любых данных одновременно.
К началу Посмотреть профиль Отправить личное сообщение
Yoman : 2
Новичок

СообщениеАпр 16, 2011 15:18 
Ответить с цитатой
[quote="escalade"]Методами синхронизации доступа. Прочитайте в книгах, или в интернете если только начали изучать яву.
Суть такова чтобы только один поток мог изменять состояние обьекта или любых данных одновременно.[/quo

Спасибо, буду изучать Smile
К началу Посмотреть профиль Отправить личное сообщение
FCR : 1
Новичок

СообщениеСен 29, 2011 13:15 
Ответить с цитатой
escalade писал(а):

В принципе код не сложный.
Замечания и жесткая критика приветствуется...


Такой вопрос созрел... С какой целью класс ChatServer делать потомком от класса Thread, ведь его экземпляр создаётся всего один раз при запуске приложения. Всё что выполняется в методе run() этого класса с таким же успехом можно провернуть в main, например...
К началу Посмотреть профиль Отправить личное сообщение
escalade : 244
Новичок
Откуда: Kiev, Ukraine

СообщениеСен 29, 2011 16:25 
Ответить с цитатой
FCR писал(а):
escalade писал(а):

В принципе код не сложный.
Замечания и жесткая критика приветствуется...


Такой вопрос созрел... С какой целью класс ChatServer делать потомком от класса Thread, ведь его экземпляр создаётся всего один раз при запуске приложения. Всё что выполняется в методе run() этого класса с таким же успехом можно провернуть в main, например...


Можно и так, но в потоке более нагляднее и к тому же в main методе серверов можно запустить несколько на разных портах, а не писать одинаковый run для каждого Smile.
К началу Посмотреть профиль Отправить личное сообщение
Romjadar : 58
Новичок
Откуда: Ростов-на-Дону

СообщениеНоя 28, 2011 10:35 
Ответить с цитатой
Здравствуйте! Тоже пишу чат... Не получается отправить и принять сообщение на стороне клиента. Клиент с GUI. При нажатии на кнопку отправить выводит ошибку:

Код:

Exception in thread "AWT-EventQueue-0" java.util.NoSuchElementException: No line found
   at java.util.Scanner.nextLine(Unknown Source)
   at com.romja.dar.ChatSketch$MessageDispatcher.actionPerformed(ChatSketch.java:91)
   at javax.swing.AbstractButton.fireActionPerformed(Unknown Source)
   at javax.swing.AbstractButton$Handler.actionPerformed(Unknown Source)
   at javax.swing.DefaultButtonModel.fireActionPerformed(Unknown Source)
   at javax.swing.DefaultButtonModel.setPressed(Unknown Source)
   at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(Unknown Source)
   at java.awt.Component.processMouseEvent(Unknown Source)
   at javax.swing.JComponent.processMouseEvent(Unknown Source)
   at java.awt.Component.processEvent(Unknown Source)
   at java.awt.Container.processEvent(Unknown Source)
   at java.awt.Component.dispatchEventImpl(Unknown Source)
   at java.awt.Container.dispatchEventImpl(Unknown Source)
   at java.awt.Component.dispatchEvent(Unknown Source)
   at java.awt.LightweightDispatcher.retargetMouseEvent(Unknown Source)
   at java.awt.LightweightDispatcher.processMouseEvent(Unknown Source)
   at java.awt.LightweightDispatcher.dispatchEvent(Unknown Source)
   at java.awt.Container.dispatchEventImpl(Unknown Source)
   at java.awt.Window.dispatchEventImpl(Unknown Source)
   at java.awt.Component.dispatchEvent(Unknown Source)
   at java.awt.EventQueue.dispatchEventImpl(Unknown Source)
   at java.awt.EventQueue.access$000(Unknown Source)
   at java.awt.EventQueue$1.run(Unknown Source)
   at java.awt.EventQueue$1.run(Unknown Source)
   at java.security.AccessController.doPrivileged(Native Method)
   at java.security.AccessControlContext$1.doIntersectionPrivilege(Unknown Source)
   at java.security.AccessControlContext$1.doIntersectionPrivilege(Unknown Source)
   at java.awt.EventQueue$2.run(Unknown Source)
   at java.awt.EventQueue$2.run(Unknown Source)
   at java.security.AccessController.doPrivileged(Native Method)
   at java.security.AccessControlContext$1.doIntersectionPrivilege(Unknown Source)
   at java.awt.EventQueue.dispatchEvent(Unknown Source)
   at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
   at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
   at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
   at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
   at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
   at java.awt.EventDispatchThread.run(Unknown Source)


Вот мой сервер:
Код:

import java.io.IOException;
import java.net.*;
import java.util.Scanner;
import java.io.*;

public class ServerTest {
   public static void main(String[] args) throws IOException {

      ServerSocket s = new ServerSocket(8189);
      Socket incoming = s.accept();

      try {
         InputStream in = incoming.getInputStream();
         OutputStream out = incoming.getOutputStream();
         
         Scanner reader = new Scanner(in);
         PrintWriter writer = new PrintWriter(out,true);
         
         //writer.println("Hello! Enter BYE to exit.");
         
         boolean done = false;
         while (!done && reader.hasNextLine()) {
            String line = reader.nextLine();
            System.out.println("line: "+line);
            writer.println(line);
            if (line.trim().equals("BYE")) done=true;
         }
      } finally {
         incoming.close();
      }

   }
}


Вот мой GUI:
Код:

import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.net.*;
import java.util.Scanner;
import java.io.*;

import javax.swing.*;
import com.jgoodies.looks.windows.WindowsLookAndFeel;

public class ChatSketch extends JFrame {

   private static JTextArea southTextAr;
   private static JTextArea textAr;
   private ClientChat chcl;
   

   public ChatSketch() throws UnknownHostException, IOException {
      super("ChatSketch");
      setSize(600, 400);
      setDefaultCloseOperation(EXIT_ON_CLOSE);
      //following strings to be commented in order to use default lookAndFeel(metal): 28-33
      try {
         UIManager
               .setLookAndFeel("com.jgoodies.looks.windows.WindowsLookAndFeel");
      } catch (Exception ex) {
         ex.printStackTrace();
      }

      Toolkit tool = Toolkit.getDefaultToolkit();
      Dimension screensize = tool.getScreenSize();
      int width = screensize.width;
      int height = screensize.height;
      setLocation(width / 4, height / 4);

      textAr = new JTextArea(6, 30);
      textAr.setEditable(false);
      textAr.setLineWrap(true);
      JScrollPane jscroll = new JScrollPane(textAr);
      jscroll.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);

      JPanel centerBox = BoxLayoutUtils.createVerticalPanel();
      centerBox.setBorder(BorderFactory.createEmptyBorder(7, 7, 7, 7));
      centerBox.add(jscroll);

      southTextAr = new JTextArea(5, 20);
      southTextAr.setLineWrap(true);
      JScrollPane jscroll2 = new JScrollPane(southTextAr);
      jscroll2.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED);

      JPanel southWrapper = BoxLayoutUtils.createVerticalPanel();
      southWrapper.setBorder(BorderFactory.createEmptyBorder(0, 7, 7, 7));
      southWrapper.add(Box.createVerticalStrut(5));
      southWrapper.add(jscroll2);

      JPanel buttonWrapper = new JPanel(new FlowLayout(FlowLayout.RIGHT));
      JButton send = new JButton("Send");
      send.addActionListener(new MessageDispatcher());
      buttonWrapper.add(send);

      southWrapper.add(buttonWrapper);
      
      chcl = new ClientChat();
      
      add(centerBox);
      add(southWrapper, "South");
      setVisible(true);

   }

   private class MessageDispatcher implements ActionListener {

      @Override
      public void actionPerformed(ActionEvent event) {
//         String nullCheck = southTextAr.getText();
//         if (nullCheck.isEmpty()) {
//            JOptionPane.showMessageDialog(null, "You must enter something");
//         } else {
//            String toSend = southTextAr.getText();
//            textAr.append(toSend + "\n");
//            southTextAr.setText(null);
//            
//         }
         
            
            chcl.getWriter().println(southTextAr.getText());
            
            String input = chcl.getScan().nextLine();
            textAr.append(input+"\n");
         
         
      }

   }
   
   public static void main(String[] args) {
      SwingUtilities.invokeLater(new Runnable() {
         public void run() {
            try {
               new ChatSketch();
            } catch (UnknownHostException e) {
               e.printStackTrace();
            } catch (IOException e) {
               e.printStackTrace();
            }
         }
      });
   }

   public JTextArea getSouthTextAr() {
      return southTextAr;
   }

   public void setSouthTextAr(JTextArea southTextAr) {
      this.southTextAr = southTextAr;
   }

   public JTextArea getTextAr() {
      return textAr;
   }

   public void setTextAr(JTextArea textAr) {
      this.textAr = textAr;
   }
   
   
}


А вот сама реализация клиента:
Код:

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.net.Socket;
import java.net.UnknownHostException;
import java.util.Scanner;

class ClientChat {
   

   private PrintWriter writer = null;
   private Scanner scan;

   public ClientChat() throws UnknownHostException, IOException {
      Socket s = new Socket("127.0.0.1", 8189);
      System.out.println("Socket connected status: "+s.isConnected());
      try {

         InputStream in = s.getInputStream();
         OutputStream out = s.getOutputStream();

         scan = new Scanner(in);
         writer = new PrintWriter(out, true);

         
      } finally {
         s.close();
      }
      System.out.println("Socket connected status: "+s.isConnected());
   }
   
   public PrintWriter getWriter() {
      return writer;
   }

   public void setWriter(PrintWriter writer) {
      this.writer = writer;
   }

   public Scanner getScan() {
      return scan;
   }

   public void setScan(Scanner scan) {
      this.scan = scan;
   }
}


Подскажите пожалуйста, в чем дело? А также любые замечания, предложения по поводу кода приветствуются Может я не понимаю как должны общаться клиент с сервером? Пока чат расчитан просто на одного клиента.. просто чтобы понять как это все работает.. Заранее благодарю... Very Happy
К началу Посмотреть профиль Отправить личное сообщение Отправить e-mail
escalade : 244
Новичок
Откуда: Kiev, Ukraine

СообщениеНоя 29, 2011 17:06 
Ответить с цитатой
Почитайте еще раз теорию и API по сокетам.
Во первых Ваш клиентский сокет сразу же закрывается после подключения.
System.out.println("Socket connected status: "+s.isConnected()); // не правильно
s.isConnected() выдает true если сокет однажды уже был подключен.
Проверять такое нужно по другому:
System.out.println("Socket connected closed status: "+s.isClosed());
Клиентский сокет должен работать в отдельном потоке.
Нужно обезательно установить кодировку передаваемого текста для клиента и сервера, например utf-8.
Выходной поток:
PrintStream printStream = new PrintStream(socket.getOutputStream(), true, "UTF-8");
Запись:
printStream.println("message"); // блокирует пока не отправит строки
Входной:
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(socket.getInputStream(), "UTF-8"));
Считывание:
String message = bufferedReader.readLine(); // блокирует пока не получит строки!
ClientChat должен отдавать принятое сообщение или через обратный вызов, или самому добавлять в компонент что не рекомендуется...
И еще много разный замечаний...
К началу Посмотреть профиль Отправить личное сообщение
Romjadar : 58
Новичок
Откуда: Ростов-на-Дону

СообщениеНоя 30, 2011 7:39 
Ответить с цитатой
escalade, спасибо за замечания!
К началу Посмотреть профиль Отправить личное сообщение Отправить e-mail
Romjadar : 58
Новичок
Откуда: Ростов-на-Дону

СообщениеНоя 30, 2011 9:37 
Ответить с цитатой
Сделал каждого клиента в свой поток... Клиент закрывает свой сокет, когда закрывает GUI чата...все работает.. Какие замечания? Как говорится, на Ваш суд..)) Но что смущает, так это SocketException, когда закрываешь окно чата... Вроде сокет закрывает, но вот это место
Код:

while ((str = scan.readLine()) != null) ...

все ждет сообщения и пишет что больше строк нету, а ожидалось, но вы закрыли сокет.. и выбрасывает то самое SocketException.

Клиент:
Код:

import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.net.*;
import java.io.*;
import javax.swing.*;
import com.romja.dar.BoxLayoutUtils;

//GUI
public class ChatSketch extends JFrame {

   private JTextArea southTextAr;
   private JTextArea textAr;
   private PrintStream writer;
   private BufferedReader scan;
   private Socket s;

   public ChatSketch() {
      super("ChatSketch");
      setSize(600, 400);
      setDefaultCloseOperation(EXIT_ON_CLOSE);
      // following strings to be commented in order to use default
      // lookAndFeel(metal): 28-33
      try {
         UIManager
               .setLookAndFeel("com.jgoodies.looks.windows.WindowsLookAndFeel");
      } catch (Exception ex) {
         ex.printStackTrace();
      }

      Toolkit tool = Toolkit.getDefaultToolkit();
      Dimension screensize = tool.getScreenSize();
      int width = screensize.width;
      int height = screensize.height;
      setLocation(width / 4, height / 4);

      textAr = new JTextArea(6, 30);
      textAr.setEditable(false);
      textAr.setLineWrap(true);
      JScrollPane jscroll = new JScrollPane(textAr);
      jscroll.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);

      JPanel centerBox = BoxLayoutUtils.createVerticalPanel();
      centerBox.setBorder(BorderFactory.createEmptyBorder(7, 7, 7, 7));
      centerBox.add(jscroll);

      southTextAr = new JTextArea(5, 20);
      southTextAr.setLineWrap(true);
      JScrollPane jscroll2 = new JScrollPane(southTextAr);
      jscroll2.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED);

      JPanel southWrapper = BoxLayoutUtils.createVerticalPanel();
      southWrapper.setBorder(BorderFactory.createEmptyBorder(0, 7, 7, 7));
      southWrapper.add(Box.createVerticalStrut(5));
      southWrapper.add(jscroll2);

      JPanel buttonWrapper = new JPanel(new FlowLayout(FlowLayout.RIGHT));
      JButton send = new JButton("Send");
      send.addActionListener(new MessageDispatcher());
      buttonWrapper.add(send);

      southWrapper.add(buttonWrapper);
      addWindowListener(new WindowSocketClosing()); //по закрытию окна закрывается и клиентский сокет
      
      initChat(); //запускаем клиентский сокет
      add(centerBox);
      add(southWrapper, "South");
      setVisible(true);

   }
   
   
   private void initChat() {
      try {
         s = new Socket("127.0.0.1", 8190);
         InputStream in = s.getInputStream();
         OutputStream out = s.getOutputStream();
         scan = new BufferedReader(new InputStreamReader(in, "UTF-8"));
         writer = new PrintStream(out, true, "UTF-8");
         String firstMessage = scan.readLine();
         textAr.append(firstMessage + "\n");
      } catch (IOException e) {
         e.printStackTrace();
      }
   }
   
   //принимаем сообщения от сервера
   private void listen() {
      try {
         String str;
         while ((str = scan.readLine()) != null) {
            textAr.append(str + "\n");
         }
      } catch (IOException e) {
         e.printStackTrace();
      }
   }
   
   //отправка сообщений на сервер(send button)
   private class MessageDispatcher implements ActionListener {

      @Override
      public void actionPerformed(ActionEvent event) {
         String message = southTextAr.getText();
         if (message.isEmpty()) {
            JOptionPane.showMessageDialog(null, "You must enter something");
         } else {
            writer.println(message);
            southTextAr.setText("");
         }
      }
   }

   private class WindowSocketClosing extends WindowAdapter {
      @Override
      public void windowClosing(WindowEvent e) {
         try {
            s.close();
            System.out.println("Socket closed status: " + s.isClosed());
         } catch (IOException ex) {
            ex.printStackTrace();
         }
      }

      @Override
      public void windowClosed(WindowEvent e) {
         try {
            s.close();
            System.out.println(s.isClosed());
         } catch (IOException ex) {
            ex.printStackTrace();
         }
      }
   }

   public static void main(String[] args) {
      // SwingUtilities.invokeLater(new Runnable() {
      // public void run() {
      // new ChatSketch();
      // }});
      ChatSketch sk = new ChatSketch();
      sk.listen();
   }
}


Сервер:
Код:

import java.net.*;
import java.io.*;

public class ServerTest {

   public static void main(String[] args) {
      try {
         ServerSocket s = new ServerSocket(8190);
         int count = 0;
         while (true) {
            System.out.println("spawning thread: " + count);
            Socket incoming = s.accept();
            Runnable r = new ThreadedClientHandler(incoming);
            Thread t = new Thread(r);
            t.start();
            count++;
         }
      } catch (IOException ex) {
         ex.printStackTrace();
      }
   }
}

class ThreadedClientHandler implements Runnable {

   private Socket i;

   public ThreadedClientHandler(Socket incoming) {
      i = incoming;
   }

   public void run() {
      try {
         try {
            InputStream in = i.getInputStream();
            OutputStream out = i.getOutputStream();

            BufferedReader reader = new BufferedReader(
                  new InputStreamReader(in, "UTF-8"));
            PrintStream writer = new PrintStream(out, true, "UTF-8");

            writer.println("Hello! This is a greetings message. Please enjoy your time!");

            String has = null;
            while ((has = reader.readLine()) != null) {
               String line = has;
               System.out.println("Server sent line: " + line);
               writer.println(line);
            }
         } finally {
            i.close();
         }
      } catch (IOException ex) {
         ex.printStackTrace();
      }
   }

}
К началу Посмотреть профиль Отправить личное сообщение Отправить e-mail
escalade : 244
Новичок
Откуда: Kiev, Ukraine

СообщениеДек 01, 2011 21:39 
Ответить с цитатой
Если опять таки внимательно почитать API http://docs.oracle.com/javase/6/docs/api/java/io/BufferedReader.html, то можно заметить такой метод как ready() который говорит тебе что в сокете есть готовые данные которые можно прочитать без блокировки (блокировка тоже может быть, но все таки...). Тоесть можно еще добавить такую проверку:

Код:

while (!s.isClosed() && scan.ready()) {
     String message = scan.readLine());
     if(message==null) return; // или закрываем сокет и выходим...
     else юзаем принятую строку...
}


Работаем пока сокет не закрыт, в данный момент есть данные для считывания и то что считали не null. Таким образом, все должно работать почти без "блокировки".
Замечания приветствуются Smile
К началу Посмотреть профиль Отправить личное сообщение
Bioside : 1
Новичок

СообщениеЯнв 06, 2012 23:32 
Ответить с цитатой
Уважаемый Еscalade.
Прошу мудрого наставления Smile
Хочу логировать сообщения, например, в файл
нет, в базу лучше...
Для этого создаю класс BD, в конструкторе которого, происходит соединеие с базой + метод SQLexec на добавление записи в БД.
Вопрос в следующем - как правильно реализовать взаимодействие потоков с этим класом :
1. в main создаем экземпляр BD и из потоков добаляем в БД вызвав BD.SQLexec(...)
2. в каждом потоке создаем экземпляр BD и опять таки добавляем в БД через метод этого экземпляра.
Что меня смущает :
В 1-ом варианте создаем 1-соединение с БД, но как оно поведет себя если 1000 потоков одновремено обратятся к этому методу?
И, наоборот, 2-ой вариант - все, вроде, должно обработать нормально, но держать 1000 или 10000 соединений с базой не совсем разумно...
С записью в файл через 1 класс тоже интересно и те же вопросы -т.е. в 1-ом случае ОС сама разберется с очередью на запись в файл или надо делать 2-ым вариантом?
От вас прошу даже не аргументированого ответа, а на уровне 1-ый 2-ой (если такой ответ на поставленый так криво вопрос возможен)
Ну, а развернуто можно послать и ссылкой на доки Smile
Спасибо.
К началу Посмотреть профиль Отправить личное сообщение
escalade : 244
Новичок
Откуда: Kiev, Ukraine

СообщениеМар 26, 2012 10:39 
Ответить с цитатой
Bioside писал(а):
Уважаемый Еscalade.
Прошу мудрого наставления Smile
Хочу логировать сообщения, например, в файл
нет, в базу лучше...
Для этого создаю класс BD, в конструкторе которого, происходит соединеие с базой + метод SQLexec на добавление записи в БД.
Вопрос в следующем - как правильно реализовать взаимодействие потоков с этим класом :
1. в main создаем экземпляр BD и из потоков добаляем в БД вызвав BD.SQLexec(...)
2. в каждом потоке создаем экземпляр BD и опять таки добавляем в БД через метод этого экземпляра.
Что меня смущает :
В 1-ом варианте создаем 1-соединение с БД, но как оно поведет себя если 1000 потоков одновремено обратятся к этому методу?
И, наоборот, 2-ой вариант - все, вроде, должно обработать нормально, но держать 1000 или 10000 соединений с базой не совсем разумно...
С записью в файл через 1 класс тоже интересно и те же вопросы -т.е. в 1-ом случае ОС сама разберется с очередью на запись в файл или надо делать 2-ым вариантом?
От вас прошу даже не аргументированого ответа, а на уровне 1-ый 2-ой (если такой ответ на поставленый так криво вопрос возможен)
Ну, а развернуто можно послать и ссылкой на доки Smile
Спасибо.


Есть так называемая блокирующая очередь, например LinkedBlockedQueue. Любой из множества потоков добавляют туда сообщения, а один рабочий поток в цикле по очереди забирает оттуда эти сообщения и сам лично постит в базу. Предполагается использование всего лишь одного активного подключения к базе заранее подготовленное рабочим потоком.
К началу Посмотреть профиль Отправить личное сообщение
Ker : 3
Новичок

СообщениеАпр 01, 2012 19:18 
Ответить с цитатой
Ребята, помогите, как сделать, чтоб клиент ожидал возможных входящих сообщений и не зависал! Я новичек в этом деле. Плз помогите
К началу Посмотреть профиль Отправить личное сообщение
 
Начать новую тему  Ответить на тему
Страница 6 из 8
На страницу Пред.  1, 2, 3, 4, 5, 6, 7, 8  След.
Список форумов
 -> Сети


 
Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах


Java and all Java-related trademarks and logos are trademarks or registered trademarks of Oracle Corporation in the United States and other countries.
Это сайт не относится к фирме Oracle Corporation и не поддерживается ею.

© 2006-2010 www.javatalks.ru: форум java программистов
Используется скрипт phpBB © 2001, 2010 phpBB Group

Хостинг от bizname.ru