WebSockets、GlassFish、Grizzly -- 无法连接

发布于 2024-12-07 11:48:07 字数 1565 浏览 0 评论 0原文

我正在尝试开始使用 WebSockets,并尝试编写一个简单的应用程序来通过 websoket 来回发送消息。

但是,我尝试创建的套接字似乎永远无法连接。为什么会这样呢?

下面是我的 WebSockets 类的代码。当调用 .onConnect() 时,它会记录:

我是socket,我已连接。我连接了吗? - 错误

更新:在JavaScript中,我在其中创建有问题的套接字,readyState1,这意味着“套接字打开,可以进行通信” ”。

import a.b.Misc; //writes logs.

import com.sun.grizzly.websockets.BaseServerWebSocket;
import com.sun.grizzly.websockets.DataFrame;
import com.sun.grizzly.websockets.WebSocketListener;

public class ChatWebSocket_v2 extends BaseServerWebSocket {
    private String user;
    public ChatWebSocket_v2(WebSocketListener... listeners) {
        super(listeners);
    }
    public String getUser() {
        if (user == null) {
            Misc.print("User is null in ChatWebSocket");
            throw new NullPointerException("+=The user is null in chat web socket");
        }
        return user;
    }
    public void setUser(String user) {
        Misc.print("Just set user: " + user);
        this.user = user;
    }
    @Override
    public void onMessage(String message) {
        Misc.print(message +"\n");
    }
    @Override
    public void onMessage(byte[] message) {
        Misc.print(new String(message) +" << Bytes\n");
    }
    @Override 
    public void onConnect() {
        Misc.print("I am socket, i was connected. Am i connected? - " + this.isConnected());
    }
    @Override 
    public void onClose(DataFrame df) {
        Misc.print("I am socket, i was closed");
    }
}

I am trying to get started with WebSockets, and trying to write a simple application to send messages back and forth via a websoket.

However, it looks like the socket that I am trying to create never gets connected. Why can that be?

Below is the code of my WebSockets class. When .onConnect() is called, it logs:

I am socket, I was connected. Am i connected? - false

Update: in JavaScript, where I create the socket in question, the readyState is 1, which means "socket open, communication is possble".

import a.b.Misc; //writes logs.

import com.sun.grizzly.websockets.BaseServerWebSocket;
import com.sun.grizzly.websockets.DataFrame;
import com.sun.grizzly.websockets.WebSocketListener;

public class ChatWebSocket_v2 extends BaseServerWebSocket {
    private String user;
    public ChatWebSocket_v2(WebSocketListener... listeners) {
        super(listeners);
    }
    public String getUser() {
        if (user == null) {
            Misc.print("User is null in ChatWebSocket");
            throw new NullPointerException("+=The user is null in chat web socket");
        }
        return user;
    }
    public void setUser(String user) {
        Misc.print("Just set user: " + user);
        this.user = user;
    }
    @Override
    public void onMessage(String message) {
        Misc.print(message +"\n");
    }
    @Override
    public void onMessage(byte[] message) {
        Misc.print(new String(message) +" << Bytes\n");
    }
    @Override 
    public void onConnect() {
        Misc.print("I am socket, i was connected. Am i connected? - " + this.isConnected());
    }
    @Override 
    public void onClose(DataFrame df) {
        Misc.print("I am socket, i was closed");
    }
}

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

萌酱 2024-12-14 11:48:07

如果您只是想在某个地方建立连接,您可能想尝试这个。有一个实时工作演示,您可以下载javascript代码并自己玩一下。请注意,JavaScript 代码仅在您将其安装在服务器上时才有效(由于浏览器安全性,因为它很“花哨”。)还有一个基于浏览器的客户端分步教程正在制作中,我将在发布后立即发布准备好。大多数代理服务器尚未升级为处理 Websocket,因此它们会搞砸连接请求,并且大多数人将无法在工作中连接到 Websocket 服务器。 Firefox 7(发行版)或 Google Chrome 14 或更高版本支持演示服务器运行的最新版本的 websocket 协议。

