package org.java_websocket.bridge; import java.net.URI; import java.net.URISyntaxException; import java.util.Iterator; import java.util.ArrayList; import java.util.List; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.swing.JFrame; import javax.swing.JButton; import javax.swing.JPanel; import javax.swing.SwingUtilities; import org.java_websocket.client.WebSocketClient; import org.java_websocket.drafts.Draft; import org.java_websocket.drafts.Draft_10; import org.java_websocket.drafts.Draft_17; import org.java_websocket.handshake.ServerHandshake; public class MatlabBridgeClient extends WebSocketClient { private List _listeners = new ArrayList(); private ShutdownButton button = new ShutdownButton(); // Constructors public MatlabBridgeClient( URI serverUri, Draft draft ) { super( serverUri, draft ); this.button.setVisible(true); } public MatlabBridgeClient( URI serverURI ) { super( serverURI ); this.button.setVisible(true); } // Shut down button private class ShutdownButton extends JFrame { public ShutdownButton() { int x = 300; int y = 100; JPanel panel = new JPanel(); getContentPane().add(panel); panel.setLayout(null); JButton quitButton = new JButton("Manually Close Java Websocket"); quitButton.setBounds(5,5,x-10,y-35); quitButton.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent event) { onPress(); } }); panel.add(quitButton); setTitle("Java Websocket Open"); setSize(x,y); setLocationRelativeTo(null); setDefaultCloseOperation(DO_NOTHING_ON_CLOSE); } private void onPress() { close(); dispose(); } } // For testing purposes public static void main( String[] args ) throws URISyntaxException { // more about drafts here: http://github.com/TooTallNate/Java-WebSocket/wiki/Drafts MatlabBridgeClient c = new MatlabBridgeClient( new URI( "ws://127.0.0.1:9000" ), new Draft_17() ); c.connect(); } /*********** JAVA Callbacks ***********/ // Override from WebSocketClient @Override public void onOpen( ServerHandshake handshakedata ) { String openMessage = "[JAVA] Opened connection."; System.out.println( openMessage ); MatlabEvent matlab_event = new MatlabEvent( this, openMessage); Iterator listeners = _listeners.iterator(); while (listeners.hasNext() ) { ( (MatlabListener) listeners.next() ).onOpen( matlab_event ); } } @Override public void onMessage( String message ) { _fireMatlab( message ); } @Override public void onClose( int code, String reason, boolean remote ) { // The codecodes are documented in class org.java_websocket.framing.CloseFrame String outMessage = "[JAVA] Connection closed by " + ( remote ? "remote peer." : "us." ); System.out.println( outMessage ); this.button.dispose(); MatlabEvent matlab_event = new MatlabEvent( this, outMessage); Iterator listeners = _listeners.iterator(); while (listeners.hasNext() ) { ( (MatlabListener) listeners.next() ).onClose( matlab_event ); } } @Override public void onError( Exception ex ) { System.out.println("[JAVA]: error received."); ex.printStackTrace(); // if the error is fatal then onClose will be called additionally } /*********** MATLAB CALLBACKS ***********/ // Methods for handling matlab as a listener. Automatically managed by matlab. public synchronized void addMatlabListener( MatlabListener l ) { _listeners.add( l ); } public synchronized void removeMatlabListener( MatlabListener l) { _listeners.remove( l ); } private synchronized void _fireMatlab(String message) { MatlabEvent matlab_event = new MatlabEvent( this, message); Iterator listeners = _listeners.iterator(); while (listeners.hasNext() ) { ( (MatlabListener) listeners.next() ).onMessage( matlab_event ); } } // Methods that define callbacks in Matlab. // Inside Matlab, they need to be referenced for example as 'OnOpenCallback' public interface MatlabListener extends java.util.EventListener { void onOpen( MatlabEvent event ); void onMessage( MatlabEvent event ); void onError( MatlabEvent event ); void onClose( MatlabEvent event ); } // Object given to Matlab when an event occur public class MatlabEvent extends java.util.EventObject { public String message; public MatlabEvent( Object obj, String message) { super( obj ); this.message = message; } } }