所以我有一个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) 对于客户,我们使用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) 我正在尝试连接到安全的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) 请原谅我提出这个新手问题,但我很困惑,并且显然不理解如何使用托管在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) 对于 JSR 356 - Java API for WebSocket,我知道参考实现是 Tyrus。
还有其他人吗?
如果没有,那么我猜 Tyrus 是所有应用程序服务器(Glassfish、JBossAS/Wildfly 等...)中的实现
我似乎遇到了一个问题,遇到了嵌入式 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
我正在通过 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) 我正在 android(Java) 上使用本教程中的TooTallNate 的 java websockets来使用 android 上的 websockets 进行连接,但我收到错误。我尝试了他们的其他草稿版本,但它们都不起作用。ws://draft org.java_websocket.drafts.Draft_10@4560b1d0 refuses handshake
我目前正在使用该类配置我的 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)
问题,WebSocketConfigurer和WebSocketMessageBrokerConfigurationSupport是什么关系?换句话说,我是否可以通过第一类 WebSocketMessageBrokerConfigurationSupport 的 API 从 WebSocketConfigurer 实现中添加配置,以便所有配置都保留在一个文件中?
我正在运行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