/*
* OnLine.java
*
* Created on den 4 september 2001, 16:19
*/
package ip1.u4.onLine;
import java.util.*;
import java.net.*;
import ip1.u4.net.*;
import java.io.*;
/**
*/
public class OnLine {
private static String address = "234.235.236.237";
private static int port = 2000;
private static int period = 1000;
private String message;
private OnLineGUI gui = null;
private PeriodicMulticastSender sender;
private MulticastReceiver multicastReceiver = null;
private Set users = null;
private boolean running;
/** Skapar nytt OnLine objekt. Detta sänder sedan periodiskt ut
* name adressen samt comment på en förbestämd
* multicastadress. OnLine tar också emot motsvarande meddelanden från
* andra användare och visar vilka som för tillfället är uppkopplade.,
* @param name Det namn användaren vill göra sig känd under.
* @param comment användardefinierad kommentar.
*/
public OnLine(String name, String comment) {
try {
gui = new OnLineGUI(this);
message = "From: " + name + " Host: " + InetAddress.getLocalHost().getHostAddress() + " Comment: " + comment;
users = new HashSet();
running = true;
new UpdateUsers();
OnLineDatagramReceiver receiver = new OnLineDatagramReceiver(this);
multicastReceiver = new MulticastReceiver(InetAddress.getByName(address), port, receiver);
sender = new PeriodicMulticastSender(InetAddress.getByName(address), port, period, message);
sender.start();
gui.uppdateTitle(address, port);
} catch(UnknownHostException e) {
System.err.println(e);
System.exit(1);
} catch(IOException e) {
System.err.println(e);
System.exit(1);
}
}
/** main. Skapar nytt OnLine-objekt genom att kalla på
* {@link OnLine(String,String) OnLine}.
* @param args kommandoradsargumenten
*/
public static void main (String args[]) {
new OnLine(args[0], args[1]);
}
/** Lägg till uppsnappad användare att visa upp som uppkopplad i guiet.
* @param user användare
*/
synchronized protected void addUser(User user) {
users.add(user);
}
synchronized private void updateUsers() {
gui.uppdateUsers(users.toArray());
users.clear();
}
/** Avslutar OnLine applikationen. Ber öppna mottagare och sändare att
* stänga sig och se till att inga oppna trådar hänger kvar.
*/
protected void close() {
sender.stop();
multicastReceiver.close();
running = false;
System.exit(0);
}
/** Inre klass, implementerar Runnable. Uppdaterar guiet med uppkopplade
* användare var femte sekund.
*/
private class UpdateUsers implements Runnable {
private int period = 5000;
private Thread thread;
/** ber guiet att visa upp vilka användare som finns uppkopplade.
*/
UpdateUsers() {
thread = new Thread(this);
thread.start();
}
public void run() {
while(running) {
try {
updateUsers();
thread.sleep(period);
} catch(InterruptedException e) {
System.err.println(e);
}
}
}
}
}