Flash与Java Servlet结合实现网上对战

servlet

  作者联系方式:QQ:4077130 E-mail:xiake1860@ncepubj.edu.cn

  用Flash制作的游戏网上有很多,但鲜有可以支持网间对战的游戏。要实现网上对战,就必须要有后台服务器的支持。本文就通过一个简单的实例

  来探讨一下如何通过Flash与Java Servlet的结合实现网间对站。需要注意的是,本文读者需要有一定的Flash与Java Servlet编程知识。

  游戏运行画面如下:

点击这里下载源文件

  在“Servlet地址”中填入你的Servletr的影射地址,然后“输入名字”中填一个名字(必须),点击“开始”运行。

  你用方向键可以控制写有名字的小车(实例名为"car")在舞台运动,如果有多人登陆,你就可以看到别的小车在运动。

  分析:

  对于自己小车的控制可以通过flash前台来实现,要在舞台上看到别人的小车运动,就需要从后台Servlet上下载别人小车的相关数据(name,xPos,yPos)。为了让别人也能看到我的小车,我也必须把小车的数据发到Servlet上,以供别人读取。我们通过LoadVars对象将相关数据发到服务器,服务器将所有的信息写入一个XML文档,我们将些文档加载到XML对象中,通过解析它,获得所有的小车信息,然后根据这些信息,在舞台上绘制小车。我们得到的XML文档形式如下:

<players>

<player name="BBYY" xPos="309.95" yPos="214.95"/>

<player name="BiTao" xPos="200.0" yPos="100.0"/>

</players>

  实现:

  1.新建Flash文档,新建一个电影剪辑,取名为“car”,也就是我们要控制的小车,在里边画一个小车图(为他简便我画了一个圆)。画好这后,打开影片库,找到这个剪辑,右击它的名字,选择“链接”,在“标识符”中填入“car”,并勾选 “为动作脚本导出”和“在第一帧导出”。

  2.从组件面板中,拖两个TextInput组件到舞台,分别将实例命名为“nameInput”,“urlInput”,用来输名字和服务器地址。再拖一个Button组件到舞台,命名为“submitBT”,用来开始游戏。从影片库里,拖一个"car"到舞台中央,命名为"car",就是我们要控制的小车。

  3.打开动作面板,我们先来实现对小车的控制。(此处代码只为解释,具体见源文件)

  要对键盘监听,需要建一个监听器对象,var listenerKey:Object=new Object();

  然后,添加一个监听事件

listenerKey.onKeyDown=function(){
if(_root.started){ //_root.started 为全局变量,初始为false,当点击“submitBT”时,设其为true,即游戏开始
var m:MovieClip=_root.car;
var speed=3; //小车运动速度
if(Key.isDown(Key.LEFT)){
m._x-=speed;
}
if(Key.isDown(Key.RIGHT)){
m._x+=speed;
}
if(Key.isDown(Key.UP)){
m._y-=speed;
}
if(Key.isDown(Key.DOWN)){
m._y+=speed;
}
}
}

  为Key添加监听器:

Key.addEventListener(listenerKey);

  运行影片,小车会随按键运动。

  4。为了能够和服务器进行交互,需要建立两个对象。

var send_lv:LoadVars=new LoadVars();//用来向服务器发送数据

var get_lv:XML=new LoadVars();//用来从服务器加载数据,加载类型为XML文档

  5。为了不断地刷新服务器,输入以下语句:

_root.onEnterFrame=function(){
if(_root.started){
if(_root.get_lv.loaded){ //如果上次数据加载成功的话
_root.send_lv.xPos=_root.car._x;
_root.send_lv.yPos=_root.car._y; //将小车的坐标付给发送对象
_root.send_lv.sendAndLoad(url_service,_root.get_lv,"GET"); //将数据发送到服务器,并用“get_lv”来接受返回数据
}
}
}

  6。当 “get_lv”加载成功后,我们需要对它进行解析,并根据得到的数据将服务器上所有的小车在舞台上绘制出来。

