使用java在三台服务器之间进行UDP单播通信

使用java在三台服务器之间进行UDP单播通信,java,sockets,udp,ipc,Java,Sockets,Udp,Ipc,我想让三台服务器使用JavaUDP进行通信。如果在第一个服务器实例上调用了所有三个服务器的特定方法,那么其他两个服务器也应该使用UDP将这些方法的结果传递给第一个服务器。我应该使用多播吗?我试着使用单播,但没有成功 UDPDataExchangeclass import java.io.BufferedReader; import java.io.IOException; import java.net.DatagramPacket; import java.net.DatagramSocket

我想让三台服务器使用JavaUDP进行通信。如果在第一个服务器实例上调用了所有三个服务器的特定方法,那么其他两个服务器也应该使用UDP将这些方法的结果传递给第一个服务器。我应该使用多播吗?我试着使用单播,但没有成功

UDPDataExchangeclass

import java.io.BufferedReader;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException;
import java.net.SocketTimeoutException;
import java.net.UnknownHostException;

public class UDPDataExchange {

    String              Hostname;
    static InetAddress  IPAddress;

    UDPDataExchange() {
        Hostname = new String("127.0.0.1");
        try {
            IPAddress = InetAddress.getByName(Hostname);
        }
        catch (UnknownHostException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

    public void requestData(int portNumber, String data) {
        try {
            DatagramSocket clientSocket = new DatagramSocket();
            byte[] receiveData = new byte[1024];
            DatagramPacket receivePacket = new DatagramPacket(receiveData,
                    receiveData.length);
            byte[] sendData = new byte[1024];
            sendData = data.getBytes();
            System.out.print("Ready to send data ");
            DatagramPacket sendPacket = new DatagramPacket(sendData,
                    sendData.length, IPAddress, portNumber);
            clientSocket.send(sendPacket);
            clientSocket.setSoTimeout(10000);
            try {
                clientSocket.receive(receivePacket);
                String modifiedSentence = new String(receivePacket.getData());

                InetAddress returnIPAddress = receivePacket.getAddress();

                int port = receivePacket.getPort();

                System.out.println("From server at: " + returnIPAddress + ":"
                        + port);
                System.out.println("Message: " + modifiedSentence);

            }
            catch (SocketTimeoutException ste) {
                System.out.println("Timeout Occurred: Packet assumed lost");
            }
            //clientSocket.close();

        }
        catch (SocketException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

    }

    public void responseData(int portNumber) {
            try {

                DatagramSocket serverSocket = new DatagramSocket(portNumber);
                byte[] receiveData = new byte[1024];
                byte[] sendData = new byte[1024];

                while (true) {

                    receiveData = new byte[1024];

                    DatagramPacket receivePacket = new DatagramPacket(receiveData,
                            receiveData.length);

                    System.out.println("Waiting for datagram packet");

                    serverSocket.receive(receivePacket);

                    String sentence = new String(receivePacket.getData());

                    InetAddress IPAddress = receivePacket.getAddress();

                    int port = receivePacket.getPort();

                    System.out.println("From: " + IPAddress + ":" + port);
                    System.out.println("Message: " + sentence);

                    String capitalizedSentence = sentence.toUpperCase();

                    sendData = capitalizedSentence.getBytes();

                    DatagramPacket sendPacket = new DatagramPacket(sendData,
                            sendData.length, IPAddress, port);

                    serverSocket.send(sendPacket);

                }

            }
            catch (SocketException ex) {
                System.out.println("UDP Port 9876 is occupied.");
                System.exit(1);
            }
            catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }

    }


}
乌德普斯特

import java.io.*;
import java.net.*;

class UDPTest extends UDPDataExchange {

    public static void main(String args[]) throws Exception {
        int UDPClientConcordiaPortNumber = 9876;
        int UDPClientMcgillPortNumber=9890;
        int UDPClientDawsonPortNumber=9891;
        UDPTest McgillServer=new UDPTest();
        UDPTest DawsonServer=new UDPTest();
        McgillServer.responseData(UDPClientConcordiaPortNumber);
        DawsonServer.responseData(UDPClientDawsonPortNumber);

        UDPTest concordiaTest = new UDPTest();

        System.out.println("Attemping to connect to " + IPAddress
                + ") via UDP port" + UDPClientConcordiaPortNumber);

        String concordiaData = "Hello from concordia";
        System.out.println("Sending data  " + concordiaData.length()
                + " bytes to server.");

        concordiaTest.requestData(UDPClientConcordiaPortNumber, concordiaData);

    }
}
class UDPTest extends UDPDataExchange {

public static void main(final String args[]) throws Exception {
    final int UDPClientConcordiaPortNumber = 9876;
    final int UDPClientMcgillPortNumber = 9890;
    final int UDPClientDawsonPortNumber = 9891;
    final UDPTest McgillServer = new UDPTest();
    final UDPTest DawsonServer = new UDPTest();
    final Thread t1 = new Thread() {
        @Override
        public void run() {
            McgillServer.responseData(UDPClientMcgillPortNumber);
        }
    };
    t1.setDaemon(true);
    t1.start();
    final Thread t2 = new Thread() {
        @Override
        public void run() {
            DawsonServer.responseData(UDPClientDawsonPortNumber);
        }
    };
    t2.setDaemon(true);
    t2.start();

    final UDPTest concordiaTest = new UDPTest();

    System.out.println("Attemping to connect to " + IPAddress
            + ") via UDP port" + UDPClientConcordiaPortNumber);

    final String concordiaData = "Hello from concordia";
    System.out.println("Sending data  " + concordiaData.length()
            + " bytes to server.");

    concordiaTest.requestData(UDPClientMcgillPortNumber, concordiaData);
    concordiaTest.requestData(UDPClientDawsonPortNumber, concordiaData);

}

在UDPDataExchange中,我定义了两种发送和接收数据的方法。在UDPTest类中,我试图创建两个服务器实例,即mcgill和dawson server,它们将侦听concordia的端口以获取发送的数据。一旦他们收到回复,他们会将回复发送回Concordia

试试这个,我不确定这是否正是你想要的

UDPDataExchange

public class UDPDataExchange {

String Hostname;
static InetAddress IPAddress;

UDPDataExchange() {
    Hostname = new String("127.0.0.1");
    try {
        IPAddress = InetAddress.getLocalHost();
    } catch (final UnknownHostException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
}

public void requestData(final int portNumber, final String data) {
    try {
        final DatagramSocket clientSocket = new DatagramSocket();
        final byte[] receiveData = new byte[1024];
        final DatagramPacket receivePacket = new DatagramPacket(receiveData,
                receiveData.length);
        byte[] sendData = new byte[1024];
        sendData = data.getBytes();
        System.out.print("Ready to send data ");
        final DatagramPacket sendPacket = new DatagramPacket(sendData,
                sendData.length, IPAddress, portNumber);
        clientSocket.send(sendPacket);
        clientSocket.setSoTimeout(10000);
        try {
            clientSocket.receive(receivePacket);
            final String modifiedSentence = new String(receivePacket.getData());

            final InetAddress returnIPAddress = receivePacket.getAddress();

            final int port = receivePacket.getPort();

            System.out.println("From server at: " + returnIPAddress + ":"
                    + port);
            System.out.println("Message: " + modifiedSentence);

        } catch (final SocketTimeoutException ste) {
            System.out.println("Timeout Occurred: Packet assumed lost");
        }
        // clientSocket.close();

    } catch (final SocketException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (final IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

}

public void responseData(final int portNumber) {
    try {

        final DatagramSocket serverSocket = new DatagramSocket(portNumber, IPAddress);
        byte[] receiveData = new byte[1024];
        byte[] sendData = new byte[1024];

        while (true) {

            receiveData = new byte[1024];

            final DatagramPacket receivePacket = new DatagramPacket(receiveData,
                    receiveData.length);

            System.out.println("Waiting for datagram packet");

            serverSocket.receive(receivePacket);

            final String sentence = new String(receivePacket.getData());

            final InetAddress IPAddress = receivePacket.getAddress();

            final int port = receivePacket.getPort();

            System.out.println("From: " + IPAddress + ":" + port);
            System.out.println("Message: " + sentence);

            final String capitalizedSentence = sentence.toUpperCase();

            sendData = capitalizedSentence.getBytes();

            final DatagramPacket sendPacket = new DatagramPacket(sendData,
                    sendData.length, IPAddress, port);

            serverSocket.send(sendPacket);

        }

    } catch (final SocketException ex) {
        System.out.println("UDP Port 9876 is occupied.");
        System.exit(1);
    } catch (final IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

}

}
乌德普斯特

import java.io.*;
import java.net.*;

class UDPTest extends UDPDataExchange {

    public static void main(String args[]) throws Exception {
        int UDPClientConcordiaPortNumber = 9876;
        int UDPClientMcgillPortNumber=9890;
        int UDPClientDawsonPortNumber=9891;
        UDPTest McgillServer=new UDPTest();
        UDPTest DawsonServer=new UDPTest();
        McgillServer.responseData(UDPClientConcordiaPortNumber);
        DawsonServer.responseData(UDPClientDawsonPortNumber);

        UDPTest concordiaTest = new UDPTest();

        System.out.println("Attemping to connect to " + IPAddress
                + ") via UDP port" + UDPClientConcordiaPortNumber);

        String concordiaData = "Hello from concordia";
        System.out.println("Sending data  " + concordiaData.length()
                + " bytes to server.");

        concordiaTest.requestData(UDPClientConcordiaPortNumber, concordiaData);

    }
}
class UDPTest extends UDPDataExchange {

public static void main(final String args[]) throws Exception {
    final int UDPClientConcordiaPortNumber = 9876;
    final int UDPClientMcgillPortNumber = 9890;
    final int UDPClientDawsonPortNumber = 9891;
    final UDPTest McgillServer = new UDPTest();
    final UDPTest DawsonServer = new UDPTest();
    final Thread t1 = new Thread() {
        @Override
        public void run() {
            McgillServer.responseData(UDPClientMcgillPortNumber);
        }
    };
    t1.setDaemon(true);
    t1.start();
    final Thread t2 = new Thread() {
        @Override
        public void run() {
            DawsonServer.responseData(UDPClientDawsonPortNumber);
        }
    };
    t2.setDaemon(true);
    t2.start();

    final UDPTest concordiaTest = new UDPTest();

    System.out.println("Attemping to connect to " + IPAddress
            + ") via UDP port" + UDPClientConcordiaPortNumber);

    final String concordiaData = "Hello from concordia";
    System.out.println("Sending data  " + concordiaData.length()
            + " bytes to server.");

    concordiaTest.requestData(UDPClientMcgillPortNumber, concordiaData);
    concordiaTest.requestData(UDPClientDawsonPortNumber, concordiaData);

}
}

我会简单地解释我改变了什么:

UDPDataExchange: 我将iPAddress更改为InetAddress.getLocalHost()

UDPTest: 每个对responseData的调用都在一个单独的线程中运行,以避免阻塞主线程。 线程是允许退出应用程序的守护进程。 requestData()调用已更改为调用每个服务器


希望对大家有用

请发布代码,看看发生了什么。单播应该可以。你能公布错误吗?或者问题到底是什么?他们联系不到对方还是什么?@ldmtwo:他们无法联系到对方。第一台服务器启动,执行暂停。谢谢你抽出时间帮我解决问题。这正是我想要的。