client server udp socket

前端 未结 1 2041
眼角桃花
眼角桃花 2021-01-26 06:59

Hi i have a udp client server code that is not working i ask a general question \"Is shane a good kid\"both codes have no errors that come up but when i run the code it outputs

相关标签:
1条回答
  • 2021-01-26 07:53

    I get a NullPointException running your code in the Server-side... There are a few problems in the code itself. The first one is the index of the Array that you attempt to keep the instance of the Clients connection. At this point, you have only one...

    for (int i=0; i<1; i++) {
        DatagramPacket receivePacket = 
            new DatagramPacket(receiveData, receiveData.length);
        serverSocket.receive(receivePacket);
        String greeting = new String(receivePacket.getData());
        System.out.println("From Client: " + greeting);
    
        IPAddressList[i] = receivePacket.getAddress();
        portList[i] = receivePacket.getPort();
    } // for (i)
    

    However, at this point, your code is prone to NullPointException as you try to iterate over it 5 times...

    String question = "is shane a good kid 1 for yes 0 no?\n";
    for (int i=0; i<5; i++) { 
        sendData = question.getBytes();
        DatagramPacket sendPacket = 
            new DatagramPacket(sendData, sendData.length);
        serverSocket.send(sendPacket);   <<<<---- NPE prone code line... 
    

    Here's the result of running the code...

    From Client: hello
    Exception in thread "main" java.lang.NullPointerException: null buffer || null address
        at java.net.PlainDatagramSocketImpl.send(Native Method)
        at java.net.DatagramSocket.send(DatagramSocket.java:629)
        at com.vasoftware.sf.common.VotingServer.main(VotingServer.java:38)
    

    Looking at this exception, I noticed that since your buffer would not be null, your address is the problem, since you create a new DatagramPacket without both the IP and the Port number of the client connection... You have to pass them to the DatagramPacket instance so that the server knows who is the client trying to communicate... A very simple/basic example of what you are trying to achieve is at http://systembash.com/content/a-simple-java-udp-server-and-udp-client/. Below is my initial fixing of the code... Your answers will still need some work on the buffer, which I will leave it as an exercise...

    Here's a fixed code for Server that accepts only 1 client... I will leave the Multi-threaded stuff + the data handler for you as an exercise...

    import java.net.DatagramPacket;
    import java.net.DatagramSocket;
    import java.net.InetAddress;
    import java.util.Arrays;
    
    public class VotingServer {
    
      //private static final int yes = 0;
        private static int yes2;
    
        public static void main(String[] args) throws Exception {
            // part 1: initialization
            DatagramSocket serverSocket = new DatagramSocket(9876);
            byte[] receiveData = new byte[1024];
            byte[] sendData = new byte[1024];
            InetAddress IPAddressList;
            int portList = -1;
    
            // part 2: receive the greeting from clients
            System.out.println("Ready to receive connections at port " + serverSocket.getLocalPort());
            DatagramPacket receivePacket = new DatagramPacket(receiveData, receiveData.length);
            serverSocket.receive(receivePacket);
            String greeting = new String(receivePacket.getData());
            System.out.println("From Client: " + greeting);
    
            IPAddressList = receivePacket.getAddress();
            portList= receivePacket.getPort();
    
            // part 3: broadcast the votiong question to all clients
            String question = "is shane a good kid 1 for yes 0 no?\n";
            sendData = question.getBytes();
            DatagramPacket sendPacket = new DatagramPacket(sendData, sendData.length, IPAddressList, portList);
            serverSocket.send(sendPacket);
    
        // part 5: receive the age of client (B)
            receiveData = new byte[1024];
            receivePacket = new DatagramPacket(receiveData, receiveData.length);
            serverSocket.receive(receivePacket);
            String ageStr = new String(receivePacket.getData());
    
            try {
                yes2 = Integer.parseInt(ageStr);   //<<<----- WILL NEVER GET THE VALUE... LEAVING IT AS AN EXERCISE....
    
            } catch (NumberFormatException nfe) {
                yes2 = 0;
            }
    
            receivePacket.getAddress();
            receivePacket.getPort();
    
            // part 6: compute the price (C)
            double count= 0; 
            double no = 0;
    
            if (yes2 >= 1 ) count = 1;
            else 
                if (yes2 <= 0 ) no = 1;
    
            // part 7: send the price to client
            // ALSO FIXING SOME CODE HERE AS WELL....
            String rep = null;
            rep = no < count ? "Is a good kid" : "is a bad kid";
            rep += " Server Count: " + count;
    
            sendData = rep.getBytes();
            DatagramPacket sendPacket1 = new DatagramPacket(sendData, sendData.length, IPAddressList, portList);
            serverSocket.send(sendPacket1);
        }
    }
    

    Here's the client-side:

    import java.io.BufferedReader;
    import java.io.InputStreamReader;
    import java.net.DatagramPacket;
    import java.net.DatagramSocket;
    import java.net.InetAddress;
    
    public class ClientVoting {
    
        public static void main(String[] args) throws Exception {
            // part 1: initialization
            BufferedReader inFromUser = new BufferedReader(new InputStreamReader(System.in));
            DatagramSocket clientSocket = new DatagramSocket();
            InetAddress IPAddress = InetAddress.getByName("localhost");
            byte[] sendData = new byte[1024];
            byte[] receiveData = new byte[1024];
    
            System.out.print("What's the question? ");
            String sentence = inFromUser.readLine();
            sendData = sentence.getBytes();
            System.out.println("Attempting to connect the server at port " + 9876);
            DatagramPacket sendPacket = new DatagramPacket(sendData, sendData.length, IPAddress, 9876);
            clientSocket.send(sendPacket);
    
            System.out.println("Initial greeting sent... Waiting for response...");
    
            // part 2: receive the question from server
            DatagramPacket receivePacket = new DatagramPacket(receiveData, receiveData.length);
            clientSocket.receive(receivePacket);
            String question = new String(receivePacket.getData());
            System.out.println("From Server:" + question);
    
            String yes2 = inFromUser.readLine();
            sendData = yes2.getBytes();
            DatagramPacket sendPacket1 = 
                new DatagramPacket(sendData, sendData.length, IPAddress, 9876);
            clientSocket.send(sendPacket1);
    
    
            // part 4: get the price from server
            receiveData = new byte[1024];
            receivePacket = new DatagramPacket(receiveData, receiveData.length);
            clientSocket.receive(receivePacket);
            String rep = new String(receivePacket.getData());
            System.out.println("the answer is " + rep);
    
            // part 4: close the socket
            clientSocket.close();
    
        } // main()
    }
    

    You MUST execute the server first, as it will listen to the socket open on port 9876. Then, you can connect to the server with the client.

    ###### Here's the output in the server-side... Just added a few details of what's going on...
    Ready to receive connections at port 9876
    From Client: Marcello
    
    ####### Here's the output of the client:
    What's the question? Marcello
    Attempting to connect the server at port 9876
    Initial greeting sent... Waiting for response...
    From Server:is shane a good kid 1 for yes 0 no?
    the answer is is a bad kid Server Count: 0.0
    

    As it seems that your requirement is to design a Server that can handle multiple clients and count on the number of votes, I would also recommend you to use a Multi-threaded version of the server by using different Threads to deal with each client in its own thread and update the value of the static counter (an example is a while(true) loop executing a new Runnable with an Executor here http://java-x.blogspot.com/2006/11/java-5-executors-threadpool.html). Think about creating a Runnable instance as described, and placing the server's code in the public void run() {} method implementation... I will leave this as an exercise for you as well...

    0 讨论(0)
提交回复
热议问题