我想作一个GPS跟踪的功能,每当服务器收到一个来自GPS(通过GPRS传送)的定位信息(假设时间间隔很短,1个/s),就把这个定位信息通知每个浏览器。如果是服务器主动发送的话,我觉得不是很合理,不知道可不可以这样作;或者由浏览器定时请求,再由服务器返回当前最新的定位信息。不管那种方式,该如何实现我也不是很确定,新手啊,很不好意思,麻烦各位写详细一点。

解决方案 »

  1.   

    根据你的应用背景,看浏览器那边是不是需要“密切注意”这个位置信息的变化。如果不需要太“密切”,比如,每隔半分钟或者几分钟能刷新一下就可以了,那,建议用你说的后一种方法。如果需要很“密切”,那,后一种方法就不太合适了,效率太低,响应速度也不会很快。但是,前一种方法好像也不行,“服务器主动发送”好像不是 web server 能做的事情。我觉得可行的办法是,建立一个专用的服务器,然后在浏览器的页面里埋一个 ActiveX 或者 applet 的插件,让这个插件通过 socket 的方式跟专用服务器直接通信。
      

  2.   

    maquan('ma:kju)说的是,web server 应该是无法主动发送的。既然问题发在java那就是用java的方法解决了,利用小程序的方法很好,我也这么想过,但我是新手(又重复了一次),只是大概觉得可以这么作,具体的做法还请说的详细一点,有代码是最好的了。
     
    现在假设我需要“密切注意”位置变化信息,更新间隔比较短,并且需要对多个物体的位置信息进行关注。大家回复一定写详细一点,尤其对如何实现,如果太概括,我还得根据你说的自己去查,去看书,那对我来说帮助太小。
      

  3.   

    今天手痒,做了两段小程序,希望能有用。程序做得比较草,为了突出主要问题,很多细节没有仔细处理。//---- tracer/TracerServer.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();
            }
        }
        
    }
      

  4.   

    不知楼主有没有注意到CSDN的社区中的一个功能,就是当有系统消息时,系统会发出铃声,这就是服务器有消息的时候,把该消息发送到所有的浏览器的功能。
    不过具体怎么实现的,就要问下csdn的高手了。
      

  5.   

    非常感谢maquan('ma:kju),先把分给了,希望能留下MSN或者QQ
      

  6.   

    f_acme(沧海一声笑) ,不知道怎么找高手,你有什么建议?我只能尽量给高分,把题目起的有意思一点,希望有会作的能看到……
      

  7.   

    to f_acme(沧海一声笑) csdn左上角的消息提示是用ajax技术做的,两个点就是setTimeout和XMLHttpRequest
      

  8.   

    据我看到的情况(我用的是 IE 6),“csdn左上角的消息提示”用的是 setTimeout() 配合 DHTML 处理的,没看到 XMLHttpRequest。
      

  9.   

    看到了,是logo[1],.net和java都是这样吧
      

  10.   

    maquan('ma:kju) 升的蛮快的啊,4个裤衩了,呵呵
      

  11.   

    不告诉我MSN或者QQ吗,我不会经常打扰的,回答问题也是一种学习,共同进步吧
      

  12.   

    hehe, 大家帮忙!我给你捧场,你也要给我帮忙哦  ^O^
      

  13.   

    function YouHadNewMessage(){
        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里换成什么?
      

  14.   

    好吧,记得我的名号就可以了,peterHunter,
    我每天都来,分不少,看到我的问题请多关注:)
      

  15.   

    function YouHadNewMessage(){……}的问题答完就结帐,是不是除了这个,logo[1]的代码在.net和java都是适用,还是完全就是一样?
      

  16.   

    我怀疑“YouHadNewMessage()”是个历史遗迹,因为在整个 HTML 里没看到哪里用到它。我看到的是 body onload 调用了 TimeFindNewMessage(),后者用定时器启动 CheckNewMessage(), 而 CheckNewMessage() 每隔 300 秒请求一次 http://message.csdn.net/newMessage.aspx,这个 url 返回的值是一个 JavaScript,会根据实际情况调用某个 function,比如 ShowDefaultPic() 或者 ShowNewMessagePic()。
      

  17.   

    实际上还是客户端定时请求最新数据吧,那YouHadNewMessage()不要,也就是不用XmlHttp也可以搞定?