当前位置: 首页 > 知识库问答 >
问题:

Tyrus服务器可以使用内部类终结点吗?

云慈
2023-03-14
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();
            }
        }
    }
}

最后是在服务器使用时工作的非内部类服务器endpoint:

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);
    }
}

共有1个答案

糜帅
2023-03-14

在服务器上,endpoint可以是内部类,但也必须是静态的。尽管代码是运行和服务的,但出于某种原因,我只能在服务器endpoint也是静态的情况下使其工作。IE:更改为在服务器代码中添加静态:

@serverendpoint(“/myapp”)公共静态类InnerSimpleServerEndpoint{}

您可能还想添加

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

 类似资料:
  • 在 Serenity 中,服务终结点是 ASP.NET MVC 控制器的一个子类。 这是 Northwind 的 OrderEndpoint 摘录: namespace Serene.Northwind.Endpoints { [RoutePrefix("Services/Northwind/Order"), Route("{action}")] [ConnectionKey("N

  • 我正在尝试使用Tyrus1.8.2的编程endpoint创建一个websocket服务器。我发现构造者: 我错过了什么? 附加信息:我扩展了TyrusServerEndpointConfigurator,并为modifyHandshake()方法提供了一个重写。服务器返回404而没有调用此方法。

  • 我有一个endpoint,我需要从类内部的方法调用它。 控制器有。如何从该方法调用此控制器?

  • 服务器升级到PHP5.6后,我的SilverStripe站点出现问题。我的web主机将服务器从PHP5.3升级到PHP5.6,现在每个页面上都会出现500个服务器错误。 来自SilverStripe的消息是: 很抱歉,处理您的请求时出现问题。 在服务器错误日志文件中没有错误条目。在服务器访问日志中,您可以看到500错误: 错误:[09/Mar/2016:11:12:07 0100]“GET/Sec

  • 我想在项目拆除脚本中添加项目的endpoint。在运行项目之前,用户将通过所有请求和测试请求分配他们的endpoint,为了获得所有请求和测试请求的endpoint,语法是什么? 我看到了一个使用测试步骤的示例,但我不想通过测试步骤路由检索它: 分解脚本使用日志、上下文、运行程序和项目变量。 谢谢

  • 问题内容: 关于编译器错误,有一些关于Stack Overflow的主题,解决方案是“将其声明为最终的,您就完成了”,但是对于这个 理论性的 问题,我想检查一下该代码无法编译的逻辑原因是什么: (解决方案:声明为final),而这一点却做到了: 我真的很困惑 不是最终值,它可以多次更改,而的可怜参数只能在其方法体内更改,而是由编译器负责;) 甚至编译器错误也误导了我。: 与什么不同?与内部类不是在