ITPub博客

首页 > 应用开发 > Java > java的websocket

java的websocket

Java 作者:jinshiyill 时间:2015-07-01 15:06:26 0 删除 编辑

最近一直在思考一个问题:服务器如何主动发消息给浏览器?传统的Web都是浏览器主动向服务器发送请求,服务器收到请求之后返回数据给浏览器。如果要实现服务器主动向浏览器发送消息,即实现Web版的即时通信应该怎么做?貌似没有答案。之前java培训时候老师有讲过用轮询的方式实现伪即时通信,client1要发送消息给client2,只能先把消息发送给服务器,服务器等到client2来查询有没有新消息的时候才把client1发来的消息转发给client2.这样就必须在client页面定时向服务器发送查询请求,比如5秒一次或10秒一次,实现伪即时通信。

    端午节放假逛itpub发现一种比较好的解决方案:Websocket,下面记录几个Java写的Websocket的栗子,真正的即时通信。



前端如下


<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>




Insert title here



   
   


后端如下


package com.websocket;
 
import java.io.IOException;
 
import javax.websocket.CloseReason;
import javax.websocket.Endpoint;
import javax.websocket.EndpointConfig;
import javax.websocket.MessageHandler;
import javax.websocket.RemoteEndpoint;
import javax.websocket.Session;
import javax.websocket.server.ServerEndpoint;
 
@ServerEndpoint(value = "/Websocket") 
public class Websocket extends Endpoint {
 
    private Session session;
 
    @Override
    public void onOpen(Session session, EndpointConfig config) {
        RemoteEndpoint.Basic remote = session.getBasicRemote();
 
        System.out.println("pathParams:" + session.getPathParameters());
        System.out.println("requestParams" + session.getRequestParameterMap());
        session.addMessageHandler(new MyMessageHandle(remote));
    }
 
    @Override
    public void onClose(Session session, CloseReason closeReason) {
        System.out.println("onClose");
    }
 
    @Override
    public void onError(Session session, java.lang.Throwable throwable) {
        System.out.println("onError");
    }
 
    private class MyMessageHandle implements MessageHandler.Whole {
        RemoteEndpoint.Basic remote = null;
 
        public MyMessageHandle(RemoteEndpoint.Basic remote) {
            this.remote = remote;
        }
 
        @Override
        public void onMessage(String s) {
            System.out.println(s);
            try {
                remote.sendText("success");
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
 
}
运测试运行在Tomcat7上正常
栗子2
前端如下


<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>




Insert title here



   
   


后端如下


package com.websocket;
 
import java.io.IOException;
 
import javax.websocket.EndpointConfig;
import javax.websocket.OnClose;
import javax.websocket.OnMessage;
import javax.websocket.OnOpen;
import javax.websocket.Session;
import javax.websocket.server.ServerEndpoint;
 
@ServerEndpoint(value = "/Websocket1")
public class Websocket1 {
    private Session session;
 
    @OnOpen
    public void open(Session session, EndpointConfig config) {
        this.session = session;
        System.out.println("*** WebSocket opened from sessionId "
                + session.getId());
        // sysLogger.info("*** WebSocket opened from sessionId " +
        // session.getId());
    }
 
    @OnMessage
    public void inMessage(Session session, String message) {
        // sysLogger.info("*** WebSocket Received from sessionId " +
        // this.session.getId() + ": " + message);
        System.out.println("WebSocket Received from sessionId:"
                + session.getId() + "-->" + message);
        try {
            session.getBasicRemote().sendText("Server收到消息:" + message);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
 
    @OnClose
    public void end(Session session) {
        // sysLogger.info("*** WebSocket closed from sessionId " +
        // this.session.getId());
        System.out.println("*** WebSocket closed from sessionId "
                + this.session.getId());
    }
}
测试Tomcat7
栗子3
前端如下


<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>




Insert title here



   
   
   

   


后端如下


package com.websocket;
 
import javax.websocket.OnClose;
import javax.websocket.OnError;
import javax.websocket.OnMessage;
import javax.websocket.OnOpen;
import javax.websocket.RemoteEndpoint;
import javax.websocket.Session;
import javax.websocket.server.ServerEndpoint;
 
@ServerEndpoint(value="/Websocket2") 
public class Websocket2 {
    @OnOpen  
    public void start(Session session){  
        System.out.println("session "+session.getId()+" open.");  
    }  
   
    @OnMessage  
    public void process(Session session, String message){  
        System.out.println("rece:" + message);  
        RemoteEndpoint.Basic remote = session.getBasicRemote();  
        int c = Integer.valueOf(message);  
        for (int i=1; i<=c; i++){  
            try {  
                remote.sendText("response "+i);  
                Thread.sleep(50);  
            } catch (Exception e) {  
                e.printStackTrace();  
            }  
        }  
    }  
   
    @OnClose  
    public void end(Session session){  
        System.out.println("session "+session.getId()+" close.");  
    }  
   
    @OnError  
    public void error(Session session, java.lang.Throwable throwable){  
        System.err.println("session "+session.getId()+" error:"+throwable);  
    } 
}


来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/30284286/viewspace-1718918/ ,如需转载,请注明出处,否则将追究法律责任。

上一篇: 没有了~
下一篇: 没有了~
请登录后发表评论 登录
全部评论

注册时间:2015-06-11

  • 博文量
    1
  • 访问量
    1553