NIO UDP DatagramChannel data not sending out…

Nice to meet you, dear all.

I'm a beginner and this is my first time programming such thing using Java.

I'm writing a program which gets data input from a port, saves it into a buffer, and when the buffer is full, it'll send out the data using another port. The protocol is UDP.

So here is my code:
try {
    // UDP data-in settings
    DatagramChannel inChannel = DatagramChannel.open();
    SocketAddress inAddress = new InetSocketAddress(FMBuffer.IN_PORT);
    inChannel.bind(inAddress);

    // UDP data-out settings
    DatagramChannel outChannel = DatagramChannel.open();
    SocketAddress outAddress = new InetSocketAddress(FMBuffer.OUT_PORT);
    outChannel.bind(outAddress);

    LinkedList<ByteBuffer> buffer = new LinkedList<ByteBuffer>();
    ByteBuffer b = ByteBuffer
            .allocateDirect(FMBuffer.UDP_MAX_PACKET_SIZE);

    while (true) {          

        if (inChannel.receive(b) != null) { // Receive data and put into b
            b.flip();                   
            // Save b into the buffer
            buffer.addLast(b);

            System.out.print("In(" + buffer.size() + "): ");
            while (buffer.getLast().hasRemaining()) {                           
                System.out.write(buffer.getLast().get());
            }
            System.out.println();

            // If the buffer reaches the set limit
            if (buffer.size() > FMBuffer.BUFFER_LIST_SIZE) {
                // Send the first b out, then remove it
                System.out.print("Out(" + buffer.size() + "): ");
                while (buffer.getFirst().hasRemaining()) {                          
                    System.out.write(buffer.getFirst().get());
                    outChannel.send(buffer.getFirst(), outAddress);
                }
                System.out.println();
                buffer.removeFirst();
            }

            b.clear();

        } else { // Receive no data
            if (buffer.size() > 0) {
                // Send the first b out, then remove it
                System.out.print("Out remaining(" + buffer.size() + "): ");
                while (buffer.getFirst().hasRemaining()) {                          
                    System.out.write(buffer.getFirst().get());
                    outChannel.send(buffer.getFirst(), outAddress);
                }
                System.out.println();
                buffer.removeFirst();
            }
        }
    }
} catch (IOException e) {
    e.printStackTrace();
}

There are several problems...

I tried to use a program to read from 127.0.0.1:OUT_PORT. The program said that the port is in use. What shall I do?

Say BUFFER_LIST_SIZE = 5 and outChannel.send(...) is commented. The output data is always blank, not the input one. Also, if I stop sending data to it, it will not output the remaining data from its buffer. With inputs like "* UDP Flood. Server stress test ****", it will output:
    In(1): ***** UDP Flood. Server stress test ****
    In(2): ***** UDP Flood. Server stress test ****
    In(3): ***** UDP Flood. Server stress test ****
    In(4): ***** UDP Flood. Server stress test ****
    In(5): ***** UDP Flood. Server stress test ****
    In(6): ***** UDP Flood. Server stress test ****
    Out(6): 
    In(6): ***** UDP Flood. Server stress test ****
    Out(6): 
    In(6): ***** UDP Flood. Server stress test ****
    Out(6): 
    In(6): ***** UDP Flood. Server stress test ****
    Out(6): 

Thank you so much!
Sign In or Register to comment.