resin 使用websocket

核心思路

1. 編寫一個socketServlet,它extends resin開發包中的httpServlet

2. 編寫一個scoketListener,它implements resin包中的WebSocketListener

3. 將socketServlet配置在resin配置給resin,比如在web.xml中配置<servlet>與<servlet-mapping>

解釋

注意,本實例的resin版本爲:resin-4.0.53

1. socketServlet的作用是在聽到指定地址的請求後,將請求升級爲websocket協議。因此在該servlet的service方法中將協議升價socket即可。該servelt與普通的servlet相比沒什麼區別,僅僅是service中做了不一樣的事情。

2. scoketListener 實現的resin包下WebSocketListener類,類全路徑:

              com.caucho.websocket.WebSocketListener

   在該類中有諸多socket表現行爲的接口,實現它們即可完成socket通信,接口列出:

void onStart(WebSocketContext var1) throws IOException;

void onReadBinary(WebSocketContext var1, InputStream var2) throws IOException;

void onReadText(WebSocketContext var1, Reader var2) throws IOException;

void onClose(WebSocketContext var1) throws IOException;

void onDisconnect(WebSocketContext var1) throws IOException;

void onTimeout(WebSocketContext var1) throws IOException;

3. scoketListener的發送是使用 WebSocketContext 類實現的,類似於tomcat websocket中的session。

 

示例

注意:代碼僅供參考,重要的是邏輯思路

1. ResinSocketServlet


import com.caucho.websocket.WebSocketContext;
import com.caucho.websocket.WebSocketServletRequest;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.security.Principal;

public class ResinSocketServlet extends HttpServlet {

    public ResinSocketServlet() {
        System.out.println("ResinSocketServlet init...");
    }

    public void service(HttpServletRequest req, HttpServletResponse res)
            throws IOException, ServletException
    {

        Principal principal = AuthHandler.determineUser(req);
        if (principal == null) {
            res.sendError(401);
        } else {
            TdtWebSocketListener listener = new TdtWebSocketListener();
            WebSocketServletRequest wsReq = (WebSocketServletRequest) req;
            WebSocketContext webSocketContext = wsReq.startWebSocket(listener);
            UserStorage.setPrincipal(webSocketContext, principal);
        }
    }

}

2. MyWebSocketListener

import com.caucho.websocket.WebSocketContext;
import com.caucho.websocket.WebSocketListener;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.context.ContextLoader;
import org.springframework.web.context.WebApplicationContext;

import java.io.IOException;
import java.io.InputStream;
import java.io.Reader;
import java.security.Principal;

public class MyWebSocketListener implements WebSocketListener {
    private Logger logger = LoggerFactory.getLogger(MyWebSocketListener.class);

    @Override
    public void onStart(WebSocketContext webSocketContext) throws IOException {
        logger.info("+++++++++++++++++++++ MyWebSocketListener onStart +++++++++++++++++++++ ");
    }

    @Override
    public void onReadBinary(WebSocketContext webSocketContext, InputStream inputStream) throws IOException {
        logger.info("+++++++++++++++++++++ MyWebSocketListener onReadBinary+++++++++++++++++++++ ");
    }

    @Override
    public void onReadText(WebSocketContext webSocketContext, Reader reader) throws IOException {
        logger.info("+++++++++++++++++++++ MyWebSocketListener onReadText +++++++++++++++++++++ ");
        Principal principal = UserStorage.getPrincipal(webSocketContext);  //--這裏可以先校驗用戶是否登錄
        if (principal == null) {//校驗用戶是否登錄
            webSocketContext.close();
        } else {
            StringBuffer msg = new StringBuffer();
            int ch2;
            while ((ch2 = reader.read()) > 0) {
                msg.append((char) ch2);
            }
			System.out.println("收到信息: "+msg.toString());
			
			try {//寫回信息
				PrintWriter writer = webSocketContext.startTextMessage();
				writer.print(msg);
				writer.close();
			} catch (Exception e) {
				e.printStackTrace();
			}
			webSocketContext.close();
        }

    }

    @Override
    public void onClose(WebSocketContext webSocketContext) throws IOException {
        logger.info("+++++++++++++++++++++ MyWebSocketListener onClose +++++++++++++++++++++ ");
        clearUser(webSocketContext);
    }

    @Override
    public void onDisconnect(WebSocketContext webSocketContext) throws IOException {
        logger.info("+++++++++++++++++++++ MyWebSocketListener onDisconnect +++++++++++++++++++++ ");
        clearUser(webSocketContext);
    }

    @Override
    public void onTimeout(WebSocketContext webSocketContext) throws IOException {
        logger.info(" +++++++++++++++++++++  MyWebSocketListener onTimeout +++++++++++++++++++++ ");
        clearUser(webSocketContext);
    }

    private void clearUser(WebSocketContext webSocketContext) {
        UserStorage.removePrincipal(webSocketContext);
    }
}

3. 配置

在xml裏配置即可,很簡單,這裏不贅述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章