如果您想尝试让 grizzly 演示正常工作,您可能需要进行一些调试,也许我会提供帮助。请注意,在文章下面的评论中,其他人说他们无法让它工作要么,我还没有找到任何后续行动。在这一点上,即使我们确实让它运行,它似乎也不比上面的 echo 应用程序更好,并且如果您只是想开始使用,它可能过于复杂且记录不足。但如果你想尝试让它运行,你应该'git'最新版本的代码 这里,至少是最近提交的并且可能会被修复。

然后确保应用程序 javascript 文件中的 app.url 设置为您的安装目录。他的硬编码为:

url: 'ws://localhost:8080/grizzly-websockets-chat/chat',

如果您使用的是 Firefox 7,则需要修改 javascript 以使用 Moz 前缀,例如:

  if (typeof MozWebSocket != "undefined") { // window.MozWebSocket or "MozWebSocket" in window
    ok
  } else if (window.WebSocket) {  // he uses  if ("WebSocket" in window)
    ok
  } else {
    do your print "browser doesn't support websockets"
  }
  .... then if the browser supports websockets
  websocket = new WebSocket(app.url); or
  websocket = new MozWebSocket(app.url); 
  // depending on which it is.

HLL websocket 服务器演示代码 已经解决了这一切。

(另一个)更新:当我自己处理 grizzly 时,我在 glassfish 管理控制台的快速入门中发现,有一个 hello 示例,非常容易设置和运行。您会在那里找到说明。示例目录还包含一个名为:websocket-mozilla 的 war 文件;所以我猜它应该使用 websockets。熟悉jsp的人应该查看源代码。我只能看到它正在使用 http 会话。根本没有提到 websocket。这很像 hello 示例。

If you're just trying to make a connection somewhere, you might want to try this instead. There is a live working demo and you can download the javascript code and play with it yourself. Note that the javascript code only works if you have it installed on a server (due to browser security because it's 'fancy'.) There is also a step by step browser-based client tutorial in the works that I will post as soon as it's ready. Most proxy servers haven't been upgraded to handle websockets so they will screw up connection request and most people won't be able to connect to websocket servers from work. Firefox 7 (release) or Google Chrome 14 or later support the latest version of the websocket protocol that the demo server runs.

If you want to try to get the grizzly demo working, you might have some debugging to do and maybe I'll help with that. Note that in comments below the article, other people said they couldn't get it working either and I haven't found any follow up. At this point it seems no better than the echo app above even if we do get it running and is possibly overly complicated and underly documented if you're just trying to get started. But if you want to try to get it running, you should 'git' the latest version of the code here, which was at least committed recently and may be fixed.

Then make sure that app.url in the application javascript file is set to your installation directory. His is hard-coded as:

url: 'ws://localhost:8080/grizzly-websockets-chat/chat',

If you're using Firefox 7, the javascript needs to be modified to use the Moz prefix, for example:

  if (typeof MozWebSocket != "undefined") { // window.MozWebSocket or "MozWebSocket" in window
    ok
  } else if (window.WebSocket) {  // he uses  if ("WebSocket" in window)
    ok
  } else {
    do your print "browser doesn't support websockets"
  }
  .... then if the browser supports websockets
  websocket = new WebSocket(app.url); or
  websocket = new MozWebSocket(app.url); 
  // depending on which it is.

The HLL websocket server demo code has this all sorted out.

(another) UPDATE: As I work through grizzly myself, I found on the Quick Start in the glassfish admin console, there's a hello sample that's pretty easy to set up and run. You'll find instructions there. The sample directory also contains a war file named: websocket-mozilla; so I guess its supposed to use websockets. Someone who's familiar with jsp should review the source code. All I can see is that it's using an http session. No mention of a websocket at all. It's a lot like the hello sample.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文