标签: java-websocket

一段时间后没有收到输入后,WebSocket会话关闭

所以我有一个Websocket Session,它从服务器读取信息.但是,如果我切断了它完全接收的信息,大约一分钟后它将停止接收新信息,并且即使重新打开服务器的输出也不会做任何事情.

我以为是WebSocketContainer方法

setDefaultMaxSessionIdleTimeout(Long time)
Run Code Online (Sandbox Code Playgroud)

会解决我的问题,所以我把它设置为

container.setDefaultMaxSessionIdleTimeout(86400000L);
Run Code Online (Sandbox Code Playgroud)

我认为这意味着它将继续运行长达1天的不活动状态.

然而事实并非如此,它在一分钟不活动后就停止了.下面是我正在使用的代码,也许有人可以让我知道我做错了什么:

public void run(String... args) throws Exception {
    log.info("Starting...");
    log.info("-- API URL:  {}", apiUrl);
    log.info("-- API Token:  {}", apiToken);
    WebSocketContainer container = ContainerProvider.getWebSocketContainer();
    container.setDefaultMaxSessionIdleTimeout(86400000L);
    ClientEndpointConfig config = ClientEndpointConfig
            .Builder.create()
            .configurator(new CustomConfigurator(apiToken))
            .build();
    try {
        session = container.connectToServer(ConsumerClient.class, config, URI.create(apiUrl));
    } catch (DeploymentException de) {
        log.error("Failed to connect - DeploymentException:", de);
    } catch (IOException ioe) {
        log.error("IOException:", ioe);
    }
    if (this.session == null) {
        throw new RuntimeException("Unable to connect to endpoint.");
    }

    log.info("Max …
Run Code Online (Sandbox Code Playgroud)

java java-websocket

6
推荐指数
1
解决办法
926
查看次数

Tomcat 关闭 websocket 连接并出现错误

对于客户,我们使用Tomcat 8.0.29构建了一个 HTML5 websocket 应用程序。如果我们从我们的网络或我们的家庭网络启动应用程序,一切正常。但是如果客户从他的网络启动应用程序,一段时间后 websocket 会因错误而停止。这可能会在 5 或 20 分钟后发生。

我们已经在使用和不使用 SSL 以及两台不同的服务器上对其进行了测试。只有在客户网络中,连接会因错误而中断。

我们还使用Tomcat 中包含的 websocket echo 示例进行了测试。和我们的 websocket 一样。一段时间后,websocket 因错误而停止。但前提是我们从客户网络启动应用程序。

当 echo 示例因错误而停止时,以下消息将写入 server.log

08-Dec-2015 10:20:37.757 SEVERE [http-apr-8081-exec-2] org.apache.tomcat.websocket.pojo.PojoEndpointBase.onError No error handling configured for [websocket.echo.EchoAnnotation] and the following error occurred
 java.io.IOException: Unexpected error [730,054] reading data from the APR/native socket [1,639,490,672] with wrapper [org.apache.tomcat.util.net.AprEndpoint$AprSocketWrapper@231e01e4:1639490672].<br/>
    at org.apache.coyote.http11.upgrade.AprServletInputStream.doRead(AprServletInputStream.java:133)<br/>
    at org.apache.coyote.http11.upgrade.AbstractServletInputStream.read(AbstractServletInputStream.java:124)<br/>
    at org.apache.tomcat.websocket.server.WsFrameServer.onDataAvailable(WsFrameServer.java:51)<br/>
    at org.apache.tomcat.websocket.server.WsHttpUpgradeHandler$WsReadListener.onDataAvailable(WsHttpUpgradeHandler.java:183)<br/>
    at org.apache.coyote.http11.upgrade.AbstractServletInputStream.onDataAvailable(AbstractServletInputStream.java:198)<br/>
    at org.apache.coyote.http11.upgrade.AbstractProcessor.upgradeDispatch(AbstractProcessor.java:96)<br/>
    at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:669)<br/>
    at org.apache.tomcat.util.net.AprEndpoint$SocketProcessor.doRun(AprEndpoint.java:2500)<br/>
    at org.apache.tomcat.util.net.AprEndpoint$SocketProcessor.run(AprEndpoint.java:2489)<br/>
    at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)<br/> …
Run Code Online (Sandbox Code Playgroud)

java tomcat websocket tomcat8 java-websocket

6
推荐指数
1
解决办法
3071
查看次数

连接安全Web套接字时'java.security.cert.CertificateExpiredException:NotAfter'

我正在尝试连接到安全的Web套接字以使用API​​.以下是源代码.托管环境配置是JRE 1.7和Tomcat 7.

