Java实现websocket

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

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



栗子1

前端如下

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
<script type="text/javascript">
    var wsuri = "ws://localhost:8080/Websocket/Websocket?name=shang&password=123456";
    var ws = null;
    function startWebSocket() {
        if (‘WebSocket‘ in window)
            ws = new WebSocket(wsuri);
        else if (‘MozWebSocket‘ in window)
            ws = new MozWebSocket(wsuri);
        else
            alert("not support");

        ws.onmessage = function(evt) {
            alert(evt.data);
        };

        ws.onclose = function(evt) {
            alert("close");
        };

        ws.onopen = function(evt) {
            alert("open");
        };
    }

    function sendMsg() {
        ws.send(document.getElementById(‘writeMsg‘).value);
    }
</script>
</head>
<body >
    <input type="text" id="writeMsg" />
    <input type="button" value="send" onclick="sendMsg()" />
</body>
</html>

后端如下

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<String> {
        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"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
<script type="text/javascript">
    var wsuri = "ws://localhost:8080/Websocket/Websocket1?name=shang&password=123456";
    var ws = null;
    function startWebSocket() {
        if (‘WebSocket‘ in window) {
            ws = new WebSocket(wsuri);
        } else if (‘MozWebSocket‘ in window) {
            ws = new MozWebSocket(wsuri);
        } else {
            alert("not support");
        }

        ws.onmessage = function(evt) {
            alert(evt.data);
        };

        ws.onclose = function(evt) {
            alert("close");
        };

        ws.onopen = function(evt) {
            alert("open");
        };
    }

    function sendMsg() {
        ws.send(document.getElementById(‘writeMsg‘).value);
    }
</script>
</head>
<body >
    <input type="text" id="writeMsg" />
    <input type="button" value="send" onclick="sendMsg()" />
</body>
</html>

后端如下

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"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
<script language="JavaScript">
    var wsuri = "ws://localhost:8080/Websocket/Websocket2";
    var ws = null;

    function connectEndpoint() {
        ws = new WebSocket(wsuri);
        ws.onmessage = function(evt) {
            //alert(evt.data);
            document.getElementById("echo").value = evt.data;
        };

        ws.onclose = function(evt) {
            //alert("close");
            document.getElementById("echo").value = "end";
        };

        ws.onopen = function(evt) {
            //alert("open");
            document.getElementById("echo").value = "open";
        };
    }

    function sendmsg() {
        ws.send(document.getElementById("send").value);
    }
</script>
</head>
<body >
    <input type="text" size="20" value="5" id="send">
    <input type="button" value="send" onclick="sendmsg()">
    <br>
    <input type="text" id="echo">
</body>
</html>

后端如下

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);  
    } 
}


Layer有一款颜值很高的web聊天界面http://sentsin.com/layui/layim/

如果要实现网页在线聊天可以考虑结合layer的前端和websocket来实现...

2015年6月30日22:15:36   By:umgsai   湖北宜昌

时间: 2024-09-29 11:34:55

Java实现websocket的相关文章

基于Tomcat7、Java、WebSocket的服务器推送聊天室 (转)

前言 HTML5 WebSocket实现了服务器与浏览器的双向通讯,双向通讯使服务器消息推送开发更加简单,最常见的就是即时通讯和对信息实时性要求比较高的应用.以前 的服务器消息推送大部分采用的都是“轮询”和“长连接”技术,这两中技术都会对服务器产生相当大的开销,而且实时性不是特别高.WebSocket技术对 只会产生很小的开销,并且实时性特别高.下面就开始讲解如何利用WebSocket技术开发聊天室.在这个实例中,采用的是Tomcat7服务器,每个服 务器对于WebSocket的实现都是不一样的

Java后端WebSocket的Tomcat实现

一.WebSocket简单介绍 随着互联网的发展,传统的HTTP协议已经很难满足Web应用日益复杂的需求了.近年来,随着HTML5的诞生,WebSocket协议被提出,它实现了浏览器与服务器的全双工通信,扩展了浏览器与服务端的通信功能,使服务端也能主动向客户端发送数据. 我们知道,传统的HTTP协议是无状态的,每次请求(request)都要由客户端(如 浏览器)主动发起,服务端进行处理后返回response结果,而服务端很难主动向客户端发送数据:这种客户端是主动方,服务端是被动方的传统Web模式

