gpt4 book ai didi

java - Tyrus 服务器可以使用内部类端点吗?

转载 作者:行者123 更新时间:2023-11-30 11:07:28 31 4
gpt4 key购买 nike

我在让一个非常简单的独立 Tyrus websocket 服务器工作时遇到了问题。我已经让这个在对我来说没有意义的非常特殊的情况下工作。

正确工作的情况是我定义了一个顶级(在它自己的文件中)服务器端点类并用@ServerEndpoint 注释它。此类包括使用@OnOpen、@OnMessage 和@OnClose 注释的方法,所有这些都是典型的东西。我将此类传递给服务器构造函数。我的简单客户端可以连接到该服务器,并成功向其发送服务器接收到的消息。

当我将顶级服务器端点类更改为正在初始化服务器的类的内部类时出现问题(这是我所做的唯一更改)。在这种情况下,我的客户端可以连接并调用客户端的@OnOpen 方法。但是服务器不会实例化服务器端点,因此永远不会调用它的@OnOpen 方法。显然,不会发生服务器消息接收。

Tyrus 中是否要求带注释的服务器端点类不能是内部类?如果没有,是否对服务器端点类有特定的权限(一切都已公开,试图让它正常工作但没有运气)?我在 Mac OSX 1.9.5 上使用 Tyrus 1.9 和 JDK 1.7。

简单服务器(包括并配置为使用失败的内部服务器端点):

package tyrus.example;

import java.util.concurrent.TimeUnit;

import javax.websocket.CloseReason;
import javax.websocket.OnClose;
import javax.websocket.OnMessage;
import javax.websocket.OnOpen;
import javax.websocket.Session;
import javax.websocket.server.ServerEndpoint;

import org.glassfish.tyrus.server.Server;

public class SimpleServer
{
private static final String HOST_ADDR = "localhost";
private static final int HOST_PORT = 8025;

public static void main(String[] args) {
Server websocketServer = new Server(HOST_ADDR, HOST_PORT, "/ws", null, InnerSimpleServerEndpoint.class);

try {
websocketServer.start();
Thread.sleep(TimeUnit.MINUTES.toMillis(5));
}
catch (Exception e) {
e.printStackTrace();
}

websocketServer.stop();

System.out.println("Done.");
}

@ServerEndpoint("/myapp")
public class InnerSimpleServerEndpoint {
@OnOpen
public void onOpen(Session session) {
System.out.println("Connection received for "+session.getRequestURI());
}

@OnMessage
public void onMessage(String message, Session session) {
System.out.println("Message received: "+message);
}

@OnClose
public void onClose(Session session, CloseReason closeReason) {
System.out.println("Session closed, reason: "+closeReason);
}
}
}

简单客户端:

package tyrus.example;

import java.io.IOException;
import java.net.URI;

import javax.websocket.ClientEndpointConfig;
import javax.websocket.Endpoint;
import javax.websocket.EndpointConfig;
import javax.websocket.MessageHandler;
import javax.websocket.Session;

import org.glassfish.tyrus.client.ClientManager;

public class SimpleClient
{
private static final String DEF_WS_URL = "ws://localhost:8025/ws/myapp";

public static void main(String[] args) {
ClientEndpointConfig cec = ClientEndpointConfig.Builder.create().build();
ClientManager client = ClientManager.createClient();

try {
client.connectToServer(new ClientEndpoint(), cec, new URI(DEF_WS_URL));
} catch (Exception e) {
e.printStackTrace();
}

System.out.println("Done.");
}

private static class ClientEndpoint extends Endpoint {
@Override
public void onOpen(Session session, EndpointConfig config) {
System.out.println("ClientEndpoint: server session opened: "+session);

session.addMessageHandler(new MessageHandler.Whole<String>() {
@Override
public void onMessage(String message) {
System.out.println("ClientEndpoint: received message: "+message);
}
});

try {
session.getBasicRemote().sendText("Hello server!");
}
catch (IOException e) {
e.printStackTrace();
}
}
}
}

最后是在服务器使用它时起作用的非内部类服务器端点:

package tyrus.example;

import javax.websocket.CloseReason;
import javax.websocket.OnClose;
import javax.websocket.OnMessage;
import javax.websocket.OnOpen;
import javax.websocket.Session;
import javax.websocket.server.ServerEndpoint;

@ServerEndpoint("/myapp")
public class SimpleServerEndpoint {
@OnOpen
public void onOpen(Session session) {
System.out.println("Connection received for "+session.getRequestURI());
}

@OnMessage
public void onMessage(String message, Session session) {
System.out.println("Message received: "+message);
}

@OnClose
public void onClose(Session session, CloseReason closeReason) {
System.out.println("Session closed, reason: "+closeReason);
}
}

最佳答案

在服务器上,端点可以是内部类,但也必须是静态的。即使代码运行并提供服务,出于某种原因,我也只能在服务器端点也是静态的情况下才能使其工作。即:更改为在服务器代码中添加静态:


@ServerEndpoint("/我的应用程序")
公共(public)静态类 InnerSimpleServerEndpoint {
}

您可能还想添加


@OnError
public void onError(Session session, Throwable throwable) {
//...
}

关于java - Tyrus 服务器可以使用内部类端点吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28933420/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com