当在两台socketio服务器前点击haproxy(loadbalancer)时,nkzawa socket.io java客户端连接未升级到websocket

当在两台socketio服务器前点击haproxy(loadbalancer)时,nkzawa socket.io java客户端连接未升级到websocket,java,socket.io,haproxy,session.socket.io,Java,Socket.io,Haproxy,Session.socket.io,我在haproxy后面有两个socketio服务器,为了保持粘性,我在haproxy中插入cookie,以确定响应来自哪个服务器。现在的问题是,当我使用下面的代码执行此操作时,我的连接没有升级到“websocket”,我尝试调试此问题,并意识到“transport”事件仅在engineio套接字类中的“setTransport”方法中发出,而不是在“createTransport”方法中发出,(简而言之,在探测过程中,不会发出“传输”事件,这会导致websocket握手请求在不同的socketi

我在haproxy后面有两个socketio服务器,为了保持粘性,我在haproxy中插入cookie,以确定响应来自哪个服务器。现在的问题是,当我使用下面的代码执行此操作时,我的连接没有升级到“websocket”,我尝试调试此问题,并意识到“transport”事件仅在engineio套接字类中的“setTransport”方法中发出,而不是在“createTransport”方法中发出,(简而言之,在探测过程中,不会发出“传输”事件,这会导致websocket握手请求在不同的socketio服务器上进行,而不是在客户机已使用XhrPoll连接的服务器上进行)

我想知道是否有一些其他的工作围绕这个问题,或者这个问题是真实的。请帮助。提前感谢

链接至-

final StringBuffer buf=new StringBuffer();
socket.io().on(Manager.EVENT_TRANSPORT,new Emitter.Listener()){
@凌驾
公共无效调用(对象…参数){
最终传输=(传输)参数[0];
if(transport.name.equalsIgnoreCase(WebSocket.name)){
transport.once(transport.EVENT\u REQUEST\u头,new Emitter.Listener(){
@凌驾
公共无效调用(对象…参数){
@抑制警告(“未选中”)
映射头=(映射)参数[0];
如果(buf.length()!=0){
headers.put(“Cookie”,buf.toString());
}
}
});
}
if(transport.name.equalsIgnoreCase(PollingXHR.name)){
transport.once(transport.EVENT\u RESPONSE\u标题,
新建发射器。侦听器(){
@凌驾
公共无效调用(对象…参数){
@抑制警告(“未选中”)
映射头=(映射)参数[0];
字符串cookie=null;
if(headers.containsKey(“Set Cookie”)&&headers.get(“Set Cookie”).contains(“SERVERID”)){
cookie=headers.get(“Set cookie”).split(“;”)[0];
}
if(cookie!=null){
最终字符串stickyCookie=cookie;
如果(buf.length()==0){
追加(粘贴cookie);
}
运输公司(
Transport.EVENT\u请求\u标头,
新建发射器。侦听器(){
@凌驾
公共无效调用(对象…参数){
@抑制警告(“未选中”)
映射头=(映射)参数[0];
//设置标题
headers.put(“Cookie”,stickyCookie);
}
});
}
}
});
}            
}
});

我现在找到了解决问题的方法,因为haproxy提供了另一种平衡算法“源”,它将来自同一个“ip”的请求定向到同一个服务器……因为它对请求的源进行哈希运算。这样我就不必使用上面所有的代码了……(即,我不必对传输事件做任何事情).haproxy负责一切…:)

你应该在问题中包含你的代码,以防你链接的网站出现故障。当然。。。正在添加完整的代码:)
final StringBuffer buf = new StringBuffer();
socket.io().on(Manager.EVENT_TRANSPORT, new Emitter.Listener() {
    @Override
    public void call(Object... args) {
        final Transport transport = (Transport)args[0];

        if(transport.name.equalsIgnoreCase(WebSocket.NAME)){
            transport.once(Transport.EVENT_REQUEST_HEADERS, new Emitter.Listener() {
                @Override
                public void call(Object... args) {
                    @SuppressWarnings("unchecked")
                    Map<String, String> headers = (Map<String, String>)args[0];
                    if(buf.length()!=0){
                        headers.put("Cookie", buf.toString());
                    }
                }
            });
        }
        if(transport.name.equalsIgnoreCase(PollingXHR.NAME)){
            transport.once(Transport.EVENT_RESPONSE_HEADERS,
                    new Emitter.Listener() {
                        @Override
                        public void call(Object... args) {
                            @SuppressWarnings("unchecked")
                            Map<String, String> headers = (Map<String, String>) args[0];
                            String cookie = null;
                            if (headers.containsKey("Set-Cookie") && headers.get("Set-Cookie").contains("SERVERID")) {
                                cookie = headers.get("Set-Cookie").split(";")[0];
                            }
                            if (cookie != null) {
                                final String stickyCookie = cookie;
                                if(buf.length()==0){
                                    buf.append(stickyCookie);
                                }
                                transport.on(
                                        Transport.EVENT_REQUEST_HEADERS,
                                        new Emitter.Listener() {
                                            @Override
                                            public void call(Object... args) {
                                                @SuppressWarnings("unchecked")
                                                Map<String, String> headers = (Map<String, String>) args[0];
                                                // set header                                               
                                                headers.put("Cookie", stickyCookie);
                                            }
                                        });
                            }
                        }
                    });
        }            
    }
});