Websocket 尝试在Tomcat7上实现非常基本的聊天功能(最新版本7.0.34)

Websocket 尝试在Tomcat7上实现非常基本的聊天功能(最新版本7.0.34),websocket,tomcat7,Websocket,Tomcat7,我忍不住认为有一个非常简单的解决办法,但到目前为止没有运气。 我想我已经走到了互联网的边缘,回头看了看,阅读了整个RFC6455,了解了幕后发生了什么,等等。 我使用eclipse进行开发,并在开发机器上运行最新的tomcat 这是我的测试类,eclipse甚至不会编译它,因为它建议我需要删除受保护的StreamInbound方法上的@Override。实际措辞: wsListenerTest类型的方法createWebSocketInbound(String)必须重写或实现超类型方法 它建议删

我忍不住认为有一个非常简单的解决办法,但到目前为止没有运气。 我想我已经走到了互联网的边缘,回头看了看,阅读了整个RFC6455,了解了幕后发生了什么,等等。 我使用eclipse进行开发,并在开发机器上运行最新的tomcat

这是我的测试类,eclipse甚至不会编译它,因为它建议我需要删除受保护的StreamInbound方法上的@Override。实际措辞:

wsListenerTest类型的方法createWebSocketInbound(String)必须重写或实现超类型方法

它建议删除@Override

我正在尝试在没有任何其他服务器或插件的情况下完成Tomcat自带的所有工作

提前谢谢

package com.blah.blah;

import java.io.IOException;
import java.nio.ByteBuffer;
import java.nio.CharBuffer;
import java.util.Set;
import java.util.concurrent.CopyOnWriteArraySet;
import java.util.concurrent.atomic.AtomicInteger;

import org.apache.catalina.websocket.MessageInbound;
import org.apache.catalina.websocket.StreamInbound;
import org.apache.catalina.websocket.WebSocketServlet;
import org.apache.catalina.websocket.WsOutbound;


public class wsListenerTest extends WebSocketServlet {

private static final long serialVersionUID = 1L;
static int numConnections = 0;

    private static final String GUEST_PREFIX = "Guest";

    private final AtomicInteger connectionIds = new AtomicInteger(0);
    private final Set<ChatMessageInbound> connections = new CopyOnWriteArraySet<ChatMessageInbound>();

    @Override
    protected StreamInbound createWebSocketInbound(String subProtocol) {
        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.");
            broadcast(message);
        }

        @Override
        protected void onClose(int status) {
            connections.remove(this);
            String message = String.format("* %s %s",
                    nickname, "has disconnected.");
            broadcast(message);
        }

        @Override
        protected void onBinaryMessage(ByteBuffer message) throws IOException {
            throw new UnsupportedOperationException(
                    "Binary message not supported.");
        }

        @Override
        protected void onTextMessage(CharBuffer message) throws IOException {
            // Never trust the client
//                String filteredMessage = String.format("%s: %s",nickname, HTMLFilter.filter(message.toString()));
            broadcast(message.toString());
        }

        private void broadcast(String message) {
            for (ChatMessageInbound connection : connections) {
                try {
                    CharBuffer buffer = CharBuffer.wrap(message);
                    connection.getWsOutbound().writeTextMessage(buffer);
                } catch (IOException ignore) {
                    // Ignore
                }
            }
        }
    }
}   
package com.blah.blah;
导入java.io.IOException;
导入java.nio.ByteBuffer;
导入java.nio.CharBuffer;
导入java.util.Set;
导入java.util.concurrent.CopyOnWriteArraySet;
导入java.util.concurrent.AtomicInteger;
导入org.apache.catalina.websocket.MessageInbound;
导入org.apache.catalina.websocket.StreamInbound;
导入org.apache.catalina.websocket.WebSocketServlet;
导入org.apache.catalina.websocket.WsOutbound;
公共类wsListenerTest扩展了WebSocketServlet{
私有静态最终长serialVersionUID=1L;
静态int numConnections=0;
私有静态最终字符串GUEST\u PREFIX=“GUEST”;
私有最终AtomicInteger ConnectionId=新的AtomicInteger(0);
私有最终集连接=新CopyOnWriteArraySet();
@凌驾
受保护的StreamInbound createWebSocketInbound(字符串子目录){
返回新的ChatMessageInbound(ConnectionId.incrementAndGet());
}
私有最终类ChatMessageInbound扩展MessageInbound{
私有最终字符串昵称;
私有聊天信息入站(int id){
this.nickname=GUEST\u前缀+id;
}
@凌驾
受保护的void onOpen(WsOutbound-outbound){
连接。添加(此);
字符串消息=String.format(“*%s%s”,
绰号“已加入。”);
广播(讯息);
}
@凌驾
受保护的void onClose(int状态){
连接。移除(此);
字符串消息=String.format(“*%s%s”,
昵称,“已断开连接。”);
广播(讯息);
}
@凌驾
受保护的void onBinaryMessage(ByteBuffer消息)引发IOException{
抛出新的UnsupportedOperationException(
“不支持二进制消息。”);
}
@凌驾
受保护的void onTextMessage(CharBuffer消息)引发IOException{
//永远不要相信客户
//String filteredMessage=String.format(“%s:%s”,昵称,HTMLFilter.filter(message.toString());
广播(message.toString());
}
专用无效广播(字符串消息){
用于(ChatMessageInbound连接:连接){
试一试{
CharBuffer=CharBuffer.wrap(消息);
connection.getWsOutbound().writeTextMessage(缓冲区);
}捕获(IOException忽略){
//忽略
}
}
}
}
}   

我认为编译器正在抱怨这个@Override,因为WebSocketServlet的方法具有以下特性

protected abstract StreamInbound createWebSocketInbound(String subProtocol,
                                                        HttpServletRequest request);
尝试将HttpServletRequest参数添加到方法中,这将有助于克服此障碍