使用 Glassfish + Nginx + Javascript 的 Websocket

Posted

技术标签:

【中文标题】使用 Glassfish + Nginx + Javascript 的 Websocket【英文标题】:Websocket using Glassfish + Nginx + Javascript 【发布时间】:2015-04-16 09:57:15 【问题描述】:

我正在尝试使用 Glassfish 服务器和客户端的 javascript AngularJS 在 JavaEE 中使用 Websockets 制作聊天应用程序。我正在使用 nginx 代理连接。

Nginx 配置:

location /ws/ 
        proxy_pass http://10.10.127.78:8080;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
    

在 Glassfish 管理页面中,我启用了 web socket 模式并确保端口设置为 8080。

服务器端路径设置为:@ServerEndpoint(value = "/ws/chat/room")

好的,现在的问题是,我尝试连接到许多地址,每个地址都有一些问题:

    尝试以 localhost 身份连接:var serviceLocation = 'ws://localhost:8080/ws/chat/all/'; 此处的连接结果为 WebSocket connection to 'ws://localhost:8080/ws/chat/all/' failed: Error in connection establishment: net::ERR_CONNECTION_REFUSED

    尝试连接服务器ip:var serviceLocation = 'ws://10.10.127.78:8080/ws/chat/';导致连接超时WebSocket connection to 'ws://10.10.127.78:8080/ws/chat/all/' failed: Error in connection establishment: net::ERR_CONNECTION_TIMED_OUT

    尝试连接到域:var serviceLocation = 'ws://test.domain.com:8080/ws/chat/';结果是 404 WebSocket connection to 'ws://test.domain.com:8080/ws/chat/all/' failed: Error during WebSocket handshake: Unexpected response code: 404

无法让它工作。接下来我可以尝试什么?或者我做错了什么?如果您需要更多信息,请发表评论。谢谢,希望有人能帮忙。

我在 Jelastic 上托管所有这些环境。

更新:Javascript 代码

var wsocket;
var serviceLocation = 'ws://localhost:8080/ws/chat/';
//var serviceLocation = 'ws://10.10.127.78:8080/ws/chat/';
var nickName = $rootScope.loggedUser.user.firstName + " " + 
        $rootScope.loggedUser.user.lastName;
var room = 'all';
var $chatWindow = $('#response');


function onMessageReceived(evt) 
    var msg = JSON.parse(evt.data);
    var $appendedLine = $('<tr class="hidden-xs"><td>'+msg.received+' | '+msg.sender+'</td><td>'+msg.message+'</td></tr>\n\
                        <tr class="visible-xs"><td>'+msg.sender+': '+msg.message+'</td></tr>');
    $chatWindow.append($appendedLine);


function sendMessage() 
    var msg = '"message":"' + $scope.message + '", "sender":"'
                    + nickName + '", "received":""';
    wsocket.send(msg);
    $scope.message = "";


function connectToChatserver() 
    console.log(serviceLocation + room);
    wsocket = new WebSocket(serviceLocation + room);
    console.log("> ok");
    wsocket.onmessage = onMessageReceived;
    console.log("> connected to Web Socket server");



$scope.submitMessage = function() 
    sendMessage();
;


connectToChatserver();

更新:本地测试

我尝试将服务器镜像到本地机器并在没有 Nginx 的情况下在本地测试它并且它工作正常。我是否错过了 Nginx 上的任何内容,这可能是问题的原因?验证代理通过 ip 和端口,然后他们签出。

【问题讨论】:

在我看来第一个是正确的。根据其他错误(超时和 404,即未找到 HTTP),看起来甚至找不到资源。虽然连接 refused 看起来像是找到了资源,但是有一些错误配置导致服务器拒绝连接。您是否尝试过在 Chrome 中使用类似 JS 运行时检查器来添加断点和调试 Javascript? 嗨,迈克,谢谢你的提示,但它是空的。我用完整的 Javascript 代码更新了帖子,也许你能发现我没有发现的东西。 为了正确运行WebSockets,需要将公共IP添加到实例中,我认为这应该对你有所帮助。另外,您是否联系过您的托管服务提供商支持人员? 是的,我正在连接公共 IP,是的,我联系了托管服务提供商支持,我们调试了几个小时的问题。我们认为是 Glassfish 版本或 websocket 罐子中的一些问题干扰了 Glassfish 特定版本的 Jelastic 规范。我们仍在努力解决问题。 【参考方案1】:

好的,我发现了问题所在,我想分享一下。问题是从带有 jdk 8 服务器的 glassfish 4.1 上构建的构建到带有 jdk 7 的 glassfish 3.1.4 服务器的部署。 ofc问题是因为jdk版本出现的,但是由于服务器版本不同,服务器没有抛出任何版本异常问题所以我没有看到问题出在哪里(忘了我是从jdk 8服务器构建的)。

【讨论】:

以上是关于使用 Glassfish + Nginx + Javascript 的 Websocket的主要内容,如果未能解决你的问题,请参考以下文章

Jetty,Tomcat,Nginx,Geronimo,Glassfish:我很困惑

nginx tomcat glassfish session 复制配置

Nginx 作为虚拟主机和反向代理

Nginx 反向代理设置

Tomcat Jboss Glassfish 三种常见web容器比较

Maven+glassfish基础搭建与使用