Java现实WebSocket

Java现实WebSocket   ——转载 目录 服务器端实现(Tomcat) 客户端实现(Java-WebSocket) 客户端实现(Javascript原生API) 1. 服务器端实现(Tomcat) 用Java实现的websocket,在Server端是通过Tomcat内嵌支持的,我们需要开发一个继承WebSocketServlet 的servlet就可以了,与普通的HttpServlet没有太大区别. 1). JAVA环境: Java: jdk 1.6.0_45, Server VM

Java用WebSocket + tail命令实现Web实时日志

在Linux操作系统中,经常需要查看日志文件的实时输出内容,通常会使用tail -f或者tailf命令.查看实时日志可能会需要首先SSH连上Linux主机,步骤很麻烦不说,如果是生产环境的服务器,可能还会控制各种权限.基于Web的实时日志可以解决这个问题. 由于传统的HTTP协议是请求/响应模式,而实时日志需要不定时的持续的输出,由服务器主动推送给客户端浏览器.所以这里使用的是HTML5的WebSocket协议. 按照惯例,先上图: Java后台 JSR 356是Java实现WebSocket的

Java和WebSocket开发网页聊天室

小编心语:咳咳咳,今天又是聊天室,到现在为止小编已经分享了不下两个了,这一次跟之前的又不大相同,这一次是网页聊天室,具体怎么着,还请各位看官往下看~ Java和WebSocket开发网页聊天室 一.项目简介 WebSocket是HTML5一种新的协议,它实现了浏览器与服务器全双工通信,这里就将使用WebSocket来开发网页聊天室,前端框架会使用AmazeUI,后台使用Java,编辑器使用UMEditor. 二.涉及知识点 网页前端(HTML+CSS+JS)和Java 三.软件环境 Tomcat

用JAVA和Websocket实现实时通讯

说到websocket大家一定不会陌生,WebSocket是HTML5一种新的协议.它实现了浏览器与服务器全双工通信(full-duplex).一开始的握手需要借助HTTP请求完成,当浏览器和服务器握手成功后,浏览器和服务器之间就形成了一条快速通道.两者之间就直接可以数据互相传送.有了websocket, 大家就可以摒弃以往用轮询来实现实时通讯的方式了. 有了websocket后,应运而生的相关产品也不在少数,选择也成了最大的问题,在这里你可能会说"干嘛用别人的,我可以自己用原始的开发一个啊&q

java使用websocket,并且获取HttpSession,源码分析

一:本文使用范围 此文不仅仅局限于spring boot,普通的spring工程,甚至是servlet工程,都是一样的,只不过配置一些监听器的方法不同而已. 本文经过作者实践,确认完美运行. 二:Spring boot使用websocket 2.1:依赖包 websocket本身是servlet容器所提供的服务,所以需要在web容器中运行,像我们所使用的tomcat,当然,spring boot中已经内嵌了tomcat. websocket遵循了javaee规范,所以需要引入javaee的包 <

java 实现websocket(转)

Java web项目使用webSocket 前端: <%@ page language="java" import="java.util.*" pageEncoding="UTF-8" %> <% String path = request.getContextPath(); String basePath = request.getScheme() + "://" + request.getServerNa

Java后端WebSocket的Tomcat实现(转)

文章摘要随着互联网的发展,传统的HTTP协议已经很难满足Web应用日益复杂的需求了.近年来,随着HTML5的诞生,WebSocket协议被提出,它实现了浏览器与服务器的全双工通信,扩展了浏览器与服务端的通信功能,使服务端也能主动向客户端发送数据. 我们知道,传统的HTTP协议是无状态的,每次请求(request)都要由客户端(如浏览器)主动发起,服务端进行处理后返回response结果,而服务端很难主动向客户端发送数据:这种客户端是主动方,服务端是被动方的传统Web模式对于信息变化不频繁的Web