jsp/servlet用推技术实现聊天室,有做过或有相关好资料的麻烦您啦~
最好付源代码,如果鉴于个人成果也可以给部分么。急求啊!!!!
最好付源代码,如果鉴于个人成果也可以给部分么。急求啊!!!!
解决方案 »
- struts+hibernate+jquery遇到的问题,急~~~~~!!!求救~!!!
- 怎样将写好的网页放到已经申请成功域名的空间上???
- 大家探讨一下,struts2标签到底好用吗?
- 谁知道twaver.jar中保存图片的实现方法
- 两句简单代码,找错误,急中............
- Java中反射的应用
- 求救:如何实现用Java打印报表的功能
- jsp连接sql server2000数据库的问题
- hibernate配置c3p0连接池出现下面这些警告,配置的属性都将被ignored,这是怎么会是呢,还是就是我怎么知道c3p0启用了呢
- 关于用iText生成pdf组件的定位问题,请帮忙解答
- 怎样在jsp中操作excel,实现远程excel文件上传到数据库服务器
- 为什么JSP页面不能弹出提示框?
结合JavaScript帧间通信和一个管理网络通信的Java Applet,我们能够用推送技术解决这个问题。在这样一个系统中,Java Applet的任务是连接服务器并监听内容更新。一旦接收到了新的内容,Applet就构造出显示这些新内容的HTML代码,调用一个JavaScript函数并把包含新内容的HTML传递给JavaScript函数。JavaScript函数运用DHTML和DOM技术,把页面中一个<div>标记的内容用参数中传入的新内容替换。由于浏览器安全的限制,Applet所打开的Socket端口只能连接到下载该Applet的服务器。 Web服务器只在80端口监听连接请求。因此,除了Web服务器之外,我们还需要一个接受Applet的Socket连接请求的网络应用服务。这个网络应用服务定时地查询数据库,改动把数据发布(推送)所到有已经连接的Applet。由于运用了隐藏帧和JavaScript的帧间通信功能,我们能够从用户面前隐藏大多数JavaScript逻辑。 在这整个处理过程中,最困难的任务是Java Applet与JavaScript代码之间的通信。Netscape提供了一个称为netscape.javascript.JSObject的类。要使用这个对象,请加入一个包含特殊“MAYSCRIPT”属性的Applet标记: <APPLET code="MyApplet.class" height=1 width=1 MAYSCRIPT> JSObject的方法允许Applet与文档对象交互以及调用JavaScript命令。例如,把下面的代码放入Applet,我们就能够访问窗口对象: import netscape.javascript.*; public class MyApplet extends java.applet.Applet{ private JSObject mainwin; public void init(){ mainwin = JSObject.getWindow(this); } } 获得JSObject引用后,我们就能够访问文档窗口对象,并通过JSObject的eval()方法调用JavaScript函数。 用DHTML更新页面
在把来自Applet的新内容写入文档时,为了不影响原来已经存在的内容,我们可以使用HTML的<div></div>标记。这个标记在IE和Netscape中是不同的。 对于IE以及Netscape 6,这个HTML标记是: // 所有要更新的内容必须用id标识 <div id="iexplorer" width=700px ></div>
对于Netscape 4.x版本,这个HTML标记是: <DATA><layer id="netscapev" ></layer></DATA> 虽然我们可以通过引用适当的ID,从Applet直接更新HTML内容,但为了清楚起见,我们将把更新HTML代码的程序逻辑放入JavaScript函数。下面的JavaScript代码把浏览器的类型保存到ie变量: applnname=navigator.appName; if(applnname=="Microsoft Internet Explorer") { ie=true; } else { ie=false; } Applet从新数据构造出HTML代码,把它保存到JavaScript变量content,然后调用assignData()方法。内容数据可以是从纯HTML到XML到二进制数据的任何东西。 // 根据浏览器类型调用合适的方法 function assignData() { if(ie) {explore();} else {navig(); } }
如果浏览器是IE或者Netscape 6,Applet调用explore()方法: //content是一个javascript变量,它以HTML格式描述了需要 //显示的新数据 function explore() { iexplorer.innerHTML=content; } 如果浏览器是Netscape 4.0或者更高版本,Applet调用navig()方法: function navig() { document.netscapev.document.write(“<DATA>“ + content + “</DATA>“); document.netscapev.document.close(); } 通信过程
在服务器端,一个ImageAppliation.java类的实例响应Socket连接请求,并为每一个新的连接请求创建一个新的线程。为了简化代码,每一个线程只检查数据文件是否改变。如果数据文件已经改变,则线程读取文件内容,并把新的数据发送给已经连接的Applet(示例应用把整个文件发送给Applet)。 在客户端,一个隐藏帧包含了ImageApplet.java这个Applet,因此用浏览器的查看HTML源代码功能是无法看到Applet标记的。Applet实现了连接服务器(下载该Applet的源服务器)的功能,并实现了一个简单的通信协议。建立与服务器的连接之后,Applet接收来自服务器的数据,构造出HTML代码,并调用JavaScript函数把数据传入文档: public void upDateHTML(String str){ //data是表单的名字, //quote是一个JavaScript变量 //str是新构造出来的HTML代码 mainwin.eval("document.data.quote.value=“" + str + "“"); mainwin.eval("javascript:assignData()"); return; } netscape.javascript.JSObject完成Applet到JavaScript的通信,不同版本的客户端浏览器需要不同的版本。你可以下载得到为Netscape提供的压缩类文件java40.jar。IE已经带有JSObject类,但有点难找。你可以搜索$windows$\Java\Packages目录寻找包含JSObject类的ZIP文件。 服务器把ImageArrayElement.java类的实例通过toString()方法串行化成为字符串发送给Applet。服务器从数据文件构造出各个对象,调用toString()方法,连接得到代表所有对象的字符串,最后发送结果字符串。而在另一端,Applet接收并解析这个字符串,重新构造出各个ImageArrayElement对象。这里之所以用一个长字符串的形式发送数据,是因为这种方法只需要很简单的处理过程,使得用户能够以接近实时的速度立即得知数据的变化;但是,我们也可以用另外一种方法,即以向量的形式发送对象。 在一个正式运行的应用中,你一般应该让新数据插入当前页面的过程透明。但在示例应用中,为了让程序运行过程更加直观,它将在新内容到达的时候提示用户。 推送技术最主要的优点就是应用服务器只把那些改变的数据发送到网络,从而使得延迟减到了最少。由于这个Applet负责完成的工作非常少(不涉及用户界面,这部分工作由浏览器负责),所以Applet体积很小,装载速度非常快。
1一个frame里的js可能向另一个frame添加内容
2一个frame可以自动不断的刷新/http post/get
3一个frame可以用js控制滚动到第10000000行如果你做过可以理解
import javax.servlet.*;
import javax.servlet.http.*;import com.oreilly.servlet.MultipartResponse;
import com.oreilly.servlet.ServletUtils;public class Countdown extends HttpServlet
{
static final String Launch = "/iamges/launch.gif";
public void doGet(HttpServletRequest req,HttpServletResponse res) throws ServletException,IOException
{
MultipartResponse multi=new MultipartResponse(res);
//PrintWriter out = res.getWriter();
//ServletOutputStream out; for (int i=100;i>0;i--)
{
multi.startResponse("text/plain");
multi.startResponse("<a href=\'#\'>" i + "</a>");
multi.endResponse();
try
{
Thread.sleep(100);
}
catch (InterruptedException e)
{
}
}
multi.startResponse("image/gif");
try
{
//ServletUtils.returnFile(req.getRealPath(Launch),out);
//ServletUtils.returnFile(Launch,out);
//out.println("It's my end of the game!");
}
//catch (FileNotFoundException ex)
catch (Exception ex)
{
throw new ServletException("Could not find file:"+ex.getMessage());
}
multi.finish();
}
};
import com.oreilly.servlet.ServletUtils;
上面的包可以到oreilly公司站点下载,或者给我发邮件我发给你们.
import java.io.*;
public class Server
{
public static void main (String[] args) throws IOException
{
ServerSocket socket = new ServerSocket(8123);
//while (true)
//{
Socket nclient = socket.accept();
//BufferedReader sin = new BufferedReader(new InputStreamReader(insocket.getInputStream()));
PrintWriter pout = new PrintWriter(nclient.getOutputStream(), true);
pout.print("Connection from " +nclient.getInetAddress().getHostAddress());
pout.print("today is ");
pout.println(new java.util.Date().toString());
pout.println("select 1 or 2");
BufferedReader in = new BufferedReader (new InputStreamReader(nclient.getInputStream()));
PrintWriter out = new PrintWriter (nclient.getOutputStream(), true);
String instring = in.readLine();
out.println("The server got this: " + instring);
nclient.close();
pout.close();
nclient.close();
socket.close();
System.out.print("connect close");
//}
}
}
===========================================================================
import java.net.*;
import java.io.*;
public class Client
{
public static void main(String[] args) throws UnknownHostException, IOException
{
Socket socket=new Socket("127.0.0.1",8123);
//Socket ClientSocket = new Socket();
/*
InputStream in = socket.getInputStream();
BufferedReader bin = new BufferedReader(new InputStreamReader(in));
String line;
while((line=bin.readLine())!= null)
System.out.println(line);
*/
int character;
InputStream in = socket.getInputStream();
OutputStream out = socket.getOutputStream();
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
//String str=br.readLine(); //這段被我註解掉了 原因就是 當我要這樣輸入的時候他都會停住 似乎無法判斷 我輸入的字元已經完成了
String str = "Hello!\n"; //直接傳字串 ok
//System.out.println(str);
byte buffer[] = str.getBytes();
out.write(buffer);
while ((character = in.read()) != -1) {
System.out.print((char) character);
}
socket.close();
}
}
原理,慢看吧!