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

从Bukkit插件传输控制协议

张通
2023-03-14

我正在尝试创建一个bukkit插件,当事件触发时,它将连接到tcp服务器并发送消息。

我已经掌握了基础知识,但我错过了一些东西,我不知道从这里开始。我可以看到该插件与服务器建立了连接,但随后抛出错误并且没有发送任何消息。

我正在尝试理解当事件发生时如何向tcp客户端发送字符串。为了测试,我使用了玩家移动事件。

当我启动时,我在craftbukkit服务器日志中看到以下内容:

Loading libraries, please wait...
[19:53:25 INFO]: Starting minecraft server version 1.7.10
[19:53:25 INFO]: Loading properties
[19:53:25 INFO]: Default game type: SURVIVAL
[19:53:25 INFO]: Generating keypair
[19:53:26 INFO]: Starting Minecraft server on *:25565
[19:53:26 INFO]: This server is running CraftBukkit version git-Bukkit-1.7.9-R0.2-20-g0b2ed13-b3108jnks (MC: 1.7.10) (Implementing API version 1.7.10-R0.1-SNAPSHOT)
[19:53:27 INFO]: [Compass] Loading Compass v0.1
[19:53:27 INFO]: Preparing level "world"
[19:53:27 INFO]: Preparing start region for level 0 (Seed: 7985848474339719790)
[19:53:27 WARN]: Could not get information about this CraftBukkit version; perhaps you are running a custom one?: FileNotFoundException
[19:53:28 INFO]: Preparing spawn area: 66%
[19:53:28 WARN]: Could not get latest artifact information: FileNotFoundException
[19:53:28 INFO]: Preparing start region for level 1 (Seed: 524789769407484853)
[19:53:29 INFO]: Preparing spawn area: 70%
[19:53:30 INFO]: Preparing start region for level 2 (Seed: 524789769407484853)
[19:53:30 INFO]: [Compass] Enabling Compass v0.1
[19:53:30 INFO]: [Compass] Start up.
[19:53:30 INFO]: [Compass] trying connect0
[19:53:30 INFO]: [Compass] getOutputStream()
[19:53:30 INFO]: [Compass] getInputStream()
[19:53:30 INFO]: Server permissions file permissions.yml is empty, ignoring it
[19:53:30 INFO]: Done (3.312s)! For help, type "help" or "?"
[19:54:25 INFO]: UUID of player MagicPixelPunk is 0322446d-6b92-4b63-af77-98d6739ec53b
[19:54:25 INFO]: MagicPixelPunk[/127.0.0.1:55376] logged in with entity id 206 at ([world] -164.16068813003193, 65.0, -141.0983355740641)

当我与我的世界客户端连接并移动播放器时,我在craftbukkit服务器日志中看到以下错误:

21:52:01 INFO]: outToServer is null
21:52:01 INFO]: [CompassTask] writing to outToServer
21:52:01 INFO]: [CompassTask] Send failed: exception:
21:52:01 WARN]: java.lang.NullPointerException
21:52:01 WARN]:        at compass.Compass.onMove(Compass.java:61)

java类Compass。java如下:

package compass;

import java.util.logging.Logger;
import org.bukkit.command.Command;
import org.bukkit.command.CommandSender;
import org.bukkit.command.CommandException;
import org.bukkit.entity.Player;
import org.bukkit.plugin.Plugin;
import org.bukkit.plugin.java.JavaPlugin;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
import org.bukkit.event.player.PlayerMoveEvent;
import org.bukkit.scheduler.BukkitRunnable;
import java.io.IOException;
import java.util.concurrent.TimeoutException;
import java.lang.Exception;
import java.lang.Error;
import java.io.*; 
import java.net.*; 

public class Compass extends JavaPlugin implements Listener{
  public static Logger log = Logger.getLogger("Minecraft");
  public DataOutputStream outToServer;

