WebSocket开发实践
——利用Eclipse和Tomcat开发WebSocket应用
本文演示如何使用Eclipse和Tomcat开发一个简单的WebSocket聊天室程序。
1、开发环境:
1.JDK1.6
2.Eclipse Java EE IDE for Web Developers,本文使用的是:Indigo Release。
3.Tomcat 7.0.27开始支持WebSocket服务,本文使用的是:Tomcat 7.0.34。
2、配置Eclipse中的Tomcat7服务器运行环境
如果在此之前已经进行过服务器的配置,则可以跳过此步骤。
1.在菜单中选择:Window→Preferences→Server→Runtime Environment
2.点击Add新增Tomcat7运行环境
3.选择Tomcat7的安装路径
4.新建一个Tomcat7服务器
在菜单中选择New→Other→Server→Server,在新建服务器窗口中填写服务器名称,并指定服务器运行环境。
3、创建Web项目
1.在菜单中选择Filewebsocket和socketNewProject在新建项目向导中选择Dynamic Web Project
2.输入项目名称,例如:webchat,在Target runtime中选择之前所配置的Tomcat7运行环境。该步骤之后的源码路径设置和web模块设置都可以使用默认设置,直接点击“Finish”即可。
4、编写项目代码
项目创建成功后,首先生成servlet类,具体操作方法如下:
1.在项目上点击右键,在快捷菜单中选择New→Servlet,
2.填写servlet的所在的包和类名,需要注意的是,在Supperclass中需要选择org.apache.catalina.websocket.WebSocketServlet作为servlet的父类。
3.点击“Next”之后,Servlet创建向导会提示该Servlet中需要包含哪些方法,这里可以去掉默认方法的复选框,在WebSocketServlet中不需要实现doGet和doPost方法。
WebSocketServlet代码清单:
package websocket.chat;
import java.io.IOException;
import java.nio.ByteBuffer;
import java.nio.CharBuffer;
import java.util.Set;
import urrent.CopyOnWriteArraySet;
import urrent.atomic.AtomicInteger;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServletRequest;
import org.apache.catalina.websocket.MessageInbound;
import org.apache.catalina.websocket.StreamInbound;
import org.apache.catalina.websocket.WebSocketServlet;
import org.apache.catalina.websocket.WsOutbound;
@WebServlet("/ChatWebSocketServlet")
public class ChatWebSocketServlet extends WebSocketServlet {
    private static final long serialVersionUID = 1L;
    private static final String GUEST_PREFIX = "Guest";
    //用于自动生成连接ID
    private final AtomicInteger connectionIds = new AtomicInteger(0);
    //用于保存所有连接Inbound的集合
    private final Set<ChatMessageInbound> connections =
            new CopyOnWriteArraySet<ChatMessageInbound>();
    //生成新的连接Inbound,WebSocketServlet必须实现该方法
    @Override
    protected StreamInbound createWebSocketInbound(String subProtocol,
            HttpServletRequest request) {
        return new ChatMessageInbound(connectionIds.incrementAndGet());
    }
    //聊天消息处理类
    private final class ChatMessageInbound extends MessageInbound {
        private final String nickname;
        private ChatMessageInbound(int id) {
            this.nickname = GUEST_PREFIX + id;
        }
        //创建新的连接时触发
        @Override
        protected void onOpen(WsOutbound outbound) {
            connections.add(this);
            String message = String.format("* %s %s",
                    nickname, "has joined.");

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。