HTML 5 WebSocket+Tomcat 8実装真●Web版インスタントチャットルーム(シングル+複数人)
前にtomcat 7のwebsocketチャットルームを作りました.これはtomcat 7とjdk 1に基づいています.7の下の、あるプロジェクトはtomcat 8の下で、この时に问题があって、8の下でその书き方を支持しないため、それは注釈の方式でwebsocketを実现して、HTML 5 WebSocket+Tomcatを参照してWeb版のインスタントチャットルームを実现して、以下はどのように8の下でチャットルームを実现して、多くの人は一人をプラスします!最も重要なのは、各ユーザーがログインしているセッションを取得することです.ここでのセッションはHttpSessionで、websocketはセッションを持っていますが、実際のプロジェクトでは1つ目しか使用できません.どのように8の下で取得しますか?ServerEndpointConfigを継承するクラスを書きます.Configurator:
Websocketサービスにこの構成を追加すると、このようになります.
私は2つのHttpSessionを1つのmapの中に置いて、ユーザーが入って、putが入って、以下のようにします.
コード:
フロントのページは変更されておらず、テスト済みで、実行可能!!!コードは私はすでにネット上にアップロードして、ソースコードはダウンロードします
package com.socket;
import javax.websocket.HandshakeResponse;
import javax.websocket.server.HandshakeRequest;
import javax.websocket.server.ServerEndpointConfig;
import javax.servlet.http.HttpSession;
public class GetHttpSessionConfigurator extends ServerEndpointConfig.Configurator {
@Override
public void modifyHandshake(ServerEndpointConfig config,HandshakeRequest request, HandshakeResponse response) {
HttpSession httpSession = (HttpSession) request.getHttpSession();
config.getUserProperties().put(HttpSession.class.getName(), httpSession);
}
}
Websocketサービスにこの構成を追加すると、このようになります.
@ServerEndpoint(value = "/websocket",configurator=GetHttpSessionConfigurator.class)
私は2つのHttpSessionを1つのmapの中に置いて、ユーザーが入って、putが入って、以下のようにします.
private static final Map<HttpSession,ChatServlet> onlineUsers = new HashMap<HttpSession, ChatServlet>();
コード:
package com.socket;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
import javax.servlet.http.HttpSession;
import javax.websocket.EndpointConfig;
import javax.websocket.OnClose;
import javax.websocket.OnError;
import javax.websocket.OnMessage;
import javax.websocket.OnOpen;
import javax.websocket.Session;
import javax.websocket.server.ServerEndpoint;
import utils.MessageUtil;
@ServerEndpoint(value = "/websocket",configurator=GetHttpSessionConfigurator.class)
public class ChatServlet {
private static final Map<HttpSession,ChatServlet> onlineUsers = new HashMap<HttpSession, ChatServlet>();
private static int onlineCount = 0;
private HttpSession httpSession;
private Session session;
@OnOpen
public void onOpen(Session session,EndpointConfig config){
this.session = session;
this.httpSession = (HttpSession) config.getUserProperties().get(HttpSession.class.getName());
if(httpSession.getAttribute("user") != null){
onlineUsers.put(httpSession, this);
}
String names = getNames();
String content = MessageUtil.sendContent(MessageUtil.USER,names);
broadcastAll(content);
addOnlineCount(); // 1
System.out.println(" ! " + onlineUsers.size());
}
@OnClose
public void onClose(){
onlineUsers.remove(this); // set
subOnlineCount(); // 1
System.out.println(" ! " + getOnlineCount());
}
@OnMessage
public void onMessage(String message, Session session) throws IOException {
HashMap<String,String> messageMap = MessageUtil.getMessage(message); //
String fromName = messageMap.get("fromName"); // userId
String toName = messageMap.get("toName"); // userId
String mapContent = messageMap.get("content");
if(toName.isEmpty()){
sendOffLine(fromName,toName);
return;
}
if("all".equals(toName)){
String msgContentString = fromName + " : " + mapContent; //
String content = MessageUtil.sendContent(MessageUtil.MESSAGE,msgContentString);
broadcastAll(content);
}else{
try {
String content = MessageUtil.sendContent(MessageUtil.MESSAGE,mapContent);
singleChat(fromName,toName,content);
} catch (IOException e) {
e.printStackTrace();
}
}
System.out.println(" :" + message);
broadcastAll(message);
}
private void singleChat(String fromName, String toName, String mapContent) throws IOException {
String msgContentString = fromName + " " + toName + " : " + mapContent;
String contentTemp = MessageUtil.sendContent(MessageUtil.MESSAGE,msgContentString);
boolean isExit = false;
for (HttpSession key : onlineUsers.keySet()) {
if(key.getAttribute("user").equals(toName)){
isExit = true;
}
}
if(isExit){
for (HttpSession key : onlineUsers.keySet()) {
if(key.getAttribute("user").equals(fromName) || key.getAttribute("user").equals(toName)){
onlineUsers.get(key).session.getBasicRemote().sendText(contentTemp);
}
}
}else{
String content = MessageUtil.sendContent(MessageUtil.MESSAGE," ...");
broadcastAll(content);
}
}
private void sendOffLine(String fromName, String toName) throws IOException {
String msgContentString = toName + " ";
String content = MessageUtil.sendContent(MessageUtil.MESSAGE,msgContentString);
for (HttpSession key : onlineUsers.keySet()) {
if(key.getAttribute("user").equals(fromName) || key.getAttribute("user").equals(toName)){
onlineUsers.get(key).session.getBasicRemote().sendText(content);
}
}
}
private static void broadcastAll(String msg) {
for (HttpSession key : onlineUsers.keySet()) {
try {
onlineUsers.get(key).session.getBasicRemote().sendText(msg);
} catch (IOException e) {
e.printStackTrace();
}
}
}
@OnError
public void onError(Session session, Throwable error){
System.out.println(" ");
error.printStackTrace();
}
private String getNames() {
String names = "";
for (HttpSession key : onlineUsers.keySet()) {
String name = (String) key.getAttribute("user");
names += name + ",";
}
String namesTemp = names.substring(0,names.length()-1);
return namesTemp;
}
public static synchronized int getOnlineCount() {
return onlineCount;
}
public static synchronized void addOnlineCount() {
ChatServlet.onlineCount++;
}
public static synchronized void subOnlineCount() {
ChatServlet.onlineCount--;
}
}
フロントのページは変更されておらず、テスト済みで、実行可能!!!コードは私はすでにネット上にアップロードして、ソースコードはダウンロードします