java - 如何使用java代码查找tomcat服务器系统信息?

标签 java tomcat jakarta-ee

我正在开发 Web 应用程序并将其托管在 tomcat 服务器中。我的要求是客户端系统想知道 tomcat 服务器位于网络中的系统的 ip 地址。在使用 java 向服务器发出任何请求之前。或者任何可能为 tomcat 服务器设置默认 ip 地址。我怎么能如果系统ip和tomcat ip不同,则使用默认ip地址进行请求。

最佳答案

不知道我是否理解你的问题。所以服务器在局域网中运行,您的客户端软件不知道要连接到哪个地址/ip?您可以添加 multicast服务器到您的服务器应用程序和多播接收器到您的客户端。服务器会频繁发送一个广播包到指定的广播地址/ channel ,即203.0.113.0。

一旦你的客户端启动,它就会收到服务器发送的广播数据包,只要他连接到同一个 channel 。该数据包包含服务器地址。然后您可以使用该地址连接到服务器。

更新

这是一个非常简单的例子,发送者、接收者和常量类共享设置。它发送一个字符串(服务器在这里)作为数据包,但在现实世界的应用程序中,您应该创建一个对象在服务器上对其进行序列化并在客户端对其进行反序列化。该对象可以包含有关服务器的更多信息,并且可以在客户端进行验证。

服务器/客户端共享代码:

public final class MulticastConstants {
 public static final String MULTICAST_PACKET_DATA = "Server is here!";
 public static final String MULTICAST_CHANNEL = "230.0.0.1";
 public static final int MULTICAST_PORT = 8881;
 public static final int MULTICAST_PACKET_SIZE = MULTICAST_PACKET_DATA.getBytes().length;
}

服务器端代码:

发件人是一个 WebListener,将随您的应用程序启动和停止。

@WebListener
public class MulticastSender implements ServletContextListener {

private MulticastSocket socket;
private boolean running = true;
private Thread mcss;

public MulticastSender() {
    System.out.println("New " + this.getClass().getSimpleName());
    try {
        socket = new MulticastSocket(MulticastConstants.MULTICAST_PORT);
        mcss = new MulticastServerThread();
    } catch (IOException e) {
        System.out.println("Error creating MulticastSender: " + e.getMessage());
    }
}

@Override
public void contextInitialized(ServletContextEvent sce) {
    System.out.println("Starting " + this.getClass().getSimpleName());
    mcss.start();
}

@Override
public void contextDestroyed(ServletContextEvent sce) {
    System.out.println("Stopping " + this.getClass().getSimpleName());
    this.running = false;
    socket.disconnect();
    socket.close();
}

private class MulticastServerThread extends Thread {

    public MulticastServerThread() {
        super("MulticastServer");
    }

    public void run() {

        System.out.println("Start sending multicast packets ...");
        while (running) {
            System.out.println("Sending multicast packet ...");
            try {
                byte[] dataBuffer = MulticastConstants.MULTICAST_PACKET_DATA.getBytes();
                InetAddress group = InetAddress.getByName(MulticastConstants.MULTICAST_CHANNEL);
                DatagramPacket packet = new DatagramPacket(dataBuffer, dataBuffer.length, group, MulticastConstants.MULTICAST_PORT);
                socket.send(packet);
                System.out.println("Packet send ...");
                try {
                    sleep(2000);
                } catch (InterruptedException e) {
                }
            } catch (IOException e) {
                System.out.println("Error sending multicast packet: " + e.getMessage());
                running = false;
                break;
            }
        }
        socket.close();
    }
}
}

客户端代码:

为简单起见,客户端只接收一个数据包。您可能会创建一个线程来不卡住您的客户端 gui。

public class MulticastReceiver {

private MulticastSocket socket;
private InetAddress address;

public static void main(String[] args) throws InterruptedException {
    new MulticastReceiver();
}

public MulticastReceiver() {
    System.out.println("Starting MulticastReceiver ...");
    try {
        address = InetAddress.getByName(MulticastConstants.MULTICAST_CHANNEL);
        socket = new MulticastSocket(MulticastConstants.MULTICAST_PORT);
        socket.joinGroup(address);

        DatagramPacket packet;
        try {
            byte[] buf = new byte[MulticastConstants.MULTICAST_PACKET_SIZE];
            packet = new DatagramPacket(buf, buf.length);
            System.out.println("Waiting for packets ...");
            socket.receive(packet);
            System.out.println("Received a packet (" + packet.getLength() + " bytes) ...");
            // deserialize packet.getData() to your own object (for simplicity a String is used) ...
            // check if type and serialVersionId are ok, otherwise dispose packet ...
            System.out.println("Server is located at: " + packet.getAddress());
            socket.close();
            // connect to server ...
        } catch (IOException ex) {
            ex.printStackTrace();
        } catch (Exception ex) {
            ex.printStackTrace();
        }
    } catch (UnknownHostException e) {
        System.out.println("Could not connect to host \"" + address + "\": " + e.getMessage());
    } catch (Exception e) {
        System.out.println("Error initializing: " + e.getMessage());
    }
}
}

已在 Glassfish 4 上测试,希望对您有所帮助。

关于java - 如何使用java代码查找tomcat服务器系统信息?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25785303/

相关文章:

java - Ant 嵌套更新

java - 使用 hibernate 时在 POJO 中使用构造函数有哪些限制?

tomcat - opengrok:尝试通过外部参照打开 .cpp 文件时出现 HTTP 状态 404 -/source/s

java - 有没有比 "pet store"更好的方法来比较 .Net 和 Java 在电子商务设置中的一般性能?

java - SOAP 请求负载

java - 使用 AsyncTask 进行 android 网络连接

java - 将 java 代码转换为 jar 文件后在何处包含日志属性文件

jsp - 在 Tomcat 7 中,我可以在 <url-pattern> 中使用正则表达式吗?

集群环境中 Java EE EAR 读/写资源的共享位置

java - 将基本数据源与连接池数据源混合在一起 : when to call close()?