Не уверен, что мой психотерапевт подумает о том, чтобы поговорить здесь один, но дело в том, что я пришел к решению.Ничто в вышеприведенном пути не сработало и, похоже, не подходит для Tomcat7Прежде чем я попробую реализовать его с WebSocketServlet
, который кажется хорошим старым способом для Tomcat7.Но у меня были проблемы с поиском правильных библиотек.В конце концов это работает для меня:
Библиотеки (файлы JAR)
Этот позволяет мне вызывать «старые вещи» дляWebSocketServlet 'и других связанных классов.
Я не сделал этого, так как в netbeans все казалось нормально для компиляции, но произошла эта ошибка:
файл класса для org.apache.coyote.http11.upgrade.UpgradeInbound не найден
Но этот сосуд избавился от него ( как описано здесь ).
На стороне сервера
Перестройка кода, у меня есть два класса:
Сервлет, как это:
package com.myserver.server.monitor;
import java.util.concurrent.ConcurrentHashMap;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
import org.apache.catalina.websocket.StreamInbound;
import org.apache.catalina.websocket.WebSocketServlet;
@WebServlet("/wsocket")
public class MonitorServlet extends WebSocketServlet {
private static final long serialVersionUID = 1L;
// for new clients, <sessionId, streamInBound>
private static ConcurrentHashMap<String, StreamInbound> clients = new ConcurrentHashMap<String, StreamInbound>();
@Override
public void init(){
}
@Override
protected StreamInbound createWebSocketInbound(String protocol,HttpServletRequest httpServletRequest) {
// Check if exists
HttpSession session = httpServletRequest.getSession();
// find client
StreamInbound client = clients.get(session.getId());
if (null != client) {
return client;
} else {
client = new MyInBound(httpServletRequest,this);
clients.put(session.getId(), client);
}
return client;
}
}
И класс MyInBound, вот так:
package com.myserver.server.monitor;
import java.io.IOException;
import java.nio.ByteBuffer;
import java.nio.CharBuffer;
import javax.servlet.http.HttpServletRequest;
import org.apache.catalina.websocket.MessageInbound;
import org.apache.catalina.websocket.WebSocketServlet;
import org.apache.catalina.websocket.WsOutbound;
public class MyInBound extends MessageInbound{
//private String name;
private WsOutbound myoutbound;
private final WebSocketServlet servlet;
public MyInBound(HttpServletRequest httpServletRequest, WebSocketServlet servlet) {
this.servlet=servlet;
}
@Override
public void onOpen(WsOutbound outbound) {
this.myoutbound = outbound;
System.out.println("Hey!!---------");
}
@Override
public void onClose(int status) {
System.out.println("Close client");
}
@Override
protected void onBinaryMessage(ByteBuffer arg0) throws IOException {
}
@Override
protected void onTextMessage(CharBuffer inChar) throws IOException {
}
}
Теперь вам нужно зарегистрировать сервлет в web.xml:
<servlet>
<servlet-name>MonitorServlet</servlet-name>
<servlet-class>com.myserver.server.monitor.MonitorServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>MonitorServlet</servlet-name>
<url-pattern>/MonitorServlet</url-pattern>
</servlet-mapping>
Клиентская сторона
Это не такочень сильно меняется:
функция initPerformance () {
var uriWS="wss://myserver.com/wsocket";
var miWebsocket= new WebSocket(uriWS);
console.log (miWebsocket);
miWebsocket.onopen=function(evento) {
console.log("open");
miWebsocket.send("hi");
};
miWebsocket.onmessage=function(evento) {
console.log(evento.data);
};
}
Надеюсь, это кому-нибудь поможет!