/** * http://www.germane-software.com/software/Java/Gozirra/ */ package org.chililog.client.stomp; import java.util.Map; import java.util.HashMap; import java.io.*; import java.net.Socket; import javax.security.auth.login.LoginException; /** * Implements a Stomp client connection to a Stomp server via the network. * * Example: * * <pre> * Client c = new Client( "localhost", 61626, "ser", "ser" ); * c.subscribe( "/my/channel", new Listener() { ... } ); * c.subscribe( "/my/other/channel", new Listener() { ... } ); * c.send( "/other/channel", "Some message" ); * // ... * c.disconnect(); * </pre> * * @see Stomp * * (c)2005 Sean Russell */ @SuppressWarnings({ "rawtypes", "unchecked" }) public class Client extends Stomp implements MessageReceiver { private Thread _listener; private OutputStream _output; private InputStream _input; private Socket _socket; /** * Connects to a server * * Example: * * <pre> * Client stomp_client = new Client( "host.com", 61626 ); * stomp_client.subscribe( "/my/messages" ); * ... * </pre> * * @see Stomp * @param server * The IP or host name of the server * @param port * The port the server is listening on */ public Client(String server, int port, String login, String pass) throws IOException, LoginException { _socket = new Socket(server, port); _input = _socket.getInputStream(); _output = _socket.getOutputStream(); _listener = new Receiver(this, _input); _listener.start(); // Connect to the server HashMap header = new HashMap(); header.put("login", login); header.put("passcode", pass); transmit(Command.CONNECT, header, null); try { String error = null; while (!isConnected() && ((error = nextError()) == null)) { Thread.sleep(100); } if (error != null) throw new LoginException(error); } catch (InterruptedException e) { } } public boolean isClosed() { return _socket.isClosed(); } public void disconnect(Map header) { if (!isConnected()) return; transmit(Command.DISCONNECT, header, null); _listener.interrupt(); Thread.yield(); try { _input.close(); } catch (IOException e) {/* We ignore these. */ } try { _output.close(); } catch (IOException e) {/* We ignore these. */ } try { _socket.close(); } catch (IOException e) {/* We ignore these. */ } _connected = false; } /** * Transmit a message to the server */ public void transmit(Command c, Map h, String b) { try { Transmitter.transmit(c, h, b, _output); } catch (Exception e) { receive(Command.ERROR, null, e.getMessage()); } } }