Java多播客户端服务器

时间:2014-11-22 14:00:15

标签: java multithreading sockets tcp

我尝试创建一个基于客户端/服务器通信的程序。 在这个程序中,我有几个客户端和几个服务器。 在程序开始时,一些客户端上升,并等待来自不同服务器的新连接。 当第一台服务器启动时,我希望他知道谁是网络中可用的客户端,然后它开始以tcp协议(ServerSocket)与所有这些客户端通信。 但是,如果新客户端启动,则此服务器应该知道它。 当新服务器上升时也会发生同样的情况。

我的第一个想法是使用多播通信。客户端将每5秒向网络发送一次广播,服务器将监听这些消息。 我的问题是如何结合这两种方法(多播和tcp)来构建这个程序。 我应该使用两个不同的端口,一个用于多播,一个用于tcp协议? 是否可以允许服务器\客户端监听带有踏板的不同通信(多播或tcp)?

我只需要一个小小的推动,以及一些基本的代码来开始这个...

编辑:好的,我成功构建了一个多播通信。 代理程序启动,每隔5秒发送一次其名称。 服务器上升,并接收代理的广播。 如果新代理程序启动,服务器就会知道它。

代码如下所示:

代理商代码:

    import java.io.BufferedReader;
    import java.io.IOException;
    import java.io.InputStreamReader;
    import java.io.PrintWriter;
    import java.net.DatagramPacket;
    import java.net.DatagramSocket;
    import java.net.InetAddress;
    import java.net.ServerSocket;
    import java.net.Socket;
    import java.net.SocketException;
    import java.util.Scanner;


    public class Agent {
        private static int portMulticasting = 1004;

        private DatagramSocket socket;
        private boolean broadcast =  true;
        private String group = "230.0.0.1"; //group address
        private int delay = 5000;

        public Agent(){
            try{
                socket = new DatagramSocket();
                System.out.println("agent ready");
            }
            catch (SocketException e){
                e.printStackTrace();
                System.exit(1);
            }
        }

        public void start(String agentName){
            DatagramPacket packet;
            try{
                InetAddress address = InetAddress.getByName(group);
                while (broadcast){
                    byte[] buf = new byte[256];
                    buf = agentName.getBytes();
                    packet = new DatagramPacket(buf,buf.length,address,portMulticasting);
                    socket.send(packet);
                    try{
                        Thread.sleep(delay);
                    } catch (InterruptedException e){
                        System.exit(0);
                    }   
                }
                socket.close();
            } catch (IOException e){
                e.printStackTrace();
            }
        }

        public static void main (String[] args) throws IOException {

            System.out.println("Enter name of the new agent: ");
            Scanner sc = new Scanner(System.in);
            String agentName = sc.nextLine();

            Agent agent = new Agent();
            agent.start(agentName);
       }
   }

服务器代码:

    import java.io.BufferedReader;
    import java.io.IOException;
    import java.io.InputStreamReader;
    import java.io.PrintWriter;
    import java.net.DatagramPacket;
    import java.net.InetAddress;
    import java.net.MulticastSocket;
    import java.net.Socket;
    import java.net.UnknownHostException;
    import java.util.Scanner;



    public class Server {

        public static void main(String[] args) throws IOException {
            String groupIP = "230.0.0.1";
            int portMulticasting = 1004;
            if (args.length > 0)
                groupIP = args[0];
            try{
                //get a multicast socket and join group
                MulticastSocket socket = new MulticastSocket(portMulticasting);
                InetAddress group = InetAddress.getByName(groupIP);
                socket.joinGroup(group);
                //get packet
                DatagramPacket packet;
                while (true){
                    byte[] buf = new byte[256];
                    packet = new DatagramPacket(buf,buf.length);
                    socket.receive(packet);
                    buf = packet.getData();
                    int len = packet.getLength();
                    String received = (new String(buf)).substring(0,len);
                    try{
                        System.out.println("Agent name: " + received);
                    } catch (NumberFormatException e){
                        System.out.println("cannot interpret number");
                    }
                }
                socket.leaveGroup(group);
                socket.close();
            } catch (IOException e){
                e.printStackTrace();
            }
        }
   }

现在,我希望代理继续每5秒发送一次广播,但同时服务器开始与代理一起工作(发送消息,向代理询问信息等)。

0 个答案:

没有答案