public class Event implements Protocol, Serializable {
protected Map attributes = new HashMap(3);
public Event(String anEventType) {
this(anEventType, null);
}
//初始化方法 设置事件的时间 类型 属性 这些数据都在map中
public Event(String anEventType, Map theAttributes) {
if (theAttributes != null) {
setAttrs(theAttributes);
}
// Set required field event type
setField(P_EVENT, anEventType);
// Set time in seconds since 1970
setField(P_TIME, System.currentTimeMillis() / 1000);
}
//初始化方法 设置属性 因为没有提供默认的时间类型, 所以属性中必须包含类型信息
public Event(Map theAttributes) {
if (!theAttributes.containsKey(P_EVENT)) {
throw new IllegalArgumentException(P_EVENT + " not found in attributes");
}
setAttrs(theAttributes);
}
public static Event createDataEvent(String aSubject) {
return createDataEvent(aSubject, null);
}
//创建数据事件 设置主题
public static Event createDataEvent(String aSubject, Map theAttributes) {
Event dataEvent = new Event(E_DATA, theAttributes);
dataEvent.setField(P_SUBJECT, aSubject);
return dataEvent;
}
//拿到事件类型
public String getEventType() {
return getField(P_EVENT);
}
//拿到事件主题
public String getSubject() {
return getField(P_SUBJECT);
}
public void setField(String name, String value) {
attributes.put(name, value);
}
public void setField(String name, int value) {
attributes.put(name, value + "");
}
public void setField(String name, long value) {
attributes.put(name, value + "");
}
public String getField(String name) {
return (String) attributes.get(name);
}
/**
* Return field; if null return default.
*/
public String getField(String name, String aDefault) {
String result = getField(name);
return result == null ? aDefault : result;
}
public Iterator getFieldNames() {
return attributes.keySet().iterator();
}
public String toString() {
return attributes.toString();
}
/**
* Convert to HTTP query string.
* 拼出一个http get请求 id=1&name=xxx&age=13$v=34 类似这样的
*/
public String toQueryString() {
String queryString = "";
String amp = "";
for (Iterator iter = getFieldNames(); iter.hasNext();) {
String nextAttrName = (String) iter.next();
String nextAttrValue = getField(nextAttrName);
queryString = queryString + amp + nextAttrName + "=" + nextAttrValue;
// After first add "&".
amp = "&";
}
return queryString;
}
//转换成xml格式 strict true的话会把其中value的特殊字符转换成html的格式 < > \' \" \\ &
//转成 <event id="id" name="name" />
public String toXML(boolean strict) {
String xmlString = "<event ";
for (Iterator iter = getFieldNames(); iter.hasNext();) {
String nextAttrName = (String) iter.next();
String nextAttrValue = getField(nextAttrName);
xmlString = xmlString + nextAttrName + "=\"" + (strict ? Sys.forHTMLTag(nextAttrValue) : nextAttrValue) + "\" ";
}
xmlString += "/>";
return xmlString;
}
//默认xml不转成html特殊字符
public String toXML() {
return toXML(false);
}
public Object clone() {
// Clone the Event by using copy constructor
return new Event(attributes);
}
/**
* Copy given attributes into event attributes
*/
private void setAttrs(Map theAttributes) {
attributes.putAll(theAttributes);
}
}
分享到:
相关推荐
Pushlet是一种基于Java的实时数据推送技术,由荷兰JustObjects公司开发。Pushlet库的核心功能是实现实时的服务器向客户端推送数据,而无需客户端频繁发起请求,这大大提高了网络应用的效率和用户体验。以下是对...
在服务器端,Pushlet使用`EventSource`和`EventSourceManager`来管理和处理事件,`EventSource`实现了`Runnable`接口,可以在多线程环境中运行,确保服务器能够并发地处理多个客户端的请求。 总的来说,Pushlet和...
3. **Event**:Pushlet机制基于事件驱动,当服务器端有新的事件(如新的聊天消息)发生时,会生成一个事件对象,然后通过已建立的连接将这个事件推送到相关的客户端。 4. **Session Management**:Pushlet支持多...
3. **数据推送**:当Event Source有新的数据时,Pushlet Server会将数据封装成HTTP响应,通过已建立的连接推送给客户端。 4. **客户端处理**:客户端接收到数据后,根据需要进行处理并显示,同时保持连接开放以接收...
1. nl.justobjects.pushlet.core.Session,添加了event域和getEvent()方法,修改了public static Session create(String anId, Event anEvent)方法 public static Session create(String anId, Event anEvent) ...
**Pushlet框架详解** Pushlet框架,又称为Java Pushlet,是一种基于Java的实时推送技术框架,由Marc Fleury创建并开源。Pushlet的核心概念是实现服务器向客户端的主动推送数据,而不是传统的HTTP请求-响应模式,即...
4. **Event**:事件是Pushlet中传输的数据单元。当发布者创建一个事件并发送到服务器时,服务器会将这个事件推送给所有订阅了该事件的客户端。 5. **Subscription**:订阅是客户端表达对特定事件类型的兴趣。订阅者...
`_doRequest(anEvent, aQuery)`是发送请求的关键,它根据当前状态和事件决定是否发起请求,同时使用回调函数`_onResponse`处理响应。`_getWebRoot`方法获取项目根目录,确保请求URL的正确性。`_getXML`方法则负责...
在 `pullEvent` 方法中,你可以创建 Event 对象,并设置其字段,如示例中的 `/wxl/hw` 主题和 "HelloWorld!!!!" 数据。这个方法会在每个指定的休眠时间间隔后被调用,以便向客户端发送新的数据。 在客户端,你需要...
Pushlet是基于Java的一种早期的推送技术框架,它利用了 comet 技术,实现了服务器到客户端的双向通信。在本Demo中,我们将深入探讨Pushlet的工作原理和如何实现一个基本的网页推送系统。 首先,我们需要理解什么是...
它的核心组件包括Pushlet Server、Pushlet Client和Event Dispatcher。Pushlet Server负责接收和处理客户端的连接,Pushlet Client则作为客户端应用程序,负责建立和保持与服务器的连接,Event Dispatcher则根据需求...
1. **Pushlet** - 接收所有用户请求,将请求封装成event对象,然后创建command对象交给Controller处理。 2. **Session** - 代表用户的一次会话,不同于HTTP session,它使用URL重写的方式来跟踪会话,会话在指定存...
Pushlet系统的核心组件包括Pushlet Server(推送服务器)、Pushlet Client(推送客户端)以及Event Source(事件源)。Pushlet Server是服务端程序,它接收客户端的连接并保持这些连接打开,等待来自Event Source的...
- 当Producer有新的数据时,通过Pushlet Server将Event发送到客户端,客户端的回调函数会被触发,从而更新页面内容。 4. **项目打包与运行**: 在"mypushlet"压缩包中,应该包含了完整的Pushlet项目源码和配置...
- **Event机制**:《pushlet笔记 Event.htm》讨论了Pushlet中的事件模型,这是其核心工作原理的一部分,通过事件驱动来触发服务器向客户端的推送。 5. **客户端分析**: - **客户端源码**:《(三)Pushlet框架...
1. **Event Dispatcher**:事件调度器是Pushlet的核心组件,它负责处理来自客户端的连接请求,并将这些连接与事件源关联起来。 2. **Publisher**:发布者是产生事件的数据源,它可以是任何能够生成事件的对象,例如...
5. **Event Handling**:当接收到新的推送事件时,客户端需要有能力解析和处理这些事件。这可能涉及到JavaScript回调函数或其他异步处理机制。 6. **Security**:在实际部署中,需要考虑安全问题,如身份验证、授权...
3. **性能优化**:考虑到长连接可能带来的服务器资源占用问题,开发者需要对服务器端代码进行适当的优化,比如使用事件驱动模型(Event-driven model)或异步处理方式来提高效率。 4. **安全性**:安全问题不容忽视,...
1. **客户端**首先发起一个join请求,服务器端接收到请求后,根据Pushlets协议建立Pushlet会话,并返回一个会话id给客户端。 2. **客户端**收到join-ack后,继续发送listen请求,订阅并监听特定主题。 3. **服务器端...
在Pushlets中,客户端首先发起一个join请求,服务器端接收到请求后建立Pushlet会话,并返回一个会话ID。接着,客户端可以订阅特定的主题并监听,服务器端则将订阅请求放入内存队列中。一旦有新的事件产生,服务器...