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

服务器未解码数据包

孔海超
2023-03-14

这是我的服务器端解码器

    protected void decode(Socket server) throws Exception {
    final BufferedReader reader = new BufferedReader(new InputStreamReader(server.getInputStream()));
    final int handshake = Integer.parseInt(reader.readLine());
    if (handshake == LOGIN) {
        final Session session = new LoginSession(server, reader);
        session.read(-1);
    } else if (handshake == POST_LOGIN) {
        final int index = Integer.parseInt(reader.readLine());
        final int opcode = Integer.parseInt(reader.readLine());
        final Session session = store.get(index).getSession();
        session.reader = reader;
        session.read(opcode);
    }

}

@Override
public void run() {
    Socket server;
    try {
        server = serverSocket.accept();
        server.setTcpNoDelay(false);
        decode(server);
    } catch (Exception e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

}

这些是我的客户端->服务器数据包

    public void sendLogin() {
    write.write("100");
    write.write('\n');
    write.write("raees2");
    write.write('\n');
    write.write("LOL2");
    write.write('\n');
    write.flush();
}

public void sendPrintId() throws NumberFormatException, IOException {
    final BufferedReader reader = new BufferedReader(new InputStreamReader(client.getInputStream()));
    final int id = Integer.parseInt(reader.readLine());
    System.out.println(id);

    write.write("101");
    write.write('\n');
    write.write(Integer.toString(id));
    write.write('\n');
    write.write(Integer.toString(0));
    write.write('\n');
    write.write(Integer.toString(10003));
    write.write('\n');
    write.flush();
}

public void sendDisconnection() throws NumberFormatException, IOException {
    final BufferedReader reader = new BufferedReader(new InputStreamReader(client.getInputStream()));
    final int id = Integer.parseInt(reader.readLine());
    System.out.println(id);

    write.write("101");
    write.write('\n');
    write.write(Integer.toString(id));
    write.write('\n');
    write.write(Integer.toString(1));
    write.write('\n');
    write.flush();
}

共有1个答案

殳毅
2023-03-14

基本上,您只需要一个循环来保持从流中读取,直到会话完成。现在,它读取一条消息并终止。

我不确定您的协议是如何工作的,但类似这样的内容可以提供一个起点:

protected void decode(Socket server) throws Exception {
    final BufferedReader reader = new BufferedReader(new InputStreamReader(server.getInputStream()));

    /*
     * Somewhere in this loop, detect your protocol's termination condition
     * and break out.
     */

    for (;;) {
        final int handshake = Integer.parseInt(reader.readLine());
        if (handshake == LOGIN) {
            final Session session = new LoginSession(server, reader);
            session.read(-1);
        } else if (handshake == POST_LOGIN) {
            final int index = Integer.parseInt(reader.readLine());
            final int opcode = Integer.parseInt(reader.readLine());
            final Session session = store.get(index).getSession();
            session.reader = reader;
            session.read(opcode);
        }
    }
}

如果您需要同时处理多个连接,您可能希望接受器线程为每个成功连接的连接启动一个新的客户端线程,因为decode在等待下一个消息时会阻塞。

 类似资料:
  • 我正在研究Spring Cloud Config一段时间。我有一个保护配置数据的要求。根据Spring Cloud文档,已经配置了server.jks并添加到类路径中。现在我能够加密和解密远程配置数据。 为了确保配置服务器的安全,我添加了spring security starter并分配了凭据(密码decryded)。出于某种原因,应用程序抛出了它在类路径上没有键存储的expeptions。在搜

  • 我已经在Elastic Beanstalk上设置了一个工作解析服务器。我添加了一个AWS ElasticCache Redis服务器用于缓存,但我无法在使用密码时使连接工作,只有在没有密码的情况下。在我的解析服务器索引中。js文件,我在其中创建与Redis连接的新解析服务器,如下所示: 其中我的URL看起来像REDIS\u URL=clustercfg。xxxx年。xxxx年。use1.cache

  • 首先欢迎关注我的博客: www.leoyang90.cn 服务容器对对象的自动解析是服务容器的核心功能,make 函数、build 函数是实例化对象重要的核心,先大致看一下代码: public function make($abstract) { $abstract = $this->getAlias($abstract); if (isset($this->deferredSer

  • 我的应用程序运行在weblogic服务器上,在那里我配置了一个JNDI数据源来获取数据库连接。我试图理解weblogic服务器生成的数据源日志。 路径: 日志内容: 看起来有一个错误信息,但我无法理解为什么数据源会给出错误。请帮助我理解这一点。

  • 数据包格式的来源:http://wiki.vg/Protocol 我正试图用php编写一个程序,将数据包发送到我托管的minecraft服务器。这可能适用于不支持相同API格式的手机的多人游戏实现。我下面的代码是我失败的尝试。我怎样才能正确地做到这一点?服务器正在识别某些内容,但它要么没有发送任何内容,要么是其他内容。下面应该发送0x00,即握手数据包,以使用下一个状态ID:1请求服务器上的统计信

  • 我正在研究和使用Spring Cloud数据流进行一些概念验证,但遇到了一些问题: 我正在尝试启动本地数据流服务器。为了实现这一点,我创建了一个Spring Boot应用程序,并用< code > @ EnableDataFlowServer 对其进行了注释。 当我尝试运行时,我收到以下错误: 我在寻求帮助,我读到这可能是一个pom的版本问题。实际上我的< code>pom.xml是: 谁能帮我?