洞穴夜莺
本帖最后由 洞穴夜莺 于 2022-9-11 12:28 编辑


如题,我自认为已经几乎照抄了示例代码(注释除外),但是它运行时尽管能在netstat命令中看到UDP 10005端口,但在游戏内就是ping不通,求教这玩意的正确用法

krewella
本帖最后由 krewella 于 2022-9-11 01:20 编辑
  1. package io.github.cavenightingale;

  2. import com.nukkitx.protocol.bedrock.*;
  3. import com.nukkitx.protocol.bedrock.handler.BedrockPacketHandler;
  4. import com.nukkitx.protocol.bedrock.v544.Bedrock_v544;

  5. import java.net.InetSocketAddress;

  6. public class Main {
  7.     public static void main(String[] args) throws InterruptedException {
  8.         BedrockServer server = new BedrockServer(new InetSocketAddress("0.0.0.0", 10005));
  9.         BedrockPong pong = new BedrockPong();
  10.         pong.setEdition("MCPE");
  11.         pong.setMotd("My Server");
  12.         pong.setPlayerCount(0);
  13.         pong.setMaximumPlayerCount(20);
  14.         pong.setGameType("Survival");
  15.         pong.setProtocolVersion(Bedrock_v544.V544_CODEC.getProtocolVersion());
  16.         pong.setIpv4Port(10005);
  17.         pong.setVersion("1.0.0.0");
  18.         server.setHandler(new BedrockServerEventHandler() {
  19.             @Override
  20.             public boolean onConnectionRequest(InetSocketAddress address, InetSocketAddress realAddress) {
  21.                 return true;
  22.             }

  23.             @Override
  24.             public BedrockPong onQuery(InetSocketAddress address) {
  25.                 return pong;
  26.             }

  27.             @Override
  28.             public void onSessionCreation(BedrockServerSession serverSession) {
  29.                 serverSession.setPacketHandler(serverSession.getPacketHandler());
  30.                 serverSession.addDisconnectHandler(System.out::println);
  31.             }
  32.         });
  33.         server.bind().join();
  34.         System.out.println(server.getBindAddress().getPort());
  35.         new Thread(new Runnable() {

  36.             @Override
  37.             public void run() {
  38.                 try {
  39.                     Thread.sleep(Long.MAX_VALUE);
  40.                 } catch (InterruptedException e) {
  41.                     e.printStackTrace();
  42.                 }
  43.             }
  44.         }).start();
  45.     }
  46. }
复制代码

尝试了一下,可以了

krewella
Minecraft -> onQuery -> BedrockPong
Minecraft ->BedrockPong Port -> 获得延迟
如果你想让protocol响应真正的服务器,BedrockPong的端口应该填写对应的服务器端口

洞穴夜莺
krewella 发表于 2022-9-11 01:14
尝试了一下,可以了




复制了你的代码,但仍然无法ping通,并且图中所示三个断点均无法被执行到

krewella
尝试将 localhost 改为 127.0.0.1 ?
这是我们唯一的差距了

洞穴夜莺
krewella 发表于 2022-9-11 11:13
尝试将 localhost 改为 127.0.0.1 ?
这是我们唯一的差距了

尝试过改为127.0.0.1,无效
另外,注意到一个现象
如果在进程内,调用BedrockClient是可以ping通的,代码及运行如下输出

但在试图在另一个进程中ping则报错timeout,代码和运行输出如下

krewella
从你的说明上来看是可以ping到的
尝试将InetSocketAddress绑定至 127.0.0.1尝试一下

krewella
本帖最后由 krewella 于 2022-9-11 11:54 编辑

我尝试了一下,在另一个进程中ping无报错,也许是你的maven依赖不对?

krewella
  1.     <dependencies>
  2.         <dependency>
  3.             <groupId>com.nukkitx.protocol</groupId>
  4.             <artifactId>bedrock-v544</artifactId>
  5.             <version>2.9.11-SNAPSHOT</version>
  6.             <scope>compile</scope>
  7.         </dependency>
  8.     </dependencies>
  9.     <repositories>
  10.         <repository>
  11.             <id>nukkitx-repo-release</id>
  12.             <url>https://repo.nukkitx.com/maven-releases/</url>
  13.         </repository>
  14.         <repository>
  15.             <id>nukkitx-repo-snapshot</id>
  16.             <url>https://repo.nukkitx.com/maven-snapshots/</url>
  17.         </repository>
  18.     </repositories>
复制代码

尝试切换为该依赖,如还有报错请回复

洞穴夜莺
krewella 发表于 2022-9-11 11:47
尝试切换为该依赖,如还有报错请回复

repo.nukkitx.com访问极慢,无法完成gradle sync,因此我使用repo.opencollab.dev作为替代
完整build.gradle如下

从另一个进程ping不通的问题已经解决(是V某N的问题)
但从游戏内仍然无法ping通

krewella
本帖最后由 krewella 于 2022-9-11 12:24 编辑

有极少数情况 idea 的断点无法正确被调用

尝试在onQuery 打印一下信息,查看客户端是否调用该方法

洞穴夜莺
krewella 发表于 2022-9-11 12:21
有极少数情况 idea 的断点无法正确被调用

尝试在onQuery 打印一下信息,查看客户端是否调用该方法


很明显没有调用onQuery

krewella
我复现了一下,出现了相同的情况
1. Minecraft客户端是否登录
2. Minecraft是否强制性代理

洞穴夜莺
krewella 发表于 2022-9-11 12:35
我复现了一下,出现了相同的情况
1. Minecraft客户端是否登录
2. Minecraft是否强制性代理

客户端登陆到Xbox账号CaveNighting
不清楚强制性代理是什么

krewella
本帖最后由 krewella 于 2022-9-11 12:47 编辑

UWP 应用代理解除,将代理模式启动后重试
https://oxdl.cn/?p=1036



然后重试以上步骤,应该解决问题了

洞穴夜莺
krewella 发表于 2022-9-11 12:45
UWP 应用代理解除,将代理模式启动后重试
https://oxdl.cn/?p=1036

我下载不了这个链接内的文件

krewella
已上传

洞穴夜莺

nice,问题解决