根据你的应用背景,看浏览器那边是不是需要“密切注意”这个位置信息的变化。如果不需要太“密切”,比如,每隔半分钟或者几分钟能刷新一下就可以了,那,建议用你说的后一种方法。如果需要很“密切”,那,后一种方法就不太合适了,效率太低,响应速度也不会很快。但是,前一种方法好像也不行,“服务器主动发送”好像不是 web server 能做的事情。我觉得可行的办法是,建立一个专用的服务器,然后在浏览器的页面里埋一个 ActiveX 或者 applet 的插件,让这个插件通过 socket 的方式跟专用服务器直接通信。
maquan('ma:kju)说的是,web server 应该是无法主动发送的。既然问题发在java那就是用java的方法解决了,利用小程序的方法很好,我也这么想过,但我是新手(又重复了一次),只是大概觉得可以这么作,具体的做法还请说的详细一点,有代码是最好的了。
现在假设我需要“密切注意”位置变化信息,更新间隔比较短,并且需要对多个物体的位置信息进行关注。大家回复一定写详细一点,尤其对如何实现,如果太概括,我还得根据你说的自己去查,去看书,那对我来说帮助太小。
package tracer;import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;// 专用服务器
public class TracerServer { public static void main(String[] args) {
new AcceptThread(1234).start();
}}// 负责接收连接请求的线程
class AcceptThread extends Thread { private int port;
public AcceptThread(int port) { this.port = port; } public void run() {
try {
ServerSocket ss = new ServerSocket(port);
while (true) {
Socket s = ss.accept();
new ServeThread(s).start();
}
} catch (Exception e) {
e.printStackTrace();
}
}
}// 负责向客户端提供指定目标的位置信息的线程
class ServeThread extends Thread { private Socket socket;
public ServeThread(Socket socket) { this.socket = socket; } public void run() {
try {
InputStream is = socket.getInputStream();
OutputStream os = socket.getOutputStream(); // 标识指定的目标
int id; // 用于保存位置信息的数据(这只是个例子,实际应该是一个适当的数据结构,但进行通信时,最终是表现为一个字节流)
byte[] response = new byte[4]; while (true) {
// 接收客户端的请求
if ((id = is.read()) < 0) break; // 向客户端发送适当的数据
switch (id) {
case 1:
response[0] = 1;
response[1] = (byte) (Math.random()*256);
response[2] = (byte) (Math.random()*256);
response[3] = (byte) (Math.random()*256);
System.out.println("Serve for point1");
break;
case 2:
response[0] = 2;
response[1] = (byte) (Math.random()*256);
response[2] = (byte) (Math.random()*256);
response[3] = (byte) (Math.random()*256);
System.out.println("Serve for point2");
break;
default:
response[0] = (byte) 255;
response[1] = (byte) 255;
response[2] = (byte) 255;
response[3] = (byte) 255;
System.out.println("Serve for pointX");
break;
}
os.write(response);
}
socket.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}//---- tracer/TracerClient.java ----
package tracer;import java.awt.GridLayout;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.InetSocketAddress;
import java.net.Socket;import javax.swing.JApplet;
import javax.swing.JLabel;public class TracerClient extends JApplet { public TracerClient() {
super();
final GridLayout gridLayout = new GridLayout();
gridLayout.setColumns(1);
gridLayout.setRows(0);
getContentPane().setLayout(gridLayout); final JLabel point1Label = new JLabel();
point1Label.setText("Point1");
getContentPane().add(point1Label); final JLabel point2Label = new JLabel();
getContentPane().add(point2Label);
point2Label.setText("Point2");
// // 创建两个刷新线程,用于跟踪两个目标的位置信息
new RefreshThread((byte)1, point1Label).start();
new RefreshThread((byte)2, point2Label).start();
}}// 用于刷新的线程
class RefreshThread extends Thread { private byte id;
private JLabel label;
public RefreshThread(byte id, JLabel label) { this.id = id; this.label = label; } public void run() {
try {
Socket s = new Socket();
s.connect(new InetSocketAddress("localhost", 1234));
InputStream is = s.getInputStream();
OutputStream os = s.getOutputStream();
byte[] response = new byte[4];
while (true) {
// 向服务器端发送目标标识
os.write(id); // 接收服务器的响应
if (is.read(response) < 0) break; // 解析服务器端的响应数据,并更新界面
// 这里是把得到的数据用界面控件显示出来。实际应用中,不一定在 applet 中显示,可以考虑提供给 JavaScript。
label.setText(response[0] + ": (" + response[1] + ", " + response[2] + "), " + response[3]); // 休息 1 秒钟
Thread.sleep(1000);
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
不过具体怎么实现的,就要问下csdn的高手了。
var Had = false;
url = "http://message.csdn.net/newMessage.aspx";
var httpRequest;
if (typeof XMLHttpRequest != 'undefined') {
httpRequest = new XMLHttpRequest();
}
else if (typeof ActiveXObject != 'undefined') {
httpRequest = new ActiveXObject('Microsoft.XMLHTTP');
}
if (httpRequest) {
httpRequest.open('GET', url, false);
httpRequest.send(null);
if(httpRequest.status == 200){
var textInfo = httpRequest.responseText;
if(textInfo == "true") Had = true;
}}
if(Had){
ShowNewMessagePic();
}
else
{
ShowDearBookPic();
}
setTimeout("YouHadNewMessage()",300000);
}用到了XMLHttpRequest,也用到了ActiveXObject,在java里换成什么?
我每天都来,分不少,看到我的问题请多关注:)