powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / Чат на Java, Comet, Tomcat
5 сообщений из 5, страница 1 из 1
Чат на Java, Comet, Tomcat
    #38125880
Zhazhah
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Здравствуйте, возникла необходимость написать простой чат при помощи 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
Чат на Java, Comet, Tomcat
    #38125883
IDVsbruck
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Насколько помню, этим надо заниматься самому - обслуживать коллекцию подключенных клиентов. Добавлять при BEGIN и выкидывать при END/ERROR. Либо пользоваться более высокоуровневыми QM.
...
Рейтинг: 0 / 0
Чат на Java, Comet, Tomcat
    #38125914
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Zhazhah,
Поищите фреймверки, который реализуют COMET, там должна быть такая возожность, чтобы не писать самому.
...
Рейтинг: 0 / 0
Чат на Java, Comet, Tomcat
    #38125968
Zhazhah
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Посмотрел cometd - демо чата выкидывает 500 ошибку каждые 5 сек. в коде что то для себя спереть хотел, открыл... с ужсм закрыл. Да и реально есть желание свое сделать, интересно. Думаю каждому новому соединению привязывать файлик, если кто пишет сообщение, рассылаю всем это сообщение по файлам, как только они читают чищу файл.
...
Рейтинг: 0 / 0
Чат на Java, Comet, Tomcat
    #38125984
забыл ник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Zhazhah,

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


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