2015-04-30 13 views
0

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

+0

Спасибо за ваш ответ. Звучит хорошо. Если есть какой-то пример, вы сделали что-то подобное раньше, любезно дайте мне ссылку или образец. Большое спасибо. :-) –

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

  • Нет связанных вопросов^_^