get_lv.onLoad=function(ok:Boolean){
if(ok){
var nodes=get_lv.firstChild.childNodes;//"nodes" 里存储了从服务器上取得的所有小车的信息
var len_nodes:Number=nodes.length;
var len_players:Number=_root.players.length;//“_root.players” 是一个数组,里面储存了所有已经在舞台上绘出的小车名字
trace(len_nodes);

var i=j=0;
for(i=0;i<len_nodes;i++){
var addNew:Boolean=false;
for(j=0;j<len_players;j++){
if(_root.players[j]==nodes[i].attributes.name){
j=len_players+1;
}
if(j==(len_players-1))addNew=true;
}
if(addNew){ //上面的代码用来判断是否有新的小车加入;如果有的话,我们要根据它的名字,将它绘出来
_root.players.push(nodes[i].attributes.name);//将新小车的名字加入数组
_root.attachMovie("car",nodes[i].attributes.name,_root.getNextHighestDepth());//将新小车绘出
_root[nodes[i].attributes.name].name.text=nodes[i].attributes.name;//设置小车名字
}
_root[nodes[i].attributes.name]._x=nodes[i].attributes.xPos;
_root[nodes[i].attributes.name]._y=nodes[i].attributes.yPos;//根据名字刷新舞台上小车的位置。

}

}

  7.为"submintBT"加入动作:

listenerBt.click=function(){

if(!(_root.nameInput.text=="")){

_root.started=true;
_root.send_lv.xPos=_root.car._x;
_root.send_lv.yPos=_root.car._y;
_root.send_lv.name=_root.nameInput.text;

if(_root.urlInput.text!=""){
_root.url_service=_root.urlInput.text;
}

_root.players.push(_root.nameInput.text);
_root.car.name.text=_root.nameInput.text;
}

}
submitBt.addEventListener("click",listenerBt);

  OK了,前台就做好了!下面来看如何来编写Servlet.

  8。我们需要一个Pos类来描绘小车的位置,一个Player类来代表小车,一个Service类来接收请求并输出XML文档。前两个类就不一一介绍了,我们只来看一下Service如何接受请求,并绘出XML文档。其代码如下:

import java.io.*;
import java.util.*;
import javax.servlet.*;
import javax.servlet.http.*;

public class Service extends HttpServlet{

public void doGet(HttpServletRequest request,
HttpServletResponse response)
throws IOException,ServletException{

PrintWriter out = response.getWriter();

//建立一个全局对象来存储所有信息
Hashtable players=(Hashtable)(this.getServletContext().getAttribute("players"));
try{

if(players==null){
players=new Hashtable();
this.getServletContext().setAttribute("players",players);
}

}catch(Exception e){
out.println(e.toString());
}

String player_name=request.getParameter("name");
String x=request.getParameter("xPos");
String y=request.getParameter("yPos");//从请求者处获得数据
Pos newPos=new Pos(Double.parseDouble(x),Double.parseDouble(y));
if(players.containsKey(player_name)){//如果不是新的请求者,将它的Pos加入;否则新建一个请求对象
Player player=(Player)(players.get(player_name));
player.addPos(newPos);
if(player.getPath().size()>100){player.getPath().remove(0);}
}else{
Player newPlayer=new Player(player_name);

newPlayer.addPos(newPos);
players.put(player_name,newPlayer);
}
Vector allPlayers=new Vector(players.values());

//将所有请求者的最新位置以XML形式输出
response.setContentType("text/xml");
out.print("<players>");
for(int i=0;i<allPlayers.size();i++){
Player p=(Player)(allPlayers.get(i));
out.print("<player ");
out.print("name=\""+p.getName()+"\" ");
out.print("xPos=\""+p.getCurrentPos().getX()+"\" ");
out.print("yPos=\""+p.getCurrentPos().getY()+"\">");
out.print("</player>");
}
out.print("</players>");

}
}

  9。将所有.java文件编译成.class文件,并在你的服务器上配置好,为"Service"进立一个映射,你运行时要添入的URL地址,就是此映射地址。运行你的.swf文件,OK!

时间: 2024-10-28 12:55:37

Flash与Java Servlet结合实现网上对战的相关文章

Java Servlet 和 JSP教程(1)

js|servlet|教程 1 概述 1.1 Java Servlet及其特点 Servlet是Java技术对CGI编程的回答.Servlet程序在服务器端运行,动态地生成Web页面.与传统的CGI和许多其他类似CGI的技术相比,Java Servlet具有更高的效率,更容易使用,功能更强大,具有更好的可移植性,更节省投资(更重要的是, Servlet程序员收入要比Perl程序员高:-): 高效 在传统的CGI中,每个请求都要启动一个新的进程,如果CGI程序本身的执行时间较短,启动进程所需要的开

JSP和Java Servlet的技术概述以及比较

js|servlet|比较 Java Servlet及其特点 Servlet是Java技术对CGI编程的回答.Servlet程序在服务器端运行,动态地生成Web页面.与传统的CGI和许多其他类似CGI的技术相比,Java Servlet具有更高的效率,更容易使用,功能更强大,具有更好的可移植性,更节省投资(更重要的是, Servlet程序员收入要比Perl程序员高:-): 高效: 在传统的CGI中,每个请求都要启动一个新的进程,如果CGI程序本身的执行时间较短,启动进程所需要的开销很可能反而超过

Java Servlet及Cookie的使用

cookie|servlet 本文介绍了Java Servlet编程所需的软件及环境配置.只要你有一台安装Windows 95/98了的PC机,便可以按照本文的步骤开发Servlet程序了.本文同时给出了通过Java Servlet向用户的硬盘写入和读取Cookie的方法及例程.通过它可以实现网上常见的个性化网页.网上购物篮.密码验证等. Java Servlet是运行于Web服务器上的Java代码,它可以接受用户请求,进行相应的处理,并向用户提供反馈.其作用类似于CGI程序,可以实现网页中很多

Java Servlet 和 JSP入门教程(1)

js|servlet|教程|入门教程 Java Servlet 和 JSP教程(1) 1 概述 1.1 Java Servlet及其特点 Servlet是Java技术对CGI编程的回答.Servlet程序在服务器端运行,动态地生成Web页面.与传统的CGI和许多其他类似CGI的技术相比,Java Servlet具有更高的效率,更容易使用,功能更强大,具有更好的可移植性,更节省投资(更重要的是, Servlet程序员收入要比Perl程序员高:-): 高效 在传统的CGI中,每个请求都要启动一个新的

Java Servlet API说明文档

译者前言: 近来在整理有关Servlet资料时发现,在网上竟然找不到一份中文的Java Servlet API的说明文档,而在有一本有关JSP的书后面附的Java Servlet API说明竟然不全,而这份文档的2.1a版在1998年的11月份就已定稿.所以我决定翻译一份中文的文档(其中一些与技术关系不大的部分已被略去),有兴趣的读者可以从http://java.sun.com/products/servlet/2.1/servletspec-2.1.zip下载原文阅读. Java Servle

Java Servlet及Cookie的使用_JSP编程

    本文介绍了Java Servlet编程所需的软件及环境配置.只要你有一台安装Windows 95/98了的PC机,便可以按照本文的步骤开发Servlet程序了.本文同时给出了通过Java Servlet向用户的硬盘写入和读取Cookie的方法及例程.通过它可以实现网上常见的个性化网页.网上购物篮.密码验证等. Java Servlet是运行于Web服务器上的Java代码,它可以接受用户请求,进行相应的处理,并向用户提供反馈.其作用类似于CGI程序,可以实现网页中很多交互式效果,但比CGI

用Java Servlet构建旗帜广告系统

对于一个商务网站来说,广告系统是必不可少的.一个好的广告系统是一个网站稳定收入的基础.而旗帜广告(banner)则是网站广告中占绝大部分的广告,因此开发一个旗帜广告系统就非常重要了.利用Java Servlet 我们可以很轻松的构建属于我们自己的旗帜广告系统. 我们一般在网页上放上一些图片,设置它们的链接指向广告客户的网页,然后产生日志文件存放浏览的人数,浏览者的IP等信息,这就是开发旗帜广告系统的一般思路. 下面,我想结合一个例程来介绍一下如何使用Java Servlet来构建旗帜广告系统.这

Java Servlet 编程及应用(一)

一.概述 Servlet是一种独立于平台和协议的服务器端的Java应用程序,可以生成动态的Web页面. Servlet是位于Web 服务器内部的服务器端的Java应用程序,与传统的从命令行启动的Java应用程序不同,Servlet由Web服务器进行加载,该Web服务器必须包含支持Servlet的Java虚拟机. Java Servlet 与 Applet 的比较: 相似之处: * 它们不是独立的应用程序,没有main()方法. * 它们不是由用户或程序员调用,而是由另外一个应用程序(容器)调用.

Java Servlet 编程及应用之二

编写Servlet所需要的开发环境 进行Servlet开发所需要的基本环境是JSDK以及一个支持Servlet的Web服务器. 1.JSDK(Java Servlet Development Kit) JSDK包含了编译Servlet应用程序所需要的Java类库以及相关的文档.对于利用Java 1.1进行开发的用户,必须安装JSDK.JSDK已经被集成进Java 1.2 Beta版中,如果利用Java 1.2或以上版本进行开发,则不必安装JSDK. JSDK可以在Javasoft公司的站点免费下