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

Netty客户端服务器登录,如何让channelRead返回布尔值

荆煌
2023-03-14

我正在netty之上编写客户机-服务器应用程序。

我从一个简单的客户端登录服务器开始,该服务器通过数据库验证从客户端发送的信息。这一切都很好。

在客户端,我希望在收到来自服务器的响应后使用If语句,以确定登录凭据是否有效。这也很好用。我的问题是ChannelRead方法不返回任何内容。我不能改变这个。我需要它返回一个布尔值,允许登录尝试成功或失败。

一旦channelRead()返回,我就会丢失数据的内容。

我尝试将msg添加到列表中,但是由于某种原因,消息数据没有存储在列表中。

欢迎提出任何建议。我是新来的。。。这是我想出的唯一办法。我也尝试过在channelRead()中使用布尔语句,但是这些方法是无效的,所以一旦它关闭,布尔变量就会被清除。

以下是我试图将消息数据插入到我创建的列表中的最后一次尝试...

import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.ChannelInboundHandlerAdapter;

import java.util.Collection;
import java.util.Iterator;
import java.util.List;
import java.util.ListIterator;

public class LoginClientHandler extends ChannelInboundHandlerAdapter {
    Player player = new Player();
    String response;
    public volatile boolean loginSuccess;
//    Object message = new Object();
    private Object msg;
    public static final List<Object> incomingMessage = new List<Object>() {

       
    @Override
    public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {
//        incomingMessage.clear();
        response = (String) msg;
        System.out.println("channel read response = " + response);
        incomingMessage.add(0, msg);
        System.out.println("incoming message = " + incomingMessage.get(0));
    }    

如何从channelRead()方法中“取出”消息数据,或使用此方法在业务逻辑中创建更改?我希望它要么显示一条消息,告诉客户端登录失败并重试,要么成功并加载下一个场景。我的业务逻辑运行良好,但我无法让它与netty一起工作,因为没有任何方法返回任何我可以用来影响我的业务逻辑的东西。

通道初始化器

import io.netty.channel.ChannelInitializer;
import io.netty.channel.ChannelPipeline;
import io.netty.channel.socket.SocketChannel;
import io.netty.handler.codec.DelimiterBasedFrameDecoder;
import io.netty.handler.codec.Delimiters;
import io.netty.handler.codec.string.StringDecoder;
import io.netty.handler.codec.string.StringEncoder;

public class LoginClientInitializer extends ChannelInitializer <SocketChannel> {


    @Override
    protected void initChannel(SocketChannel ch) throws Exception {
        ChannelPipeline pipeline = ch.pipeline();

        pipeline.addLast("framer", new DelimiterBasedFrameDecoder(8192, Delimiters.lineDelimiter()));
        pipeline.addLast("decoder", new StringDecoder());
        pipeline.addLast("encoder", new StringEncoder());

        pipeline.addLast("handler", new LoginClientHandler());
    }
}

共有1个答案

云骏奇
2023-03-14

要让服务器向客户端写入数据,请调用ctx。写这是一个基本的echo服务器和客户机示例,摘自《Netty in Action》一书。https://github.com/normanmaurer/netty-in-action/blob/2.0-SNAPSHOT/chapter2/Server/src/main/java/nia/chapter2/echoserver/EchoServerHandler.java回购协议中还有其他几个好例子。

如果你是从netty开始的,我强烈建议你阅读《netty in action》一书。它将使您对该框架以及如何使用它有一个坚实的基础性理解。

 类似资料:
  • 我将创建一个身份验证服务器,它本身与一组不同的Oauth2.0服务器交互。Netty似乎是在这里实现网络部分的一个很好的候选者。但在开始之前,我需要澄清一些关于netty的细节,因为我是新手。例行程序如下: > < li> 服务器接受来自客户端的HTTPS连接。 然后,不关闭第一个连接,它通过HTTPS与远程OAuth2.0服务器建立另一个连接并获取数据 毕竟,服务器将结果发送回客户端,客户端应该

  • 似乎服务器拒绝了wireshark输出中的tls协商,但我从代码中看不出原因。它是基于工作的代码,只是它被否决了,因此我用新的API更新。代码是开始。需要使用真实的证书。有人知道为什么服务器发送tcp FIN,ack吗? 我有以下服务器代码: 23 16.856111 sonymobi_7f:55:af intelcor_25:1d:fc ARP 42 10.1.10.100在84:c7:ea:7

  • 我需要在netty中有一个客户机/服务器通信,用于我的项目目的之一。所以我刚开始用一个handsOn来改进,我正在学习netty,我是一个初学者。 我尝试了一个简单的客户端服务器与Netty聊天。 客户端和服务器正在初始化,我可以看到服务器能够获得用于建立连接的客户端管道,但是当客户端发送消息时,它没有进入ServerAdapterHandler的messageReceived部分。下面是我的源代

  • 在本节中,我们将构建一个完整的的 Netty客 户端和服务器。虽然你可能集中在写客户端是浏览器的基于 Web 的服务,接下来你将会获得更完整了解 Netty 的 API 是如何实现客户端和服务器的。 Figure 2.1.Echo client / server 图中显示了连接到服务器的多个并发的客户端。在理论上,客户端可以支持的连接数只受限于使用的 JDK 版本中的制约。 echo(回声)客户端

  • 在探索和实现Proact设计模式后,遇到了一个问题,即客户端(“C”客户端)连接在限制后不再接受。开始探索netty。这是我试图做的1。C客户端建立连接2。Java服务器接受连接并开始使用TCP向客户端发送8 Mb大小的字节缓冲区。有什么想法吗?netty是一个好的选择吗?我浏览了netty的一个很好的例子,不幸的是不走运。 先谢谢你。 尊敬的Ravi

  • 我已经使用java nio创建了一个客户端-服务器应用程序,它工作正常,但我的问题是,当服务器有许多连接到服务器的客户端时,服务器会响应错误的客户端,而不是请求客户端。例如,如果客户端A请求第一个人的信息,服务器将第一个人的信息返回给客户端B而不是客户端A。我已经尝试同步对象,但仍然无法正常工作,可能是什么问题。这是我的服务器示例代码