import java.net.URI;
import javax.websocket.ClientEndpoint;
import javax.websocket.CloseReason;
import javax.websocket.ContainerProvider;
import javax.websocket.OnClose;
import javax.websocket.OnMessage;
import javax.websocket.OnOpen;
import javax.websocket.Session;
import javax.websocket.WebSocketContainer;
import org.apache.log4j.Logger;

@ClientEndpoint
public final class SocketRateFeed 
{
    private static final Logger logger = Logger.getLogger(SocketRateFeed.class);
    private Session sessionWS;

    public static void startContainer()
    {
        try
        {
            URI wsURI = new URI("wss://websocket.abc.xyz/?api_key=qwerty&user_id=ASDF");
            WebSocketContainer container = ContainerProvider.getWebSocketContainer();
            container.connectToServer(new SocketRateFeed() , wsURI);
        }
        catch(Exception exp)
        {
                logger.error(exp.getMessage() , exp);
        }
    }

    ....other annotated methods
}
Run Code Online (Sandbox Code Playgroud)

这是堆栈跟踪.

28-02-2017 11:24:37 localhost-startStop-1 ERROR SocketRateFeed.startContainer(30) …
Run Code Online (Sandbox Code Playgroud)

java ssl keystore openshift java-websocket

6
推荐指数
0
解决办法
8346
查看次数

如何给Java Websocket提供证书?

请原谅我提出这个新手问题,但我很困惑,并且显然不理解如何使用托管在HTTPS. 我在网上找到的所有内容都让我的问题多于答案。

我的HTTPS网站上有一个使用 Java 代码托管的 Websocket 服务器。

这是我的WebsocketServer.java文件:

import org.java_websocket.WebSocket;
import org.java_websocket.handshake.ClientHandshake;
import org.java_websocket.server.WebSocketServer;

import java.net.InetSocketAddress;
import java.util.HashSet;
import java.util.Set;

import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;

public class WebsocketServer extends WebSocketServer {

    private static final Logger logger = LogManager.getLogger(WebsocketServer.class);

    private static int TCP_PORT = 6868;

    private static Set<WebSocket> conns;

    public WebsocketServer() {
        super(new InetSocketAddress(TCP_PORT));
        conns = new HashSet<>();
    }

