论坛首页 入门技术论坛

Applet + Javascript 替代 comet 轮回 pull

浏览 2969 次
该帖已经被评为新手帖
作者 正文
   发表时间:2010-08-01   最后修改:2010-08-01

对于不熟悉flex的童鞋,要做一些像聊天等交互性功能,用applet + js也是很容易实现的——而且,跨浏览器,js也容易操作dom进行页面内容展示。

 

1. 建立一个工程,compiler level设置1.3

2. 找到jre lib 下的plugin.jar,导入路径

3. 写一个比较通用的socket client applet,暴露一些主要方法,比如jsFunCall connect close send,connect方法里开启一个domain thread负责接收处理数据(最好是以接口形式)

 

话说actionscript那种socket方法回调那是一个简单啊!java线程小麻烦了点。

package com.cisee.appletjs;

import java.applet.Applet;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;
import java.util.Random;

import netscape.javascript.JSException;
import netscape.javascript.JSObject;

public abstract class JsApplet extends Applet {

	/** Socket */
	private Socket sock = null;
	/** Input Stream */
	private InputStream is = null;
	/** Output Stream */
	private OutputStream os = null;
	
	private final int port = 12800;
	private final String host = "127.0.0.1";

	/** win JSObject */
	protected JSObject win = null;
	/** doc JSObject */
	protected JSObject doc = null;

	/** Is connected? */
	protected boolean connected = false;
	
	Thread reviever;
	
	String userid;
	String toUserid;

	protected String getInfo() {
		return "Cisee Applet Javascript Interpretor Operation";
	}

	public void init() {
		logMsg("Init..");
		userid = System.currentTimeMillis() + "_" + new Random().nextInt(100);
	}

	public void destroy() {
		closeConnect();
	}

	/**
	 * JS Object 
	 */
	protected JSObject getWin() {
		if (win == null)
			win = JSObject.getWindow(this);
		return win;
	}

	protected JSObject getDoc() {
		if (doc == null)
			doc = (JSObject) getWin().getMember("document");
		return doc;
	}

	public abstract void processMessage(final String msg);

	/**
	 * Send message to server.
	 * @param msg message that will be sent.
	 */
	void sendToServer(final String msg) {
		if (connected) {
			try {
				logMsg(msg);
				os.write((msg).getBytes());
				os.write("\r\n".getBytes());
				os.flush();
			} catch (IOException e) {
				logMsg("Stream write error.", e);
			}
		} else {
			wincall("warn_notconnected", null);
		}
	}

	/**
	 * Close connection.
	 */
	void closeConnect() {
		if(reviever != null)
			reviever.stop();
		
		connected = false;
		if (sock != null) {
			try {
				sock.close();
			} catch (IOException e) {
				e.printStackTrace();
			}
			sock = null;
		}
	}

	/**
	 * Call function of outside explorer's script.
	 * @param function function name.
	 * @param param Parameter values.
	 */
	protected void wincall(final String function, final Object[] param) {
		Object[] realParam = param == null?new Object[0]:param;
		try {
			getWin().call(function, realParam);
		} catch (JSException e) {
			callAlert(
					"function : "
					+ function
					+ "(arg*"
					+ realParam.length
					+ ") is exist?");
		}
	}

	/**
	 * Call alert function of outside explorer's script.
	 * @param msg Message.
	 */
	protected void callAlert(final String msg) {
		try {
			getWin().call("alert", new String[] { msg });
		} catch (JSException e1) {
			e1.printStackTrace();
		}
	}

	/**
	 * Log message when debug is true.
	 * @param msg Message.
	 */
	protected void logMsg(final String msg) {
		System.out.println(msg);
	}

	/**
	 * Log message when debug is true.
	 * @param msg Message.
	 * @param e Exception.
	 */
	protected void logMsg(final String msg, final Throwable e) {
		System.out.println(msg + "\r\nCause : " + e.getMessage());
		e.printStackTrace();
	}

	/**
	 * Connect to server.
	 */
	public void connect() {
		if (connected) {
			return;
		}
		logMsg("Connect to server..."); 

		try {
			// Conect to server..
			sock = new Socket(host, port);
			is = sock.getInputStream();
			os = sock.getOutputStream();

			connected = true;
			
			// Thread that receive messages.
			reviever = new Thread() {
				public void run() {
					try {
						while (sock != null && !sock.isClosed()) {
							if (is.available() != 0) {
								byte[] buf = new byte[is.available()]; 
								is.read(buf); 

								String line = new String(buf).trim();
								processMessage(line);
							}
						}
					} catch (IOException e) {
						logMsg("Error..", e);
					} finally {
						if (connected) {
							closeConnect();
							wincall("warn_connect_failed", null);
						}
					}
				}
			};
			reviever.setDaemon(true);
			reviever.start();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}

	public void sendMsg(final String toId, final String msg) {
		try {
			// TODO
			sendToServer(msg);
		} catch (Exception e1) {
			logMsg("Error in sendMsg", e1);
		}
	}

	public void quit() {
		try {
			sendToServer("quit");
			closeConnect();
			wincall("applet_quit", null);
		} catch (Exception e) {
			logMsg("Error in quit", e);
		}
	}

	public boolean isConnected() {
		return connected;
	}

}
 
   发表时间:2010-09-02  
我最近在研究APPLET,把你的项目法给我研究下吧,谢谢了
txd.1234@163.com
0 请登录后投票
   发表时间:2010-09-02  
shiny_txd 写道
我最近在研究APPLET,把你的项目法给我研究下吧,谢谢了
txd.1234@163.com


我并没做项目……而且这个类已经n清晰了,你可以自己做一个applet,用html只需要写几个js方法就行了。

有问题了再一起探讨。
0 请登录后投票
   发表时间:2010-09-03  
lz客户机需不需要安装jre?
0 请登录后投票
   发表时间:2010-09-04  
1. 建立一个工程,compiler level设置1.3

各个浏览器包括ie的visual J,不装任何插件,都是支持1.3的Applet的(不是JApplet)

不信,你可以试试
0 请登录后投票
   发表时间:2010-10-26  
果然不能逆大流——

java applet那个消耗CPU啊,比视频flash都严重。。

只是一个客户端socket,开一个后台监听线程而已。抛弃了。。
0 请登录后投票
论坛首页 入门技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics