我正在尝试确定客户端是否已从netty关闭套接字连接.有没有办法做到这一点?
我正在使用netty和ios构建服务器客户端应用程序,当用户只关闭他/她的ios设备上的WiFi时,我遇到了问题,netty服务器不知道它.服务器需要知道为该用户进行清理并将他/她设置为脱机,但现在当用户再次尝试连接时,服务器只是告诉他他/她已经在线.
令人沮丧的是,HawtDispatch的网站将其描述为"线程池和NIO事件通知框架API".
我们先来看一下'线程池'部分.Java提供的大多数Executor也基本上都是线程池.HawtDispatch有何不同?
它显然也是一个"NIO事件通知框架API".我假设它是顶层NIO上的一个薄层,它接收传入数据并传递给它的"线程池"概念,并在线程池调度程序找到时间时将其传递给使用者.正确?(欢迎对NIO进行任何改进).有没有人对netty和HD做过任何性能分析?
我正在使用Netty websockets,除了这个小问题,一切似乎都运行正常:
如果我关闭js websocket客户端的浏览器/选项卡,当使用Mozilla firefox(目前使用firefox 14)时,websocket连接会自动关闭,但在Chrome 20/21中也不会发生同样的事情.
任何人看到类似的问题/任何人都可以告诉为什么连接不会自动关闭?
我需要让客户端能够建立许多连接.我使用Netty 4.0.不幸的是,所有现有示例都没有显示如何创建大量连接.
public class TelnetClient {
private Bootstrap b;
public TelnetClient() {
b = new Bootstrap();
}
public void connect(String host, int port) throws Exception {
try {
b.group(new NioEventLoopGroup()).channel(NioSocketChannel.class).remoteAddress(host, port).handler(new TelnetClientInitializer());
Channel ch = b.connect().sync().channel();
ChannelFuture lastWriteFuture = null;
BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
for (;;) {
String line = in.readLine();
if (line == null) break;
lastWriteFuture = ch.write(line + "\r\n");
if (line.toLowerCase().equals("bye")) {
ch.closeFuture().sync();
break;
}
}
if (lastWriteFuture != null) lastWriteFuture.sync();
} finally {
b.shutdown();
} …Run Code Online (Sandbox Code Playgroud) 我正在使用Netty 4.我看到了Netty服务器的下列选项:WRITE_BUFFER_HIGH_WATER_MARK和WRITE_BUFFER_LOW_WATER_MARK.
官方页面相关文章链接到Norman Maurer的Netty最佳实践(带视频的幻灯片).幻灯片之一看起来像这样:
ServerBootstrap bootstrap = new ServerBootstrap();
bootstrap.childOption(ChannelOption.WRITE_BUFFER_HIGH_WATER_MARK, 32 * 1024);
bootstrap.childOption(ChannelOption.WRITE_BUFFER_LOW_WATER_MARK, 8 * 1024);
Run Code Online (Sandbox Code Playgroud)
并有这个前言:
设置理智的WRITE_BUFFER_HIGH_WATER_MARK和WRITE_BUFFER_LOW_WATER_MARK
但它是什么WRITE_BUFFER_HIGH_WATER_MARK和WRITE_BUFFER_LOW_WATER_MARK?以及如何让他们理智?
我没有找到任何明确的信息.谢谢你的帮助.
我有6个容器在docker swarm中运行.Kafka + Zookeeper,MongoDB,A,B,C和Interface.接口是public的主要访问点 - 只有这个容器发布端口 - 5683.接口容器在启动时连接到A,B和C. 我正在使用docker-compose文件+ docker堆栈部署,每个服务都有一个名称,用作接口的主机.一切都成功开始,工作正常.一段时间后(20分钟,1小时......),我无法提出接口请求.接口接收我的请求但应用程序丢失了与服务A,B,C或所有服务的连接.如果我重新启动接口,它可以重新连接到服务A,B,C.
我首先认为这是应用程序的问题,所以我在每个服务(接口,A,B,C)上公开了2个新端口,并与它们连接了探查器和调试器.应用程序正常运行,没有泄漏,没有阻塞的线程,正常工作并等待连接.调试器向我显示,当我向接口发出请求并且接口尝试请求服务A时,抛出了由对等异常重置的连接.
在调试期间,我发现了有趣的东西.我在服务启动时将调试器附加到接口,并且一段时间后调试器也断开连接.+我无法重新连接它,直到我向容器 - >应用程序发出请求.PRoblem - 握手失败.
我发现的另一个有趣的东西是我无法请求任何接口.所以我用wireshark来看看发生了什么事:SYN-ACK很好.然后应用程序发布一些数据和接口响应FIN,ACK.我假设当接口尝试请求服务A并且FIN连接时也会发生这种情况.接口,A,B和C的代码库与netty服务器相同.
最后,我不认为这是一个应用程序问题.为什么?我试图将容器部署为服务.我分别运行每个容器,发布每个端口并将服务端点设置为localhost.(不覆盖网络).它正在发挥作用.容器运行没有问题.+我一开始没有说,java应用程序(接口,A,B,C)在作为独立应用程序运行时运行没有问题 - 而不是在docker中运行.
你能帮我解决一下这个问题吗?为什么在覆盖网络的情况下docker正在关闭套接字?
我正在使用最新的码头工具.我也用过了.
RestTemplate示例如下.
public class SimpleClient {
private final String URL;
private AsyncRestTemplate rest = new AsyncRestTemplate(new Netty4ClientHttpRequestFactory());
private RestTemplate restTemplate = new RestTemplate(new Netty4ClientHttpRequestFactory());
public SimpleClient(String url) {
this.URL = url;
Netty4ClientHttpRequestFactory nettyFactory = new Netty4ClientHttpRequestFactory();
try {
nettyFactory.setSslContext(SslContextBuilder.forClient().build());
} catch (SSLException e) {
e.printStackTrace();
}
rest = new AsyncRestTemplate(nettyFactory);
}
@Override
public ResponseEntity<ResponseData> doSendByPOST(RequestData data,Class<ResponseData> clazz) {
List<HttpMessageConverter<?>> messageConvertors = new ArrayList<>();
messageConvertors.add(new MappingJackson2HttpMessageConverter());
rest.setMessageConverters(messageConvertors);
restTemplate.setMessageConverters(messageConvertors);
HttpHeaders headers = new HttpHeaders();
ObjectMapper objectMapper = new ObjectMapper();
StringWriter writer = new …Run Code Online (Sandbox Code Playgroud) netty ×10
java ×3
client ×1
connection ×1
docker ×1
docker-swarm ×1
ios ×1
protocols ×1
resttemplate ×1
spring ×1
tcp ×1
tcp-ip ×1
threadpool ×1
timeout ×1
websocket ×1