Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Java [игнор отключен] [закрыт для гостей] / Чат на Java, Comet, Tomcat / 5 сообщений из 5, страница 1 из 1
26.01.2013, 20:49:25
    #38125880
Zhazhah
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Чат на Java, Comet, Tomcat
Здравствуйте, возникла необходимость написать простой чат при помощи comet. Tomcat настроил должным образом: http://www.ibm.com/developerworks/web/library/wa-cometjava/#N100C8 частично код сервлета взят и от сюда http://tomcat.apache.org/tomcat-7.0-doc/aio.html

В итоге сообщение отправляется но приходит только юзеру его отправившему. Уже начитался про потоки, пересмотрел кучу примеров но так и не понял как реализовать отправку все юзерам.

Как я понял comit всегда держит одно соединение (pending) для получения обновлений, как показано на скрине:

Код сервлета:

Код: java
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.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
135.
136.
137.
138.
139.
140.
141.
142.
package servlet;

import java.io.IOException;
import java.io.PrintWriter;
import java.util.ArrayList;
import javax.servlet.ServletException;
import javax.servlet.ServletResponse;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.catalina.comet.CometEvent;
import org.apache.catalina.comet.CometProcessor;

/**
 *
 * @author mark
 */
@WebServlet(name = "Psych2", urlPatterns = {"/Psych2"})
public class Psych2
        extends HttpServlet implements CometProcessor {

    protected MessageSender messageSender = null;

    public void init() throws ServletException {
        messageSender = new MessageSender();
        Thread messageSenderThread = new Thread(messageSender);
        messageSenderThread.setDaemon(true);
        messageSenderThread.start();
    }

    public void destroy() {
        messageSender = null;
    }

    /**
     * Process the given Comet event.
     *
     * @param event The Comet event that will be processed
     * @throws IOException
     * @throws ServletException
     */
    public void event(CometEvent event)
            throws IOException, ServletException {
        HttpServletRequest request = event.getHttpServletRequest();
        HttpServletResponse response = event.getHttpServletResponse();

        if (event.getEventType() == CometEvent.EventType.BEGIN) {
            
            // Параметр отвечает за текущее действие в 
            // данном случае это только команда Send.
            String action = request.getParameter("action");

            if (action != null) {

                System.out.println("action! " + action);
                messageSender.setResponse(response);

                if ("Send".equals(action)) {
                    messageSender.send("zhazhah! " + request.getParameter("data"));
                }

            }

        } else if (event.getEventType() == CometEvent.EventType.ERROR) {
            event.close();

        } else if (event.getEventType() == CometEvent.EventType.END) {
            event.close();

        }
    }

    private class MessageSender implements Runnable {

        protected boolean running = true;
        protected final ArrayList<String> messages = new ArrayList<String>();
        private ServletResponse response;

        private synchronized void setResponse(ServletResponse response) {
            this.response = response;
            //notify();
        }

        public void send(String message) {
            synchronized (messages) {
                messages.add(message);
                // при добавлении сообщения возобновляем заснувший поток.
                messages.notify();
            }
        }

        public void run() {
            while (running) {

                // если messages не содержит сообщения
                // переводим текущий поток в режим ожидания и передаем
                // управление главному потоку.
                if (messages.isEmpty()) {
                    try {
                        synchronized (messages) {
                            messages.wait();
                        }
                    } catch (InterruptedException e) {
                        // Ignore
                    }
                }

                String[] pendingMessages = null;
                synchronized (messages) {
                    pendingMessages = messages.toArray(new String[0]);
                    messages.clear();
                }
                
                try {

                    if (response == null) {
                        try {
                            synchronized (this) {
                                wait();
                            }
                        } catch (InterruptedException e) {
                            // Ignore
                        }
                    }

                    PrintWriter writer = response.getWriter();
                    for (int j = 0; j < pendingMessages.length; j++) {
                        writer.println(pendingMessages[j]);
                    }
                    
                    writer.flush();
                    writer.close();
                    response = null;
                    
                } catch (IOException e) {
                    log("IOExeption sending message", e);
                }
            }
        }
    }
}
...
Рейтинг: 0 / 0
26.01.2013, 20:53:22
    #38125883
IDVsbruck
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Чат на Java, Comet, Tomcat
Насколько помню, этим надо заниматься самому - обслуживать коллекцию подключенных клиентов. Добавлять при BEGIN и выкидывать при END/ERROR. Либо пользоваться более высокоуровневыми QM.
...
Рейтинг: 0 / 0
26.01.2013, 21:51:12
    #38125914
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Чат на Java, Comet, Tomcat
Zhazhah,
Поищите фреймверки, который реализуют COMET, там должна быть такая возожность, чтобы не писать самому.
...
Рейтинг: 0 / 0
26.01.2013, 23:21:16
    #38125968
Zhazhah
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Чат на Java, Comet, Tomcat
Посмотрел cometd - демо чата выкидывает 500 ошибку каждые 5 сек. в коде что то для себя спереть хотел, открыл... с ужсм закрыл. Да и реально есть желание свое сделать, интересно. Думаю каждому новому соединению привязывать файлик, если кто пишет сообщение, рассылаю всем это сообщение по файлам, как только они читают чищу файл.
...
Рейтинг: 0 / 0
26.01.2013, 23:50:55
    #38125984
забыл ник
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Чат на Java, Comet, Tomcat
Zhazhah,

зачем файл? сделай статическую мапу доступную для всех потоков. если количество юзеров большое можно через базу
...
Рейтинг: 0 / 0
Форумы / Java [игнор отключен] [закрыт для гостей] / Чат на Java, Comet, Tomcat / 5 сообщений из 5, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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