package com.external.stomp; import javax.security.auth.login.LoginException; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.net.Socket; import java.util.HashMap; import java.util.Map; /** * 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 */ 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() ); } } }