    @Override
    public void onOpen(WebSocket conn, ClientHandshake handshake) {
        conns.add(conn);
        logger.info("New connection from " + conn.getRemoteSocketAddress().getAddress().getHostAddress());
        logger.info("Size of …
Run Code Online (Sandbox Code Playgroud)

java websocket java-websocket ws

6
推荐指数
1
解决办法
1289
查看次数

有哪些可用的 Java EE Websockets 实现?

对于 JSR 356 - Java API for WebSocket,我知道参考实现是 Tyrus。

还有其他人吗?

如果没有,那么我猜 Tyrus 是所有应用程序服务器(Glassfish、JBossAS/Wildfly 等...)中的实现

websocket java-ee-7 java-websocket jakarta-ee

5
推荐指数
1
解决办法
3648
查看次数

Spring Boot Stomp WebSocket

我似乎遇到了一个问题,遇到了嵌入式 tomcat 对 stomp websocket 消息的 8k 大小限制。

从服务器向客户端发送消息时,出现以下错误。根据我读过的文档,似乎 tomcat 对通过 websockets 的消息有 8k 的限制,但我也读到 Stomp 可以发送部分消息并让客户端重新组装它们,这似乎没有发生。

消息永远不会到达客户端处理程序,所以我非常有信心问题出在我的 WebSocketConfig 中,但似乎无论我尝试过什么参数,我都无法克服 8k 消息和/或 B 的 A) 大小限制) 如果超过缓冲区限制,则以部分消息块的形式发送它。

双方都有如下错误码

[code=1009, reason=The decoded text message was too big for the output buffer and the endpoint does not support partial messages]
Run Code Online (Sandbox Code Playgroud)

我很确定我错过了一些简单的东西,但似乎无法解决它。任何额外的眼睛将不胜感激。谢谢!

服务器端 Stomp WebSocket 配置

@Configuration
@EnableWebSocketMessageBroker
public class WebSocketConfig extends AbstractWebSocketMessageBrokerConfigurer {


private static final Logger logger = LoggerFactory.getLogger(WebSocketConfig.class);



@Override
public void configureMessageBroker(MessageBrokerRegistry config) {
    config.enableSimpleBroker(
            "/resp",
            "/not", 
            "/sub"
        );
    config.setApplicationDestinationPrefixes("/admin"); …
Run Code Online (Sandbox Code Playgroud)

stomp spring-boot spring-websocket java-websocket embedded-tomcat-8

5
推荐指数
2
解决办法
4436
查看次数

koush Websocket 握手失败

我正在通过 koush https://github.com/koush/AndroidAsync试用该库。

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

AsyncHttpClient.getDefaultInstance().websocket(uri, null, new AsyncHttpClient.WebSocketConnectCallback() {
            @Override
            public void onCompleted(Exception ex, WebSocket webSocket) {
                if (ex != null) {
                    ex.printStackTrace();
                    return;
                }
                webSocket.send("a string");
                webSocket.send(new byte[10]);
                webSocket.setStringCallback(new WebSocket.StringCallback() {
                    public void onStringAvailable(String s) {
                        System.out.println("I got a string: " + s);
                    }
                });
                webSocket.setDataCallback(new DataCallback() {
                    public void onDataAvailable(DataEmitter emitter, ByteBufferList byteBufferList) {
                        System.out.println("I got some bytes!");
                        // note that this data has been read
                        byteBufferList.recycle();
                    }
                });
            }
        }); …
Run Code Online (Sandbox Code Playgroud)

java android androidasync-koush java-websocket

5
推荐指数
0
解决办法
161
查看次数

Java websocket 草案拒绝握手

我正在 android(Java) 上使用本教程中的TooTallNate 的 java websockets来使用 android 上的 websockets 进行连接,但我收到错误。我尝试了他们的其他草稿版本,但它们都不起作用。ws://draft org.java_websocket.drafts.Draft_10@4560b1d0 refuses handshake

java android java-websocket

5
推荐指数
1
解决办法
3882
查看次数

Spring Websocket 配置:一起使用 WebSocketMessageBrokerConfigurationSupport 和 WebSocketConfigurer - 如何?

我目前正在使用该类配置我的 Spring Websocket

public class WebSocketConfig extends WebSocketMessageBrokerConfigurationSupport
Run Code Online (Sandbox Code Playgroud)

现在我遇到了建议 Spring STOMP Websockets: any way to enable permessage-deflate on server side?

这利用

public class SampleJettyWebSocketsApplication implements WebSocketConfigurer 
Run Code Online (Sandbox Code Playgroud)

并覆盖

@Override
public void registerWebSocketHandlers(WebSocketHandlerRegistry registry)
Run Code Online (Sandbox Code Playgroud)

并提供

@Bean
public DefaultHandshakeHandler handshakeHandler() 
Run Code Online (Sandbox Code Playgroud)

问题,WebSocketConfigurerWebSocketMessageBrokerConfigurationSupport是什么关系?换句话说,我是否可以通过第一类 WebSocketMessageBrokerConfigurationSupport 的 API 从 WebSocketConfigurer 实现中添加配置,以便所有配置都保留在一个文件中?

spring jetty websocket spring-websocket java-websocket

5
推荐指数
1
解决办法
4229
查看次数

Spring WebFlux 经过身份验证的 WebSocket 连接

我正在运行Spring Boot@2.2.x带有公开 WebSocket 端点的服务器。这是我的WebSocketConfiguration

@Slf4j
@Configuration
public class WebSocketConfiguration {

    private static final String WS_PATH = "/ws/notifications";

    @Bean
    public HandlerMapping webSocketHandlerMapping() {
        Map<String, WebSocketHandler> handlersMap = new HashMap<>();
        handlersMap.put(WS_PATH, session -> session.send(session.receive()
                                                                .map(WebSocketMessage::getPayloadAsText)
                                                                .doOnEach(logNext(log::info))
                                                                .map(msg -> format("notification for your msg: %s", msg))
                                                                .map(session::textMessage)));

        SimpleUrlHandlerMapping handlerMapping = new SimpleUrlHandlerMapping();
        handlerMapping.setOrder(Ordered.HIGHEST_PRECEDENCE);
        handlerMapping.setUrlMap(handlersMap);
        return handlerMapping;
    }

    @Bean
    public WebSocketHandlerAdapter handlerAdapter(WebSocketService webSocketService) {
        return new WebSocketHandlerAdapter(webSocketService);
    }

    @Bean
    public WebSocketService webSocketService() {
        return new HandshakeWebSocketService(new ReactorNettyRequestUpgradeStrategy());
    }
}
Run Code Online (Sandbox Code Playgroud)

问题是如何使用Basic …

websocket spring-boot spring-websocket java-websocket spring-webflux

5
推荐指数
1
解决办法
2061
查看次数