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

处理-如何将数据(通过WebSocket?)发送到javascript应用程序,javascript,websocket,processing,Javascript,Websocket,Processing,我在玩处理,想知道是否可以将处理中的数据发送到javascript应用程序。是否有可能创建一个具有处理功能的(例如websocket)服务器 提前谢谢 我在eclipse for desktop中尝试过(有或没有扩展PApplet),它也可以在Android上运行。如果要在处理过程中使用库,则需要执行以下操作: 在Documents/Processing/libraries中创建名为java_websocket的文件夹 在新创建的java_websocket文件夹中,创建另一个名为library

我在玩处理,想知道是否可以将处理中的数据发送到javascript应用程序。是否有可能创建一个具有处理功能的(例如websocket)服务器

提前谢谢

我在eclipse for desktop中尝试过(有或没有扩展PApplet),它也可以在Android上运行。如果要在处理过程中使用库,则需要执行以下操作:

  • 在Documents/Processing/libraries中创建名为java_websocket的文件夹
  • 在新创建的java_websocket文件夹中,创建另一个名为library的文件夹,并将java_websocket.jar放在那里
  • 重新启动处理并开始使用库(草图>导入库应立即列出java_websocket)
  • 下面是正在处理的项目示例代码: 服务器:

    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 );
          }
        }
      }
    }
    
    这几乎是粘贴的Java代码,非常冗长。但是,如果需要的话,创建一些帮助器/包装器类应该很容易

    快速搜索会返回以下方便的结果:

    更新

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

    现在,您可以像使用任何其他处理库一样使用它,它的使用大大简化了(不需要java库经验,只需处理即可),示例也很棒

    我是通过另一个渠道了解到这一点的,这让我发现它实际上在你的Android设备上是开箱即用的(只需要选中INTERNET框)。那有多棒

    让所有这些可爱的websocket动作继续下去,就像它不是什么东西和奖金一样,它是支持android的

    在桌面上快速创建原型,然后从口袋中开始工作


    太空酿造♥ 处理

    非常详细的回答,非常感谢!目前我正在使用一种变通方法:处理启动OSC服务器,Node.js桥将数据从OSC服务器传输到WebSocket。不过,我会试试你的代码。谢谢你在@George Profenza发布的详细帖子。我的服务器是通过nodejs/socket.io创建的,每当我尝试通过上述处理客户端与之连接时,我都会从我的服务器收到“正在销毁非socket.io升级”,并在处理端收到“您已断开连接:ws://xx.xx.x.x.x”。这是否意味着此websocket库与socket.io不兼容?你知道我如何连接到socket.io websocket吗?对于未来的读者,我从socket.io切换到ws,一切正常。很好奇为什么socket.io没有那么通用/兼容…答案非常详细。干得好@Robbie socket.io客户端连接到socket.io服务器-它们与Windows不兼容。
    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();
        }
      }
    
    
    }