Archive for the WEB开发 Category

Tomcat管理自定义的线程的关闭与启动

Monday, December 27th, 2010 | Permalink

如果希望在tomcat服务器启动时启动自己定义的线程如webgame的socket监听线程,关闭tomcat服务器是关闭这个线程。我们就需要自定一个Servlet或者是Listener来管理自己的线程。
管理的方式主要是在Servlet的init方法中启动自定义的线程,而在destroy方法中进行关闭。
如果使用Listener来管理的话就需要分别在contextInitialized与contextDestroyed方法中来处理自定义线程的启动与关闭。
下面我们通过具体代码来讲解具体的应用,我的demo使用的是Listener方式管理。
1.自定义一个Listener类。

public class ServerSocketListener implements ServletContextListener {
private ServerMain s;

public void contextInitialized(ServletContextEvent event) {
s = new ServerMain();
s.startServer();
}
//tomcat关闭时,关闭线程,释放端口
public void contextDestroyed(ServletContextEvent event) {
s.stopServer();//停止线程
System.exit(0);//关闭当前的jvm
}
}

2.在web.xml中配置这个监听。

Socket服务随web启动而启动
com.eunut.servlet.ServerSocketListener


就这样就可以通过tomcat的启动与关闭来控制你自定的线程随着应用服务器的操作味儿关闭或启动。

Flex监听Java服务端推送的数据应用DEMO

Friday, November 26th, 2010 | Permalink

因为需要今天研究了一下Flex接收Java端推送的数据,以前做过相应的配置,但是今天在此操作时发现忘得一干二净。好记性不如烂笔头子,所以还只记下来的说。。。。
第一步:首先,创建一个Java web工程将BlazeDS相关包加到工程中接下来配置services-config.xml文件。

在services-config.xml中添加如下代码:

然后配置messaging-config.xml文件。



true
.


配置方法是在messaging-config.xml中添加如下代码:(代码中配置说明如果有疑问还请大家Google吧。。。哈哈)


0

10

5000



第二步:编写服务端代码。

好的配置信息完毕开始写代码。我们需要创建一个实体类用来同步Flex与Java数据类型。

Tick.java

package com.eunut.vo;
import java.math.BigDecimal;

public class Tick {

private String seqno;

public String getSeqno() {
return seqno;
}

public void setSeqno(String seqno) {
this.seqno = seqno;
}
}

因为是测试DEMO所以只写了一个属性

然后编写一个Servlet

package com.eunut.servlet;
import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import com.eunut.vo.Tick;

import flex.messaging.MessageBroker;
import flex.messaging.messages.AsyncMessage;
import flex.messaging.util.UUIDUtils;

public class TickCacheServlet extends HttpServlet {

/**
*
*/
private static final long serialVersionUID = 1L;
private static FeedThread thread;

protected void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {

String cmd = req.getParameter("cmd");
if (cmd.equals("start")) {
start();
}
if (cmd.equals("stop")) {
stop();
}
}

protected void doPost(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
super.doGet(req, resp);
}

public void destroy() {
super.destroy();
}

public void init() throws ServletException {
super.init();
}

public void start() {
if (thread == null) {
thread = new FeedThread();
thread.start();
}
System.out.println("start!!");
}

public void stop() {
thread.running = false;
thread = null;
}

public static class FeedThread extends Thread {

public boolean running = true;

public void run() {
MessageBroker msgBroker = MessageBroker.getMessageBroker(null);
String clientID = UUIDUtils.createUUID();
int i = 0;
while (running) {
Tick tick = new Tick();
tick.setSeqno(String.valueOf(i));
System.out.println(i);

AsyncMessage msg = new AsyncMessage();
msg.setDestination("tick-data-feed");
msg.setHeader(AsyncMessage.SUBTOPIC_HEADER_NAME, "tick");
msg.setClientId(clientID);
msg.setMessageId(UUIDUtils.createUUID());
msg.setTimestamp(System.currentTimeMillis());
msg.setBody(tick);
msgBroker.routeMessageToService(msg, null);
i++;
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
}
}
}
}
}

第三步:编写客户端代码。

客户端简单请见代码:
Tick.as

package com.eunut
{
[RemoteClass(alias="com.eunut.Tick")]
[Bindable]
public class Tick
{
public function Tick()
{
}
public var seqno:String;

}
}

主应用:


第四步:测试码。

首先运行客户端,点击按钮初始化消费者监听。

然后请求Servlet开启数据生产。方法是请求/TickCacheServlet?cmd=start

OK我们在客户端会看见标签上的数字会不断变大。

先写到这,回家。。。。

两个swf通过js通信的demo

Thursday, July 29th, 2010 | Permalink



	
		
	
	


在tomcat下开发Red5应用

Monday, May 10th, 2010 | Permalink

客户端和服务器端的方法相互调用比较重要,在线列表基本上全是用这种方式实现的,当然也有使用RemoteSharedObject来实现的,但本人不太喜欢用RemoteSharedObject,只是用RemoteSharedObject来进行广播等操作。

1.编辑第二篇(抛弃LCDS和FMS,在tomcat下开发Red5应用(第二篇)-建立新的Red5应用)中的Application.java:

Java代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
package red5.example.red5server;
 
import org.red5.server.adapter.ApplicationAdapter;
import org.red5.server.api.IConnection;
import org.red5.server.api.Red5;
import org.red5.server.api.service.IServiceCapableConnection;
 
public class Application extends ApplicationAdapter {
 
	private String userName;
 
	//客户端调用的方法
	public String callFromClient(String userName) {
		this.userName = userName;
		callClient();
		return "Hello:"+userName;
	}
 
	//服务器端调用客户端的方法
	public void callClient() {
		IConnection conn=Red5.getConnectionLocal();
		if (conn instanceof IServiceCapableConnection) {
			IServiceCapableConnection sc = (IServiceCapableConnection) conn;
	        sc.invoke("callFromServer", new Object[]{"hi,"+userName+" this message from server"});
		}
	}
}

PS:记得将编译好的class文件放入webapps\ROOT\WEB-INF\classes。

2.编辑第二篇(抛弃LCDS和FMS,在tomcat下开发Red5应用(第二篇)-建立新的Red5应用)中的red5client001.mxml:

Xml代码

1.
2.
3.    
4.        
44.    
45.

将编译好的swf拷贝到webapps\red5Server目录下。

3.重新启动tomcat 运行浏览器,在地址栏输入http://localhost:8080/red5Server/red5client001.html 看到弹出窗口了吧。

客户端和服务器端方法相互调用就这么简单,实际上原有的基于FMS开发的Flex客户端代码修改量是非常小的。在下一篇将讲解客户端和服务器端方法调用中的参数传递。

浏览器地址栏前边的图标的添加方法

Sunday, May 9th, 2010 | Permalink