- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我已经搜索了这个问题很长一段时间,但没有找到适合我的解决方案。
这里是一些代码(我刚刚添加了一些 System.out.println
短语)。
web.xml
<display-name>Atmosphere Chat</display-name>
<servlet>
<description>AtmosphereServlet</description>
<servlet-name>AtmosphereServlet</servlet-name>
<servlet-class>org.atmosphere.cpr.AtmosphereServlet</servlet-class>
<load-on-startup>0</load-on-startup>
<async-supported>true</async-supported>
</servlet>
<servlet-mapping>
<servlet-name>AtmosphereServlet</servlet-name>
<url-pattern>/chat/*</url-pattern>
</servlet-mapping>
ChatRoom.java
@ManagedService(path = "/chat/{room}")
public class ChatRoom {
private final ConcurrentHashMap<String, String> users = new ConcurrentHashMap<String, String>();
private final static String CHAT = "/chat/";
@PathParam("room")
private String room;
@Inject
private BroadcasterFactory factory;
@Inject
private AtmosphereResourceFactory resourceFactory;
@Inject
private MetaBroadcaster metaBroadcaster;
private static Collection<String> getRooms(Collection<Broadcaster> broadcasters) {
Collection<String> result = new ArrayList<String>();
for (Broadcaster broadcaster : broadcasters) {
if (!("/*".equals(broadcaster.getID()))) {
// if no room is specified, use ''
String[] p = broadcaster.getID().split("/");
result.add(p.length > 2 ? p[2] : "");
}
};
return result;
}
@Ready(encoders = {JacksonEncoder.class})
@DeliverTo(DeliverTo.DELIVER_TO.ALL)
public ChatProtocol onReady(final AtmosphereResource resource) {
System.out.println("Client " + resource.uuid() + " connected.");
return new ChatProtocol(users.keySet(), getRooms(factory.lookupAll()));
}
@Disconnect
public void onDisconnect(AtmosphereResourceEvent event) {
if (event.isCancelled()) {
System.out.println("Client " + event.getResource().uuid() + " unexpectedly disconnected.");
} else if (event.isClosedByClient()) {
System.out.println("Client " + event.getResource().uuid() + " closed the connection");
}
}
@Message(decoders = {UserDecoder.class})
public void onPrivateMessage(UserMessage user) {
System.out.println("Client " + user.getUser() + " send a message.");
String userUUID = users.get(user.getUser());
if (userUUID != null) {
// Retrieve the original AtmosphereResource
AtmosphereResource r = resourceFactory.find(userUUID);
if (r != null) {
ChatProtocol m = new ChatProtocol(user.getUser(), " sent you a private message: " + user.getMessage().split(":")[1], users.keySet(), getRooms(factory.lookupAll()));
if (!user.getUser().equalsIgnoreCase("all")) {
factory.lookup(CHAT + room).broadcast(m, r);
}
}
} else {
ChatProtocol m = new ChatProtocol(user.getUser(), " sent a message to all chatroom: " + user.getMessage().split(":")[1], users.keySet(), getRooms(factory.lookupAll()));
metaBroadcaster.broadcastTo("/*", m);
}
}
@Message(encoders = {JacksonEncoder.class}, decoders = {ProtocolDecoder.class})
public ChatProtocol onMessage(ChatProtocol message) throws IOException {
if (message.getMessage().contains("disconnecting")) {
users.remove(message.getAuthor());
return new ChatProtocol(message.getAuthor(), " disconnected from room " + room, users.keySet(), getRooms(factory.lookupAll()));
}
if (!users.containsKey(message.getAuthor())) {
users.put(message.getAuthor(), message.getUuid());
return new ChatProtocol(message.getAuthor(), " entered room " + room, users.keySet(), getRooms(factory.lookupAll()));
}
message.setUsers(users.keySet());
return new ChatProtocol(message.getAuthor(), message.getMessage(), users.keySet(), getRooms(factory.lookupAll()));
}
}
当我在 IntelliJ IDEA 中运行此示例时,Websocket 可以建立。除了 @Message
注释之外,所有功能都工作正常,我可以选择一个聊天室意味着 @Ready
注释可以工作,导致控制台日志打印如下。
Client 6c981440-0ae6-43ed-be40-95dfad23d586 connected.
当我关闭浏览器时,控制台日志为
Client 6c981440-0ae6-43ed-be40-95dfad23d586 closed the connection
这意味着@Disconnect
有效。
但我在 input
中输入一个名称,然后单击 Enter。什么都没发生。
任何人都可以提供帮助,我们将不胜感激。提前致谢。
PS:运行环境为JDK1.7,tomcat7,atmosphere-runtime版本为2.4.3。我昨天对此进行了调试,在输入名称后,IllegalArgumentException
在下面的代码中被捕获。
public static Object invokeMethod(Method method, Object objectToInvoke, Object... parameters) {
Object objectToEncode = null;
boolean hasMatch = false;
try {
objectToEncode = method.invoke(objectToInvoke, method.getParameterTypes().length == 0?new Object[0]:parameters);
hasMatch = true;
} catch (IllegalAccessException var6) {
logger.trace("", var6);
} catch (InvocationTargetException var7) {
logger.error("", var7);
} catch (IllegalArgumentException var8) {
logger.trace("", var8);
} catch (Throwable var9) {
logger.error("", var9);
}
if(!hasMatch) {
logger.trace("No Method\'s Arguments {} matching {}", method.getName(), objectToInvoke);
}
return objectToEncode;
}
哪些代码位于org\atmosphere\atmosphere-runtime\2.4.3\atmosphere-runtime-2.4.3.jar!\org\atmosphere\config\driven\Invoker.class
最佳答案
我遇到过这个问题,可能是编码器
和解码器
导致了这个问题,请尝试将您的方法参数更改为String
。
关于java - 当我运行 Atmosphere 样本的 Atmosphere 聊天多房间时,@Message注释不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36783978/
我正在使用 Atmosphere 运行时 0.6 快照。 Tomcat 7 正确记录我正在使用 Http11 Nio 连接器,并且没有警告将使用 BlockingIO。 我正在尝试向三种 channe
我已经搜索了这个问题很长一段时间,但没有找到适合我的解决方案。 这里是一些代码(我刚刚添加了一些 System.out.println 短语)。 web.xml Atmosphere Chat
我运行一个聊天服务器,它使用 Atmosphere 作为支持 websocket 的框架。 Atmosphere 使用 Jersey,因为我使用 atmosphere-jersey maven 依赖项
我正在尝试从 atmosphere-samples 运行聊天示例 但我在控制台中收到以下错误 GET http://localhost:8080/javascript/atmosphere.js 40
the creators blog 中有可用框架列表的 Atmosphere .我想用scala和 Play Framework包含在 Atmosphere 中.在博客中,他写道 Atmosphere
我目前在使用 Atmosphere Framework grails 插件时遇到问题,该插件基本上是 Atmosphere 的 Java 和 Javascript 实现,但我的问题是专门处理 JS (
我有一个带有 onMessage 函数的 ManagedService @ManagedService(path = "/atmosphere/formuserpresence/{id}") publ
可以请我告诉我们如何指定在 Atmosphere 中保持websocket连接线程打开的最长时间。我正在使用grails事件推送插件将事件从服务器推送到客户端。我看到 Atmosphere 连接保持打
我正在创建一个Grails应用程序,该应用程序利用Atmosphere插件将数据推送到浏览器。但是,在创建单个用户( session 用户)的广播 channel 时遇到了麻烦。我的代码如下: 服务:
我想知道是否可以使用适用于 p2p 的 Atmosphere Framework 创建基于 Web 的聊天。在 Atmosphere 示例中,有一些聊天示例,它们向当前订阅的所有监听器广播消息。我想将
我想产生以下行为: 用户在浏览器中保存一些实体。在服务器端保存实体后,它会生成通知,并且它必须通过带有更新的实体实例的 Atmosphere 通知所有其他客户端。 所以问题是如何通过Atmospher
首先,我打算使用 Atmosphere在服务器端和客户端,一个带有 WebView 的 Android 应用程序,我将在其中使用 jQuery。 但是,稍后计划了一个更“标准”的 Android 应用
本文整理了Java中org.atmosphere.websocket.WebSocket类的一些代码示例,展示了WebSocket类的具体用法。这些代码示例主要来源于Github/Stackoverf
我已经向 Atmosphere 发布了一些处于测试状态的软件包。现在,在开发中发现其中一些是无用的(它们被另一个消耗了)。我怎样才能取消发布它们? 最佳答案 有一种临时的、未记录的方法可以做到这一点:
是否可以让服务器向所有连接的客户端发送消息而无需等待它们的任何操作?让我解释一下:-) 我一直在阅读 docs/examples我没有找到任何能满足我需求的东西:流程总是一样的;客户端连接(例如:对
Atmosphere 框架中的长轮询间隔约为 60 秒。即使在 AtmosphereRequest 中设置 pollingInterval 属性后,请求也会在 60 秒后发送到服务器。如何在请求中设置
我正在编写一个使用Atmosphere插件的Grails应用程序。连接有效,但是每次我在浏览器中更新页面时,都会看到Web服务器添加了一个新的Daemon线程,此线程以后再也不会释放。 线程数达到20
我刚刚从 Github 下载了 Atmosphere 样本。当我在聊天样本上运行 jetty:run goal 时,我遇到了一些问题。 我可以使用浏览器访问该页面(http://localhost:9
我正在寻找一个处理grails和 Atmosphere 插件的好例子或教程。 我发现的教程似乎缺少一些信息,无法使我的示例正常工作。 谢谢 最佳答案 现在我找到了我想要的东西。在这里,您可以得到一个在
我尝试从下面的链接创建一个基本的 Atmosphere 测试。我已经从 pom 文件中下载了它要求的所有内容。但由于某种原因, eclipse 无法识别“@MeteorService(path =“/
我是一名优秀的程序员,十分优秀!