2

I am working on a project where I send supposedly press a button on a webpage and it then executes a command in java. What I'm looking for is something like this. Say if I pressed a button and then it sends a command to the minecraft server to reload plugins. How would I go achieving this? Thanks

4

2 回答 2

2

当您必须在不同的应用程序之间进行通信时,您可能需要一个桥梁。在您的情况下,我建议使用 Minecraft 的RCON服务(必须在配置中启用)或执行类似操作的插件,例如 Websend。

如果你想知道插件是如何工作的,Websend 代码实际上可以在Github上找到。

于 2013-01-22T21:56:20.217 回答
1

通过套接字连接 PHP 和 Java

步骤1:

创建一个java服务器

我为这些情况创建了一个很好的 API。如果您愿意,可以使用它们:

聊天服务器

你需要做的就是创建这个类的一个新实例

package com.weebly.foxgenesis.src;
import java.net.*;
import java.util.ArrayList;
import java.util.List;
import java.util.StringTokenizer;
import java.io.*;

public final class ChatServer implements Runnable 
{  
    private final int CLIENTMAXIMUM;
    private ChatServerThread clients[];
    private ServerSocket server = null;
    private Thread       thread = null;
    private int clientCount = 0;
    private final ServerReciever output;
    private List<ConnectHandler> connectHandlers = new ArrayList<ConnectHandler>();
    private List<QuitHandler> quitHandlers = new ArrayList<QuitHandler>();

    /**
     * creates a new ChatServer for connection between clients
     * @param a ServerReciever implementing class
     */
    public ChatServer(ServerReciever a)
    {  
        CLIENTMAXIMUM = a.getMaximunClients();
        output = a;
        clients = new ChatServerThread[CLIENTMAXIMUM];
        try
        {  
            server = new ServerSocket();
            server.bind(new InetSocketAddress(output.getHost(), output.getPort()));
            log(server);
            start(); 
        }
        catch(IOException ioe)
        {  
            error("Can not bind to port " + a.getPort() + ": " + ioe.getMessage()); 
        }
    }

    /**
     * Force the Server to handle a msg
     */
    public void add(String text)
    {
        output.handle(text);
    }

    /**
     * Force the Server to handle an error
     */
    public void error(String text)
    {
        output.handleError(text);
    }

    /**
     * Log to the server
     */
    public void log(Object text)
    {
        output.handleLog(text);
    }

    /**
     * send a message to a specific client
     * @param ID ID of client
     * @param msg
     */
    public void send(int ID, String msg)
    {
        clients[findClient(ID)].send(msg);
        add(msg);
    }


    /**
     * Called by runnable
     */
    public void run()
    { 
        while (thread != null)
        {  
            try
            {   
                if(clientCount != CLIENTMAXIMUM){
                    log("Waiting for a client ..."); 
                    addThread(server.accept()); 
                }
            }
            catch(IOException ioe)
            {  
                error("Server accept error: " + ioe); 
                stop(); 
            }
        }

    }

    private void start()  
    { 
        if (thread == null)
        {  
            thread = new Thread(this); 
            thread.start();
        }
    }

    /**
     * Stops the server 
     */
    @SuppressWarnings("deprecation")
    public void stop()   
    { 
        if (thread != null)
        { 
            thread.stop(); 
            thread = null;
        }
    }

    private int findClient(int ID)
    {  
        for (int i = 0; i < clientCount; i++)
            if (clients[i].getID() == ID)
                return i;
        return -1;
    }

    /**
     * sends a message to a 
     * @param ID
     * @param input
     */
    public synchronized void handle(int ID, String input)
    {  
        StringTokenizer t = new StringTokenizer(input);
        String[] arg = new String[t.countTokens()];
        for(int i=0; t.hasMoreElements(); i++)
            arg[i] = t.nextToken(",");
        if(arg[0] == "new")
            switch(input)
            {
            case".bye":
            {
                clients[findClient(ID)].send(".bye");
                remove(ID); 
                break;
            }
            default:
            {
                for (int i = 0; i < clientCount; i++)
                    clients[i].send(input); 
                break;
            }
            }
    }
    /**
     * sends a message to all clients
     * @param input message to send
     */
    public void sendAll(String input)
    {
        for (int i = 0; i < clientCount; i++)
            clients[i].send(input); 
    }

    /**
     * remove a selected ID
     * @param ID ID of client
     */
    @SuppressWarnings("deprecation")
    public synchronized void remove(int ID)
    {  
        int pos = findClient(ID);
        if (pos >= 0)
        {  
            ChatServerThread toTerminate = clients[pos];
            log("Removing client thread " + ID + " at " + pos);
            if (pos < clientCount-1)
                for (int i = pos+1; i < clientCount; i++)
                    clients[i-1] = clients[i];
            clientCount--;
            QuitEvent e = new QuitEvent(toTerminate.getID());
            e.setGameBreaking(true);
            for(QuitHandler a: quitHandlers)
                a.quit(e);
            try
            {  
                toTerminate.close(); }
            catch(IOException ioe)
            {  
                error("Error closing thread: " + ioe); 
            }
            toTerminate.stop(); 
        }
    }

    private void addThread(Socket socket)
    {  
        if (clientCount < clients.length)
        { 
            log("Client accepted: " + socket);
            clients[clientCount] = new ChatServerThread(this, socket);
            try
            { 
                clients[clientCount].open(); 
                clients[clientCount].start();  
                ClientConnectEvent e = new ClientConnectEvent(clients[clientCount],clients[clientCount].getID());
                clientCount++; 
                for(ConnectHandler a: connectHandlers)
                    a.connect(e);
            }
            catch(IOException ioe)
            {  
                error("Error opening thread: " + ioe); 
            }
        }
        else
            error("Client refused: maximum " + clients.length + " reached.");
    }

