我正在尝试使用Netty的第一步,为此我在Net上编写了简单的服务器,在oio plain TCP上编写了简单的客户端.
客户端发送随机文本包,并且必须接收"ack"消息.请参阅处理程序方法:
@Override
public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {
ctx.write("Ack");
ctx.flush();
ByteBuf in = (ByteBuf) msg;
StringBuilder sb = new StringBuilder();
try {
while (in.isReadable()) {
sb.append((char) in.readByte());
}
} finally {
ReferenceCountUtil.release(msg);
}
LOG.debug("Incoming message. ACK was send");
String myaddr = ctx.channel().remoteAddress().toString();
String message = "Message from " + myaddr + " :" + sb.toString();
LOG.debug(message);
sendToOther(myaddr, message);
}
Run Code Online (Sandbox Code Playgroud)
问题是 - 当我尝试发回"Ack"字符串时 - 客户端什么也得不到.但是当我尝试发回传入消息时 - 它工作正常,我在客户端看到回声.
@Override
public void channelRead(ChannelHandlerContext ctx, Object msg) throws …Run Code Online (Sandbox Code Playgroud) 我制作了一个基于Tomcat和Nginx的web项目.
不得不努力工作,没有错误.
但是,当我将ssl添加到nginx时.停止工作服务器发送事件.
如果我直接使用后端服务器 - 它可以正常工作,所以问题就在于nginx.
有人有这样的问题吗?
这是配置的相关部分
我的nginx.conf(我还没有使用网站启用,也把我的应用配置在这里.在conf结束时的基本设置)./ SecurConfig/api/tutorial/listen - 是事件的来源
user www-data;
worker_processes 4;
pid /run/nginx.pid;
events {
worker_connections 768;
# multi_accept on;
}
http {
root /data/;
server{
listen 80;
# server_name ajaxdemo.in.ua;
# proxy_set_header Host ajaxdemo.in.ua;
location / {
rewrite ^(.*)$ https://ajaxdemo.in.ua$1 permanent;
}
}
server {
#listen 80;
listen 443 default ssl;
#ssl on;
ssl_certificate /etc/nginx/ssl/server.crt;
ssl_certificate_key /etc/nginx/ssl/server.key;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
location / {
root /data/www; …Run Code Online (Sandbox Code Playgroud) 请给我建议如何增加ByteBuf的初始容量。
在这样的情况下:
@Override
protected void decode(ChannelHandlerContext ctx, ByteBuf in, List<Object> out) throws Exception {
byte[] byteinput = new byte[in.readableBytes()];
in.readBytes(byteinput);
//further handling...
}
Run Code Online (Sandbox Code Playgroud)
如果收入消息超过ByteBuf的最大容量-我将得到削减的数据。对于整个项目而言,获得完整的,非分块的消息至关重要。
我想我需要在引导子选项OptionOptions或在ChannelInitializer内部的cannel.config()中设置ByteBuf的初始容量。
我尝试了不同的方法,例如设定
ch.config().setReceiveBufferSize(1024)
Run Code Online (Sandbox Code Playgroud)
但我仍然具有相同的ByteBuf容量值(例如496)。
UPD
我发现了使用Wireshk进行的协议通信,以及从测试用户客户端传入和传出的1,4k数据包都未损坏。此问题仅与净值设置有关。操作系统套接字缓冲区不会剪切消息。
我正在开发的应用程序服务器部分将基于Netty 4.0。但是,我遇到了通道共享变量的问题。
我已经读过要在其他需要使用的上下文处理程序中使用此类变量
而不只是
将我的变量附加到当前频道
像这儿:
public class HadlePackets extends ChannelInboundHandlerAdapter {
private static final Logger LOG = LoggerFactory.getLogger(HadlePackets.class);
public AttributeKey<Integer> clientIDattrKey = new AttributeKey<Integer> ("ClientID");
@Override
public void channelRead(ChannelHandlerContext ctx, Object message) throws Exception {
...
ctx.channel().attr(clientIDattrKey).set(IDnum); //bind ID to channel
...
}
}
Run Code Online (Sandbox Code Playgroud)
但是,如何在处理程序的另一个上下文中检索变量的值?属性键仍然是必需的,我无法从附加变量的处理程序中获取它。
public class StorageHandler extends ChannelInboundHandlerAdapter{
private static final Logger LOG = LoggerFactory.getLogger(StorageSaveHandler.class);
@Override
public void channelInactive(ChannelHandlerContext ctx) throws Exception {
Integer clientID = (Integer)ctx.channel().attr(null).get(); //How can i get proper key for this …Run Code Online (Sandbox Code Playgroud)