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 тривиальна, умное обнаружение начала / остановки набора текста, вероятно, является большей частью работы.