lapots
lapots

Reputation: 13415

stop thread with udp server

I've got an UDP server class which implements Runnable interface. I start it in the thread. The problem is that I can't stop it. Even in Debug it stops on pt.join() method.

Here is my server class

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.SocketException;


public class Network implements Runnable {
final int port = 6789;

DatagramSocket socket;

byte[] input = new byte[1024];
byte[] output = new byte[1024];

public Network() throws SocketException{
    socket = new DatagramSocket(6789);
}

@Override
public void run() {
    while(true){
        DatagramPacket pack = new DatagramPacket(input,input.length);
        try {
            socket.receive(pack);
        } catch (IOException e) {
            e.printStackTrace();
        }
        input = pack.getData();
        System.out.println(new String(input));
        output = "Server answer".getBytes();
        DatagramPacket sendpack = new DatagramPacket(output,output.length,pack.getAddress(),pack.getPort());
        try {
            socket.send(sendpack);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}
}

This is the main class

public class Main {

static Network network = null;

public static void main(String[] args) throws IOException{
    network = new Network();
    System.out.println("Try to start server");
    Thread pt = new Thread(network);
    pt.start();

    pt.interrupt();
    try {
        pt.join();
    } catch (InterruptedException e) {
        e.printStackTrace();
    }

    System.out.println("Stop server");
}
}

How to stop server?

Upvotes: 0

Views: 1627

Answers (3)

lanthica
lanthica

Reputation: 250

In addition to what EJP said, you probably should have a local boolean called running (or whatever), and set it to true before you enter your while loop. Have your while loop be conditioned on this local boolean. And provide methods (stopServer() and isRunning()) to set and check the status of the boolean. You also might want to remove the try-catch from inside the while loop and put the entire while loop within a try-catch-finally and in the finally statement perform clean-up (set running=false; close the connection, etc)

Upvotes: 1

user949300
user949300

Reputation: 15729

Calling interrupt doesn't actually stop the thread, it just sets a flag.

Inside your loop, check for isInterrupted(). e.g., a quick and dirty way would be change

while(true) 
to 
while (!Thread.currentThread().isInterrupted())

But you should consult some more documentation if you get more serious about this project.

As mentioned by @EJP, if you are hanging in the Socket IO, you'll need to close the Socket or have a timeout.

Upvotes: 1

user207421
user207421

Reputation: 311018

java.net reads are non-interruptible. You would have to either close the DatagramSocket or have it read with a timeout (setSoTimeout()), and when you get the resulting SocketTimeoutException check the interrupt status: if set, exit the thread.

Upvotes: 2

Related Questions