Spring-MVC, Cometd: проверьте, кто печатает в чате в Comet

Я работаю над приложением Spring-MVC, в котором я реализовал функцию чата с помощью Cometd. В качестве функции я хотел бы знать, есть ли у Cometd какой-либо способ поддержки или каким-либо образом я могу показать, какой пользователь печатает. Конечно, пользовательская информация, которую я могу получить. Вот мой код чата. Благодарю.

ChatServiceImpl:

@Named
@Singleton
@Service
public class ChatServiceImpl {
    @Inject
    private BayeuxServer bayeux;

    @Session
    private ServerSession serverSession;

    @Listener(value = "/service/person/{id}")
    public void privateChat(ServerSession remote, ServerMessage.Mutable message,@Param("id")String id) {
        System.out.println("wassup");
        Person sender = this.personService.getCurrentlyAuthenticatedUser();
        String senderName = sender.getFirstName();

        Map<String, Object> input = message.getDataAsMap();
        String data = (String) input.get("name");
        String timestamp = (String) input.get("timestamp");
        String temp = message.getChannel();
        String temp1 = temp;
        temp = temp.replace("/service/person/", "");
        String channelName = temp1.replace("/service","");
        final int conversationId = Integer.valueOf(temp);

        Replies replies = new Replies();
        replies.setReplyingPersonName(senderName);
        replies.setReplyText(data);
        replies.setReplyTimeStamp(timestamp);
        replies.setReplyingPersonId(sender.getId());
        replies.setRead(false);
        Long replyId = this.repliesService.addReply(replies, conversationId, sender);

        Map<String, Object> output = new HashMap<String, Object>();
        output.put("text", data);
        output.put("firstname", senderName);
        output.put("channelname", channelName);
        output.put("timestamp", timestamp);
        output.put("id",sender.getId());
        output.put("read","true");
        output.put("replyid",replyId);

        ServerChannel serverChannel = bayeux.createChannelIfAbsent("/person/" + id).getReference();
        serverChannel.setPersistent(true);
        serverChannel.publish(serverSession, output);

    }

Application.js: обратите внимание, я использую части этого файла в другом файле JS.

(function($)
{
    var cometd = $.cometd;

    $(document).ready(function()
    {
        function _connectionEstablished()
        {
            $('#body').append('<div>CometD Connection Established</div>');
        }

        function _connectionBroken()
        {
            $('#body').append('<div>CometD Connection Broken</div>');
        }

        function _connectionClosed()
        {
            $('#body').append('<div>CometD Connection Closed</div>');
        }

        var _connected = false;
        function _metaConnect(message)
        {
            if (cometd.isDisconnected())
            {
                _connected = false;
                _connectionClosed();
                return;
            }

            var wasConnected = _connected;
            _connected = message.successful === true;
            if (!wasConnected && _connected)
            {
                _connectionEstablished();
            }
            else if (wasConnected && !_connected)
            {
                _connectionBroken();
            }
        }

        // Function invoked when first contacting the server and
        // when the server has lost the state of this client
        function _metaHandshake(handshake)
        {
            if (handshake.successful === true)
            {
                cometd.batch(function()
                {
                    cometd.subscribe('/chat/1306', function(message)
                    {
                        var data = message.data;
                        $('#body').append('<div>Server Says: ' + data.firstname + '/' + data.accountid + data.time1+'</div>');
                    });
                });
            }
        }

        // Disconnect when the page unloads
        $(window).unload(function()
        {
            cometd.disconnect(true);
        });

        $(document).on('click', '#sender', function()
        {
            cometd.publish('/service/chat/1306', { name: 'hello_' + Date.now() });
        });

        var cometURL = location.protocol + "//" + location.host + config.contextPath + "/cometd";
        cometd.configure({
            url: cometURL,
            logLevel: 'debug'
        });

        cometd.websocketEnabled = false;

        cometd.addListener('/meta/handshake', _metaHandshake);
        cometd.addListener('/meta/connect', _metaConnect);

        cometd.handshake();
    });
})(jQuery);

Пожалуйста, дайте мне знать, как я могу достичь этого, так как я не могу найти много ссылок для этого. Большое спасибо.:-)

1 ответ

Решение

Это легко достигается путем обнаружения на стороне клиента ввода / вывода (умным способом, чтобы избежать отправки слишком большого количества сообщений на сервер), а затем отправки служебного сообщения CometD на сервер.

Затем сервер может просто передать сообщение на специальный канал (скажем, /chat/typing) с псевдонимом пользователя, который печатает.

Клиентское приложение будет подписываться на /chat/typing и получать эти сообщения, а затем отображать в пользовательском интерфейсе, который печатает, возможно объединяя несколько пользователей в одно уведомление пользовательского интерфейса.

Часть CometD тривиальна, умное обнаружение начала / остановки набора текста, вероятно, является большей частью работы.

Другие вопросы по тегам