核心思路
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裏配置即可,很簡單,這裏不贅述