  public void onEnable() {
    log.info("[Compass] Start up.");
    String sentence;   
    String modifiedSentence;   
    BufferedReader inFromUser = new BufferedReader( new InputStreamReader(System.in));  
    log.info("[Compass] trying connect0"); 
    try{
      Socket clientSocket = new Socket("localhost", 6789);  
      log.info("[Compass] getOutputStream()");
      DataOutputStream outToServer = new DataOutputStream(clientSocket.getOutputStream());   
      log.info("[Compass] getInputStream()");
      BufferedReader inFromServer = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));
    }
    catch (Exception e){
      log.info("[Compass] Send failed: Exception: ");
      e.printStackTrace();
    }

    getServer().getPluginManager().registerEvents(this, this);
  }
  public void onReload() {
    log.info("[Compass] Server reloaded.");
  }
  public void onDisable() {
    log.info("[Compass] Server stopping.");
  }

    @EventHandler
    public void onMove(PlayerMoveEvent event) {
        try{
          if (outToServer == null) {
            log.info("outToServer is null");
          }
          log.info("[CompassTask] writing to outToServer");
          outToServer.writeBytes("test"+"\n");
          log.info(" [x] Sent '" + "test" + "'");
        }
        catch (Exception e){
          log.info("[CompassTask] Send failed: exception:");
          e.printStackTrace();
        }
        catch (Error e){
          log.info("[CompassTask] Send failed: error:");
          e.printStackTrace();
        }
    }

}

当我试图向outToServer写入数据时,它为什么为空,对此有什么想法吗?

共有2个答案

戚晨
2023-03-14

鉴于错误说

[19:53:30 INFO]: [Compass] Enabling Compass v0.1
[19:53:30 INFO]: [Compass] Start up.
[19:53:30 INFO]: [Compass] trying connect0
[19:53:30 INFO]: [Compass] getOutputStream()
[19:53:30 INFO]: [Compass] getInputStream()

接着说道

error: [Errno 10054] An existing connection was forcibly closed by the remote host

我要说的是,你的错误在于runnable.runTaskTimer(this,20,100);因此,很可能您没有给服务器足够的时间。

邹祺
2023-03-14

看来问题出在线路上:

DataOutputStream outToServer = new DataOutputStream(clientSocket.getOutputStream());

我想这是在创建一个局部变量,所以当我尝试在 onEnable() 之外使用它时,outToServer 为空

我改成:

outToServer = new DataOutputStream(clientSocket.getOutputStream());

现在工作正常。

 类似资料:
  • 以下是我试图实现的目标:我有一个TCP客户端,需要连接到我们的服务器应用程序,但我需要通过HTTPS进行通信。据我所知,这可以通过反向(或正向?)代理如下: 我使用以下vhost配置成功创建了一个不带SSL的代理: (我不确定这些参数中是否有任何一个是不必要的tbh) 使用该vhost,我可以像这样启动与服务器的tcp连接: 一旦我添加SSL并使用端口443,我就无法再连接了: 如果我尝试连接到此

  • 我们在部署在k8s集群上的Java应用程序中使用okhttp。我们的源应用程序没有启用istio,并通过特使sidecar连接到目的地。连接链如下所示: SRC-------- 因此,实际上SRC应用程序并不是直接与DST应用程序建立连接,而是与它前面的代理建立连接。当DST应用程序关闭时,它会终止DST和特使之间的所有连接,但SRC和特使之间的连接保持打开状态。这就是为什么SRC应用程序开始收到

  • 我正在尝试创建插件,当有人打开箱子时,它会检查箱子的位置是否与我的config.yml中的任何位置不匹配。所以我想这样做: 编辑:现在我有了这段代码: 但是当我右键点击箱子时,消息jeej没有出现,所有出现的东西都是消息Hodnota x je 0。但是我的配置中有几个键,x在任何地方都不是0。在控制台中,会出现此错误:

  • 我目前正在尝试使用bukkit插件。我每次都会遇到这个问题,想知道是否有人知道如何解决它。我已经尝试了你可以在谷歌上搜索的几乎所有修复方法,所以希望有人能分享一些光。 所有玩家事件都不起作用。当我用前面的@EventHandler做任何事情时,它就是不跑。下面是一个示例: 当在服务器上运行这个时,它永远不会看到玩家加入了游戏。

  • 当我试图在我的bukkit服务器中加载插件时,我遇到了NullPointerExc的问题,但在Eclipse中没有错误。我的插件是Rush插件,很多东西没有使用/丢失。错误是这样的: 以下是我的代码:

  • Git 可以通过两种主要的方式在版本库之间传输数据:“哑(dumb)”协议和“智能(smart)”协议。 本节将会带你快速浏览这两种协议的运作方式。 哑协议 如果你正在架设一个基于 HTTP 协议的只读版本库,一般而言这种情况下使用的就是哑协议。 这个协议之所以被称为“哑”协议,是因为在传输过程中,服务端不需要有针对 Git 特有的代码;抓取过程是一系列 HTTP 的 GET 请求,这种情况下,客