亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? controller.java

?? Java下Comet的實現框架Pushlet例子。 實現實時推送數據到客戶端。 服務器每隔30-500MS產生一個隨機數
?? JAVA
字號:
// Copyright (c) 2000 Just Objects B.V. <just@justobjects.nl>// Distributable under LGPL license. See terms of license at gnu.org.package nl.justobjects.pushlet.core;import nl.justobjects.pushlet.util.PushletException;import java.io.IOException;/** * Handles servlet requests from client. * * @author Just van den Broecke - Just Objects &copy; * @version $Id: Controller.java,v 1.9 2007/11/23 14:33:07 justb Exp $ */public class Controller implements Protocol, ConfigDefs {	private Session session;	/**	 * Protected constructor as we create through factory method.	 */	protected Controller() {	}	/**	 * Create instance through factory method.	 *	 * @param aSession the parent Session	 * @return a Controller object (or derived)	 * @throws PushletException exception, usually misconfiguration	 */	public static Controller create(Session aSession) throws PushletException {		Controller controller;		try {			controller = (Controller) Config.getClass(CONTROLLER_CLASS, "nl.justobjects.pushlet.core.Controller").newInstance();		} catch (Throwable t) {			throw new PushletException("Cannot instantiate Controller from config", t);		}		controller.session = aSession;		return controller;	}	/**	 * Handle command.	 */	public void doCommand(Command aCommand) {		try {			// Update lease time to live			session.kick();			// Set remote IP address of client			session.setAddress(aCommand.httpReq.getRemoteAddr());			debug("doCommand() event=" + aCommand.reqEvent);			// Get event type			String eventType = aCommand.reqEvent.getEventType();			// Determine action based on event type			if (eventType.equals(Protocol.E_REFRESH)) {				// Pull/poll mode clients that refresh				doRefresh(aCommand);			} else if (eventType.equals(Protocol.E_SUBSCRIBE)) {				// Subscribe				doSubscribe(aCommand);			} else if (eventType.equals(Protocol.E_UNSUBSCRIBE)) {				// Unsubscribe				doUnsubscribe(aCommand);			} else if (eventType.equals(Protocol.E_JOIN)) {				// Join				doJoin(aCommand);			} else if (eventType.equals(Protocol.E_JOIN_LISTEN)) {				// Join and listen (for simple and e.g. REST apps)				doJoinListen(aCommand);			} else if (eventType.equals(Protocol.E_LEAVE)) {				// Leave				doLeave(aCommand);			} else if (eventType.equals(Protocol.E_HEARTBEAT)) {				// Heartbeat mainly to do away with browser "busy" cursor				doHeartbeat(aCommand);			} else if (eventType.equals(Protocol.E_PUBLISH)) {				// Publish event				doPublish(aCommand);			} else if (eventType.equals(Protocol.E_LISTEN)) {				// Listen to pushed events				doListen(aCommand);			}			// Handle response back to client			if (eventType.endsWith(Protocol.E_LISTEN) ||					eventType.equals(Protocol.E_REFRESH)) {				// Data channel events				// Loops until refresh or connection closed				getSubscriber().fetchEvents(aCommand);			} else {				// Send response for control commands				sendControlResponse(aCommand);			}		} catch (Throwable t) {			warn("Exception in doCommand(): " + t);			t.printStackTrace();		}	}	public String toString() {		return session.toString();	}	/**	 * Handle heartbeat event.	 */	protected void doHeartbeat(Command aCommand) {		// Set heartbeat acknowledgement to client		aCommand.setResponseEvent(new Event(E_HEARTBEAT_ACK));	}	/**	 * Handle Join request.	 */	protected void doJoin(Command aCommand) throws PushletException {		Event responseEvent = null;		try {			session.start();			// Determine format for encoding Events to client.			// Default assume a userAgent window on the other end.			String format = aCommand.reqEvent.getField(P_FORMAT, FORMAT_JAVASCRIPT);			session.setFormat(format);			responseEvent = new Event(E_JOIN_ACK);			// Set unique subscriber id and encoding format			responseEvent.setField(P_ID, session.getId());			responseEvent.setField(P_FORMAT, format);			info("joined");		} catch (Throwable t) {			session.stop();			responseEvent = new Event(E_NACK);			responseEvent.setField(P_ID, session.getId());			responseEvent.setField(P_REASON, "unexpected error: " + t);			warn("doJoin() error: " + t);			t.printStackTrace();		} finally {			// Always set response event in command			aCommand.setResponseEvent(responseEvent);		}	}	/**	 * Handle JoinListen request.	 */	protected void doJoinListen(Command aCommand) throws PushletException {		// Basically bundles a join and a listen		// This request is handly for simple apps that		// need to do a single request to get events immediately		// For example in RESTful apps.		// First do regular join		doJoin(aCommand);		if (!aCommand.getResponseEvent().getEventType().equals(E_NACK)) {			// If successful do the listen			doListen(aCommand);			if (!aCommand.getResponseEvent().getEventType().equals(E_NACK)) {				// If still ok do the listen ack				aCommand.getResponseEvent().setField(P_EVENT, E_JOIN_LISTEN_ACK);			}		}	}	/**	 * Handle Leave request.	 */	protected void doLeave(Command aCommand) throws IOException {		Event responseEvent = null;		try {			// Also removes all subscriptions			session.stop();			// Prepare acknowledgement			responseEvent = new Event(E_LEAVE_ACK);			// Set unique subscriber id			responseEvent.setField(P_ID, session.getId());			info("left");		} catch (Throwable t) {			responseEvent = new Event(E_NACK);			responseEvent.setField(P_ID, session.getId());			responseEvent.setField(P_REASON, "unexpected error: " + t);			warn("doLeave() error: " + t);			t.printStackTrace();		} finally {			// Always set response event in command			aCommand.setResponseEvent(responseEvent);		}	}	/**	 * Handle Listen request.	 */	protected void doListen(Command aCommand) throws PushletException {		String mode = MODE_STREAM;		// Should we always force "pull" mode ?		if (Config.getBoolProperty(LISTEN_FORCE_PULL_ALL)) {			mode = MODE_PULL;		} else {			// Determine optimal mode determined by parameter and/or user agent			// Mode param determines how events are transfered to the client			// In "stream" mode, a stream of events is sent, i.e. the document			// is neverending. In "pull" or "poll" mode a complete document is returned			// ending with a request to refresh.			mode = aCommand.reqEvent.getField(P_MODE, MODE_STREAM);			String userAgent = aCommand.httpReq.getHeader("User-Agent");			if (userAgent != null) {				userAgent = userAgent.toLowerCase();				for (int i = 0; i < Session.FORCED_PULL_AGENTS.length; i++) {					if ((userAgent.indexOf(Session.FORCED_PULL_AGENTS[i]) != -1)) {						info("Forcing pull mode for agent=" + userAgent);						mode = MODE_PULL;						break;					}				}			} else {				userAgent = "unknown";			}		}		getSubscriber().setMode(mode);		// Prepare acknowledgement		Event listenAckEvent = new Event(E_LISTEN_ACK);		// Add subscription(s) if subject(s) specified		String subject = aCommand.reqEvent.getField(P_SUBJECT);		if (subject != null) {			// Optional label for subscription			String label = aCommand.reqEvent.getField(Protocol.P_SUBSCRIPTION_LABEL);			// Add a subscription			Subscription subscription = getSubscriber().addSubscription(subject, label);			// Add subscription id and optional label to listen-ack event			listenAckEvent.setField(P_SUBSCRIPTION_ID, subscription.getId());			if (label != null) {				listenAckEvent.setField(P_SUBSCRIPTION_LABEL, label);			}		}		// Set unique subscriber id, push mode and encoding format		listenAckEvent.setField(P_ID, session.getId());		listenAckEvent.setField(P_MODE, mode);		listenAckEvent.setField(P_FORMAT, session.getFormat());		// Activate the subscriber		getSubscriber().start();		// Enqueue listen ack event on data channel		aCommand.setResponseEvent(listenAckEvent);		info("Listening mode=" + mode + " userAgent=" + session.getUserAgent());	}	/**	 * Handle Publish request.	 */	protected void doPublish(Command aCommand) {		Event responseEvent = null;		try {			String subject = aCommand.reqEvent.getField(Protocol.P_SUBJECT);			if (subject == null) {				// Return error response				responseEvent = new Event(E_NACK);				responseEvent.setField(P_ID, session.getId());				responseEvent.setField(P_REASON, "no subject provided");			} else {				aCommand.reqEvent.setField(P_FROM, session.getId());				aCommand.reqEvent.setField(P_EVENT, E_DATA);				// Event may be targeted to specific user (p_to field)				String to = aCommand.reqEvent.getField(P_TO);				if (to != null) {					Dispatcher.getInstance().unicast(aCommand.reqEvent, to);				} else {					// No to: multicast					debug("doPublish() event=" + aCommand.reqEvent);					Dispatcher.getInstance().multicast(aCommand.reqEvent);				}				// Acknowledge				responseEvent = new Event(E_PUBLISH_ACK);			}		} catch (Throwable t) {			responseEvent = new Event(E_NACK);			responseEvent.setField(P_ID, session.getId());			responseEvent.setField(P_REASON, "unexpected error: " + t);			warn("doPublish() error: " + t);			t.printStackTrace();		} finally {			// Always set response event in command			aCommand.setResponseEvent(responseEvent);		}	}	/**	 * Handle refresh event.	 */	protected void doRefresh(Command aCommand) {		// Set ack		aCommand.setResponseEvent(new Event(E_REFRESH_ACK));	}	/**	 * Handle Subscribe request.	 */	protected void doSubscribe(Command aCommand) throws IOException {		Event responseEvent = null;		try {			String subject = aCommand.reqEvent.getField(Protocol.P_SUBJECT);			Subscription subscription = null;			if (subject == null) {				// Return error response				responseEvent = new Event(E_NACK);				responseEvent.setField(P_ID, session.getId());				responseEvent.setField(P_REASON, "no subject provided");			} else {				String label = aCommand.reqEvent.getField(Protocol.P_SUBSCRIPTION_LABEL);				subscription = getSubscriber().addSubscription(subject, label);				// Acknowledge				responseEvent = new Event(E_SUBSCRIBE_ACK);				responseEvent.setField(P_ID, session.getId());				responseEvent.setField(P_SUBJECT, subject);				responseEvent.setField(P_SUBSCRIPTION_ID, subscription.getId());				if (label != null) {					responseEvent.setField(P_SUBSCRIPTION_LABEL, label);				}				info("subscribed to " + subject + " sid=" + subscription.getId());			}		} catch (Throwable t) {			responseEvent = new Event(E_NACK);			responseEvent.setField(P_ID, session.getId());			responseEvent.setField(P_REASON, "unexpected error: " + t);			warn("doSubscribe() error: " + t);			t.printStackTrace();		} finally {			// Always set response event in command			aCommand.setResponseEvent(responseEvent);		}	}	/**	 * Handle Unsubscribe request.	 */	protected void doUnsubscribe(Command aCommand) throws IOException {		Event responseEvent = null;		try {			String subscriptionId = aCommand.reqEvent.getField(Protocol.P_SUBSCRIPTION_ID);			if (subscriptionId == null) {				// Unsuscbribe all				getSubscriber().removeSubscriptions();				responseEvent = new Event(E_UNSUBSCRIBE_ACK);				responseEvent.setField(P_ID, session.getId());				info("unsubscribed all");			} else {				// Subscription id provided: remove Subscription				Subscription subscription = getSubscriber().removeSubscription(subscriptionId);				if (subscription == null) {					// Unknown subscription id: return error response					responseEvent = new Event(E_NACK);					responseEvent.setField(P_ID, session.getId());					responseEvent.setField(P_REASON, "no subscription for sid=" + subscriptionId);					warn("unsubscribe: no subscription for sid=" + subscriptionId);				} else {					// OK return ack					responseEvent = new Event(E_UNSUBSCRIBE_ACK);					responseEvent.setField(P_ID, session.getId());					responseEvent.setField(P_SUBSCRIPTION_ID, subscription.getId());					responseEvent.setField(P_SUBJECT, subscription.getSubject());					if (subscription.getLabel() != null) {						responseEvent.setField(P_SUBSCRIPTION_LABEL, subscription.getLabel());					}					info("unsubscribed sid= " + subscriptionId);				}			}		} catch (Throwable t) {			responseEvent = new Event(E_NACK);			responseEvent.setField(P_ID, session.getId());			responseEvent.setField(P_REASON, "unexpected error: " + t);			warn("doUnsubscribe() error: " + t);			t.printStackTrace();		} finally {			// Always set response event in command			aCommand.setResponseEvent(responseEvent);		}	}	public Subscriber getSubscriber() {		return session.getSubscriber();	}	/**	 * Send response on the control channel.	 */	protected void sendControlResponse(Command aCommand) {		try {			// Try to prevent caching in any form.			aCommand.sendResponseHeaders();			// Let clientAdapter determine how to send event			aCommand.getClientAdapter().start();			// Push to client through client adapter			aCommand.getClientAdapter().push(aCommand.getResponseEvent());			// One shot response			aCommand.getClientAdapter().stop();		} catch (Throwable t) {			session.stop();		}	}	/**	 * Info.	 */	protected void info(String s) {		session.info("[Controller] " + s);	}	/**	 * Exceptional print util.	 */	protected void warn(String s) {		session.warn("[Controller] " + s);	}	/**	 * Exceptional print util.	 */	protected void debug(String s) {		session.debug("[Controller] " + s);	}}/* * $Log: Controller.java,v $ * Revision 1.9  2007/11/23 14:33:07  justb * core classes now configurable through factory * * Revision 1.8  2005/02/28 15:58:05  justb * added SimpleListener example * * Revision 1.7  2005/02/28 13:05:59  justb * introduced join-listen protocol service * * Revision 1.6  2005/02/28 12:45:59  justb * introduced Command class * * Revision 1.5  2005/02/28 09:14:55  justb * sessmgr/dispatcher factory/singleton support * * Revision 1.4  2005/02/25 15:13:00  justb * session id generation more robust * * Revision 1.3  2005/02/21 16:59:06  justb * SessionManager and session lease introduced * * Revision 1.2  2005/02/21 12:32:28  justb * fixed publish event in Controller * * Revision 1.1  2005/02/21 11:50:46  justb * ohase1 of refactoring Subscriber into Session/Controller/Subscriber * * */

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
久久免费视频一区| 天使萌一区二区三区免费观看| 国产精品国产自产拍高清av| 亚洲综合免费观看高清完整版在线 | 精品黑人一区二区三区久久| 亚洲三级电影网站| 韩日精品视频一区| 欧美自拍丝袜亚洲| 中文字幕中文字幕中文字幕亚洲无线| 丝瓜av网站精品一区二区| 99久久精品免费看| 久久久影视传媒| 日韩一区欧美二区| 色综合天天性综合| 国产校园另类小说区| 另类中文字幕网| 91精品国产综合久久久久久漫画| 亚洲欧美日韩国产手机在线| 国产成人综合在线| 亚洲精品一区二区三区福利| 日韩二区三区四区| 在线播放日韩导航| 亚洲v中文字幕| 欧美网站一区二区| 亚洲综合另类小说| 日本韩国精品在线| 亚洲综合在线观看视频| 成人精品高清在线| 国产精品国产a级| 91视视频在线观看入口直接观看www| 久久奇米777| 国产精品一区一区三区| 精品国产网站在线观看| 久久成人羞羞网站| 精品国产三级电影在线观看| 国产一区二区三区四区五区美女 | 黄色日韩网站视频| 日韩欧美久久一区| 国产自产v一区二区三区c| 日韩美女视频在线| 韩国欧美国产1区| 国产精品丝袜黑色高跟| www.av精品| 一区二区久久久久| 欧美精品在线观看播放| 久久国产精品99久久人人澡| 欧美成人精品二区三区99精品| 久久精品国产免费| 国产精品美日韩| 欧美在线短视频| 蜜桃视频在线观看一区二区| 欧美电影免费观看高清完整版 | 91色视频在线| 洋洋av久久久久久久一区| 精品婷婷伊人一区三区三| 丝袜美腿亚洲色图| 国产三级精品三级| 91在线视频免费观看| 香蕉久久一区二区不卡无毒影院| 欧美一区二区三区免费视频| 国产精品99久久久久久久女警 | 国产精品久久久久久久久晋中| 一本一道波多野结衣一区二区| 亚洲大尺度视频在线观看| 欧美不卡一区二区| 99精品1区2区| 奇米四色…亚洲| 国产精品看片你懂得| 欧美日韩三级在线| 成人一区二区三区视频| 亚洲mv在线观看| 日本一区二区三区视频视频| 欧美图片一区二区三区| 国模娜娜一区二区三区| 亚洲午夜久久久久久久久久久| 久久久久亚洲综合| 欧美日韩激情在线| 成人激情视频网站| 裸体歌舞表演一区二区| 亚洲另类色综合网站| 久久众筹精品私拍模特| 欧美亚洲国产一区在线观看网站| 国产伦精品一区二区三区视频青涩| 亚洲欧美综合另类在线卡通| 欧美va亚洲va在线观看蝴蝶网| 91黄视频在线观看| 成人av综合在线| 国产毛片精品视频| 日韩不卡一区二区三区| 亚洲宅男天堂在线观看无病毒| 国产女主播视频一区二区| 欧美情侣在线播放| 在线看国产一区二区| 成人中文字幕在线| 国产麻豆视频精品| 国产资源精品在线观看| 青青草97国产精品免费观看| 一区二区三区欧美久久| 亚洲欧洲精品天堂一级 | 日韩精品中午字幕| 欧美日韩日日骚| 色狠狠综合天天综合综合| 成人网在线免费视频| 国产精品一区免费在线观看| 久久91精品国产91久久小草| 蜜桃视频在线观看一区| 青青草91视频| 蜜桃视频免费观看一区| 秋霞av亚洲一区二区三| 偷窥国产亚洲免费视频| 五月天精品一区二区三区| 亚洲一区二区三区免费视频| 亚洲一二三级电影| 婷婷成人综合网| 免费精品视频在线| 国内国产精品久久| 国产成人av福利| 国产精品亚洲午夜一区二区三区 | 韩国v欧美v亚洲v日本v| 韩国欧美国产一区| 国产成人在线免费观看| 国产成人综合在线观看| 丁香天五香天堂综合| 成人美女视频在线观看18| 成人动漫一区二区三区| 9i看片成人免费高清| 在线免费观看日韩欧美| 欧美一区在线视频| 久久香蕉国产线看观看99| 国产午夜精品一区二区三区视频| 国产丝袜在线精品| 成人免费一区二区三区在线观看| 亚洲色欲色欲www| 午夜精品久久久久久| 九九热在线视频观看这里只有精品| 国内外精品视频| av成人动漫在线观看| 欧美在线观看视频一区二区| 91麻豆精品国产91久久久资源速度 | 欧美日韩一区二区在线观看| 欧美三级午夜理伦三级中视频| 欧美色倩网站大全免费| 日韩欧美精品在线视频| 欧美经典一区二区| 亚洲欧美日本在线| 男女男精品视频网| 懂色一区二区三区免费观看| 一本久久a久久精品亚洲| 555夜色666亚洲国产免| 国产亚洲成av人在线观看导航| 国产视频一区在线播放| 国产精品久久久久国产精品日日| 午夜精品123| 国产激情视频一区二区三区欧美| 色综合久久综合中文综合网| 欧美午夜精品电影| 亚洲精品一区二区三区精华液| 自拍偷自拍亚洲精品播放| 青青草视频一区| 色天天综合久久久久综合片| 91精品免费观看| 国产精品久久久久影视| 全部av―极品视觉盛宴亚洲| 国产成人av电影在线播放| 欧美性一区二区| 久久久久久久久久久99999| 一区av在线播放| 国产传媒欧美日韩成人| 欧美三级午夜理伦三级中视频| 国产午夜精品美女毛片视频| 亚洲一区二区三区四区的| 国产夫妻精品视频| 欧美精品在线观看一区二区| 国产精品久久午夜夜伦鲁鲁| 另类小说色综合网站| 欧美精品一级二级三级| 国产精品三级久久久久三级| 老司机精品视频导航| 欧美最猛性xxxxx直播| 国产精品国产三级国产a| 日韩av午夜在线观看| 欧美在线免费观看视频| 久久久五月婷婷| 国产麻豆一精品一av一免费 | 亚洲在线视频网站| 国产在线精品免费| 欧美日本免费一区二区三区| 综合久久国产九一剧情麻豆| 国产69精品久久777的优势| 91精品国产综合久久久久久久久久| 亚洲日本电影在线| 99久精品国产| 国产精品美女久久久久久2018| 日韩高清在线不卡| 在线免费观看不卡av| 一区二区三区在线免费观看| 波多野结衣中文字幕一区二区三区| 日韩欧美亚洲国产精品字幕久久久| 日韩国产欧美在线播放| 欧美日韩国产高清一区二区|