'Java Socket Programming: UDP Server to Client on same Machine

I'm trying to make a simple server and client UDP message passing application using UDP DatagramSockets and DatagramPackets; the program seems to work when the server and client are on different computers, but when running both in the same PC, for some reason the message from client to server is sent, but the message back from server to the client is not sent.

Code for Server:

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

public class Rfc865UdpServer{
    static DatagramSocket serverSocket;
    static BufferedReader inputReader = new BufferedReader(new InputStreamReader(System.in));
    public static void main(String[] args) {
        //Open up UDP Socket at port 17 (QOTD Port):
        try{
            serverSocket = new DatagramSocket(17);
        }
        catch(SocketException e){}

        while(true){
            try{
                //Listen for UDP request from client:
                DatagramPacket request = getRequest();
                String receivedMessage = new String(request.getData(), 0, request.getLength());
                System.out.printf("Message from client: %s\n", receivedMessage);

                //Send UDP reply to client:
                System.out.print("Enter Message: ");
                String message = inputReader.readLine();
                sendReply(request, message);
            }
            catch(UnknownHostException e){}
            catch(IOException e){}
        }
    }

    public static DatagramPacket getRequest() throws IOException{
        byte[] buffer = new byte[512];
        DatagramPacket request = new DatagramPacket(buffer, 512);
        serverSocket.receive(request);
        return request;
    }

    public static void sendReply(DatagramPacket request, String message) throws UnknownHostException, IOException{
        byte[] byteEncodedMessage = message.getBytes(); // Encode our quote into byte array
        InetAddress targetAddress = request.getAddress(); // Get the address of whoever sent a request datagram packet to our server

        DatagramPacket reply = new DatagramPacket(byteEncodedMessage, byteEncodedMessage.length, targetAddress, 18);
        serverSocket.send(reply);
    }
}

Code for Client:

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

public class Rfc865UdpClient{
    static DatagramSocket clientSocket;
    static BufferedReader inputReader = new BufferedReader(new InputStreamReader(System.in));
    public static void main(String[] args) {
        //Open a UDP Socket:
        try{
            clientSocket = new DatagramSocket();
        }
        catch(SocketException e){}
        try{
            //Send a UDP request to the server:
            System.out.print("Enter Message: ");
            String requestMessage = inputReader.readLine();
            sendRequest(requestMessage);

            //Receive a reply from the server:
            DatagramPacket reply = receiveReply();
            String receivedMessage = new String(reply.getData(), 0, reply.getLength()); // Convert the byte array data into String
            System.out.printf("Message from server: \"%s\"", receivedMessage);
        }
        catch(UnknownHostException e){}
        catch(IOException e){}
    }

    public static void sendRequest(String requestMessage) throws UnknownHostException, IOException{
        byte[] byteEncodedMessage = requestMessage.getBytes(); // Encode our message into bytes to put it inside the DatagramPacket
        InetAddress targetAddress = InetAddress.getByName("MYPCNAME"); //Get the InetAddress of the server we want to send message to
        DatagramPacket request = new DatagramPacket(byteEncodedMessage, byteEncodedMessage.length, targetAddress ,17); // Create a send request packet with our message
        clientSocket.send(request);
    }

    public static DatagramPacket receiveReply() throws IOException{
        byte[] buffer = new byte[512]; // RFC865 Document says quote should be less than 512 characters, so we set 512 as the limit
        DatagramPacket reply = new DatagramPacket(buffer, buffer.length);
        clientSocket.receive(reply);
        return reply;
    }
}

I am almost certain the problem is because both the server and client are in the same machine, and may be sharing the same InetAddress (?) Is there a way to fix this, and what exactly has gone wrong here?



Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source