最近一直在思考一个问题:服务器如何主动发消息给浏览器?传统的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/
,如需转载,请注明出处,否则将追究法律责任。