    public String toString()
    {
        return "ChatServer{;host=" + output.getHost() + ";port=" + output.getPort() + ";clients=" + clientCount + ";}";
    }

    public int getAmountOfClients()
    {
        return clientCount;
    }

    public void addConnectHandler(ConnectHandler handler)
    {
        connectHandlers.add(handler);
    }

    public void removeConnectHandler(ConnectHandler handler)
    {
        connectHandlers.remove(handler);
    }

    public int getMaxClients()
    {
        return CLIENTMAXIMUM;
    }

    public void addQuitHandler(QuitHandler quitHandler) 
    {
        quitHandlers.add(quitHandler);
    }
    public void removeQuitHandler(QuitHandler quithandler)
    {
       quitHandlers.remove(quithandler);
    }
}

聊天服务器线程

被 ChatServer 用作客户端连接

package com.weebly.foxgenesis.src;
import java.net.*;
import java.io.*;

public final class ChatServerThread extends Thread
{  
    private ChatServer server = null;
    private Socket socket = null;
    private int ID = -1;
    private DataInputStream  streamIn  =  null;
    private DataOutputStream streamOut = null;

    public ChatServerThread(ChatServer server, Socket socket)
    {  
        super();
        this.server = server;
        this.socket = socket;
        this.ID = socket.getPort();
    }
    @SuppressWarnings("deprecation")
    public void send(String msg)
    {   
        try
        {  
            streamOut.writeUTF(msg);
            streamOut.flush();
        }
        catch(IOException ioe)
        {  
            server.error(ID + " ERROR sending: " + ioe.getMessage());
            server.remove(ID);
            stop();
        }
    }

    public int getID()
    { 
        return ID;
    }

    @SuppressWarnings("deprecation")
    @Override
    public void run()
    {  
        server.log("Server Thread " + ID + " running.");
        while (true)
        {  
            try
            {  
                server.handle(ID, streamIn.readUTF());
            }
            catch(IOException ioe)
            {  
                server.error(ID + " ERROR reading: " + ioe.getMessage());
                server.remove(ID);
                stop();
            }
        }
    }

    public void open() throws IOException
    {  
        streamIn = new DataInputStream(new 
                BufferedInputStream(socket.getInputStream()));
        streamOut = new DataOutputStream(new
                BufferedOutputStream(socket.getOutputStream()));
    }

    public void close() throws IOException
    {  
        if (socket != null)    socket.close();
        if (streamIn != null)  streamIn.close();
        if (streamOut != null) streamOut.close();
    }
}

客户端连接事件

package com.weebly.foxgenesis.src;

public class ClientConnectEvent extends ConnectionEvent
{
    private final ChatServerThread client;

    public ClientConnectEvent(ChatServerThread client, int clientID)
    {
        super(clientID);
        this.client = client;
    }

    public ChatServerThread getClient()
    {
        return client;
    }

    @Override
    public boolean isConnectionBreaking(){return false;}
}

连接处理程序

package com.weebly.foxgenesis.src;

public interface ConnectHandler 
{
    public void connect(ClientConnectEvent e);
}

客户端退出事件

package com.weebly.foxgenesis.src;

public class ClientQuitEvent extends ConnectionEvent
{
    public ClientQuitEvent(int clientID)
    {
        super(clientID);
    }

    @Override
    public boolean isConnectionBreaking() 
    {
        return true;
    }
}

退出处理程序

package com.weebly.foxgenesis.src;

public interface QuitHandler 
{
    public void quit(ClientQuitEvent e);
}

服务器接收器

package com.weebly.foxgenesis.src;

public interface ServerReciever 
{
    public void handle(String msg);
    public void handleError(String msg);
    public int getPort();
    public int getMaximunClients();
    public void handleLog(Object text);
    public String getHost();
}

连接事件

package com.weebly.foxgenesis.src;

public abstract class ConnectionEvent 
{
    public abstract boolean isConnectionBreaking();
    private int clientID;
    public ConnectionEvent(int clientID)
    {
        this.clientID = clientID;
    }

    public int getClientID()
    {
        return clientID;
    }
}

第2步:

将服务器连接到 Bukkit

我提供了一个关于如何通过制作新插件将服务器连接到 bukkit 的示例。

public class MyPlugin extends JavaPlugin
{
     @Override
     public void onEnable()
     {
        ChatServer server = new ChatServer(new ServerReciever()
        {
            @Override
            public void handle(String msg){handleMsg(msg);}

            @Override
            public void handleError(String msg){handleErr(msg);}

            @Override
            public int getPort(){return 25567}

            @Override
            public int getMaximunClients(){return 100;}

            @Override
            public void handleLog(Object text){log(text);}

            @Override
            public String getHost(){return "localhost";}
        }
   }
   public void handleLog(Object text)
   {
      System.out.println(text);
   }
   public void handelErr(String msg)
   {
     System.err.println(msg);
   }
   public void handleMsg(String msg)
   {
     if(msg.equalsIgnoreCase("reload"))
           Bukkit.reloadOrSomething(); //i don't know the void off the top of my head
   }
}

第 3 步:

端口转发

如果您不知道那是什么,请继续使用 Google 搜索。网上有一些很棒的教程。您想要端口转发您在代码中设置的端口。

第4步:

向服务器发送消息

我不知道 PHP,但您需要做的就是将 UTF-8 编码消息发送到您在上面硬编码的端口上的服务器 ip。

第 5 步:

请享用!

于 2014-01-12T00:48:18.543 回答