处理 - 如何将数据(通过websockets?)发送到javascript应用程序

时间:2013-09-19 16:27:00

标签: javascript websocket processing

如果我可以将数据从处理发送到javascript应用程序,我正在玩处理和奇迹。是否有可能创建一个具有处理功能的(例如websocket)服务器?

提前致谢!

1 个答案:

答案 0 :(得分:9)

我已经在eclipse for desktop中尝试了Java WebSockets(有或没有扩展PApplet),它也适用于Android。如果要在Processing中使用库,则需要执行以下操作:

  1. 在Documents / Processing / libraries
  2. 中创建名为 java_websocket 的文件夹
  3. 在新创建的java_websocket文件夹中创建另一个名为 library 的文件夹,然后删除java_websocket.jar
  4. 重新启动处理并开始使用库(草图>导入库现在应列出java_websocket)
  5. 这是处理中的项目示例代码: 服务器:

    import java.io.BufferedReader;
    import java.io.IOException;
    import java.io.InputStreamReader;
    import java.net.InetSocketAddress;
    import java.net.UnknownHostException;
    import java.util.Collection;
    
    import org.java_websocket.WebSocket;
    import org.java_websocket.WebSocketImpl;
    import org.java_websocket.handshake.ClientHandshake;
    import org.java_websocket.server.WebSocketServer;
    
    void setup(){
      new ServerThread().start();
    }
    //create a separate thread for the server not to freeze/interfere with Processing's default animation thread
    public class ServerThread extends Thread{
      @Override
      public void run(){
        try{
              WebSocketImpl.DEBUG = true;
              int port = 8887; // 843 flash policy port
              try {
                port = Integer.parseInt( args[ 0 ] );
              } catch ( Exception ex ) {
              }
              ChatServer s = new ChatServer( port );
              s.start();
              System.out.println( "ChatServer started on port: " + s.getPort() );
    
              BufferedReader sysin = new BufferedReader( new InputStreamReader( System.in ) );
              while ( true ) {
                String in = sysin.readLine();
                s.sendToAll( in );
              }
            }catch(IOException e){
              e.printStackTrace();
            }  
      }
    }
    public class ChatServer extends WebSocketServer {
    
      public ChatServer( int port ) throws UnknownHostException {
        super( new InetSocketAddress( port ) );
      }
    
      public ChatServer( InetSocketAddress address ) {
        super( address );
      }
    
      @Override
      public void onOpen( WebSocket conn, ClientHandshake handshake ) {
        this.sendToAll( "new connection: " + handshake.getResourceDescriptor() );
        System.out.println( conn.getRemoteSocketAddress().getAddress().getHostAddress() + " entered the room!" );
      }
    
      @Override
      public void onClose( WebSocket conn, int code, String reason, boolean remote ) {
        this.sendToAll( conn + " has left the room!" );
        System.out.println( conn + " has left the room!" );
      }
    
      @Override
      public void onMessage( WebSocket conn, String message ) {
        this.sendToAll( message );
        System.out.println( conn + ": " + message );
      }
    
      @Override
      public void onError( WebSocket conn, Exception ex ) {
        ex.printStackTrace();
        if( conn != null ) {
          // some errors like port binding failed may not be assignable to a specific websocket
        }
      }
    
      /**
       * Sends <var>text</var> to all currently connected WebSocket clients.
       * 
       * @param text
       *            The String to send across the network.
       * @throws InterruptedException
       *             When socket related I/O errors occur.
       */
      public void sendToAll( String text ) {
        Collection<WebSocket> con = connections();
        synchronized ( con ) {
          for( WebSocket c : con ) {
            c.send( text );
          }
        }
      }
    }
    

    测试客户:

    import java.awt.Container;
    import java.awt.GridLayout;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    import java.awt.event.WindowEvent;
    import java.net.URI;
    import java.net.URISyntaxException;
    
    import javax.swing.JButton;
    import javax.swing.JComboBox;
    import javax.swing.JFrame;
    import javax.swing.JScrollPane;
    import javax.swing.JTextArea;
    import javax.swing.JTextField;
    
    import org.java_websocket.WebSocketImpl;
    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.drafts.Draft_75;
    import org.java_websocket.drafts.Draft_76;
    import org.java_websocket.handshake.ServerHandshake;
    
    void setup(){
      WebSocketImpl.DEBUG = true;
      new ChatClient( "ws://localhost:8887" );
    }
    
    public class ChatClient extends JFrame implements ActionListener {
      private static final long serialVersionUID = -6056260699202978657L;
    
      private final JTextField uriField;
      private final JButton connect;
      private final JButton close;
      private final JTextArea ta;
      private final JTextField chatField;
      private final JComboBox draft;
      private WebSocketClient cc;
    
      public ChatClient( String defaultlocation ) {
        super( "WebSocket Chat Client" );
        Container c = getContentPane();
        GridLayout layout = new GridLayout();
        layout.setColumns( 1 );
        layout.setRows( 6 );
        c.setLayout( layout );
    
        Draft[] drafts = { new Draft_17(), new Draft_10(), new Draft_76(), new Draft_75() };
    
        draft = new JComboBox( drafts );
        c.add( draft );
    
        uriField = new JTextField();
        uriField.setText( defaultlocation );
        c.add( uriField );
    
        connect = new JButton( "Connect" );
        connect.addActionListener( this );
        c.add( connect );
    
        close = new JButton( "Close" );
        close.addActionListener( this );
        close.setEnabled( false );
        c.add( close );
    
        JScrollPane scroll = new JScrollPane();
        ta = new JTextArea();
        scroll.setViewportView( ta );
        c.add( scroll );
    
        chatField = new JTextField();
        chatField.setText( "" );
        chatField.addActionListener( this );
        c.add( chatField );
    
        java.awt.Dimension d = new java.awt.Dimension( 300, 400 );
        setPreferredSize( d );
        setSize( d );
    
        addWindowListener( new java.awt.event.WindowAdapter() {
          @Override
          public void windowClosing( WindowEvent e ) {
            if( cc != null ) {
              cc.close();
            }
            dispose();
          }
        } );
    
        setLocationRelativeTo( null );
        setVisible( true );
      }
    
      public void actionPerformed( ActionEvent e ) {
    
        if( e.getSource() == chatField ) {
          if( cc != null ) {
            cc.send( chatField.getText() );
            chatField.setText( "" );
            chatField.requestFocus();
          }
    
        } else if( e.getSource() == connect ) {
          try {
            // cc = new ChatClient(new URI(uriField.getText()), area, ( Draft ) draft.getSelectedItem() );
            cc = new WebSocketClient( new URI( uriField.getText() ), (Draft) draft.getSelectedItem() ) {
    
              @Override
              public void onMessage( String message ) {
                ta.append( "got: " + message + "\n" );
                ta.setCaretPosition( ta.getDocument().getLength() );
              }
    
              @Override
              public void onOpen( ServerHandshake handshake ) {
                ta.append( "You are connected to ChatServer: " + getURI() + "\n" );
                ta.setCaretPosition( ta.getDocument().getLength() );
              }
    
              @Override
              public void onClose( int code, String reason, boolean remote ) {
                ta.append( "You have been disconnected from: " + getURI() + "; Code: " + code + " " + reason + "\n" );
                ta.setCaretPosition( ta.getDocument().getLength() );
                connect.setEnabled( true );
                uriField.setEditable( true );
                draft.setEditable( true );
                close.setEnabled( false );
              }
    
              @Override
              public void onError( Exception ex ) {
                ta.append( "Exception occured ...\n" + ex + "\n" );
                ta.setCaretPosition( ta.getDocument().getLength() );
                ex.printStackTrace();
                connect.setEnabled( true );
                uriField.setEditable( true );
                draft.setEditable( true );
                close.setEnabled( false );
              }
            };
    
            close.setEnabled( true );
            connect.setEnabled( false );
            uriField.setEditable( false );
            draft.setEditable( false );
            cc.connect();
          } catch ( URISyntaxException ex ) {
            ta.append( uriField.getText() + " is not a valid WebSocket URI\n" );
          }
        } else if( e.getSource() == close ) {
          cc.close();
        }
      }
    
    
    }
    

    这几乎是粘贴的Java代码,这些代码很冗长。但是如果需要的话,应该很容易制作一些辅助/包装类。

    快速搜索会返回这些方便的结果:

    <强>更新

    我最近被介绍到一个名为spacebrew的新Websockets库,它非常适合您的查询,特别是因为它们似乎已经很好地在幕后包装了java_websocket。

    现在你将它用作任何其他处理库,大大简化了使用(不需要java库经验,只需要处理),例子很棒!

    我通过另一个question介绍了这一点,这让我发现它实际上是开箱即用的Android设备开箱即用(只需要检查INTERNET框)。这有多棒?

    让所有那些甜蜜的websocket动作继续进行,这不是没有东西和奖励,它是android支持的。

    在桌面上快速制作原型,然后从口袋中开始使用您的项目。

    spacebrew demo 1

    spacebrew demo 2

    spacebrew demo 3

    Spacebrew♥处理