2016-07-30 3 views
0

私のプロジェクトは次のようになります:自転車の速度計をシンプルな自転車に取り付け、ラップトップにイーサネットケーブルで接続されたRaspberry Piに接続しました。他のプログラムで使用されているクライアント/サーバープログラムからJavaの値を受け取った

私がしたいことは:ラズベリーは自転車の車輪の速度を測定し、この値をイーサネットケーブルでラップトップに送信します。ラップトップは現在、受信した値を使用し、VLCで再生されるビデオのスピードアップを行います。

私はホイールのスピードを測定するためにRPi上でJavaプログラムを動作させています。RPIからラップトップに値を送るための働くクライアント(ラップトップ上)-server(RPi上)Javaプログラムと、ラップトップでVLCで再生されるビデオの速度を制御します。

しかし私の問題は、VLCで再生しているビデオの速度を制御する私のプログラムで、クライアント - サーバプログラムを介してRPiから受信した値を使用する方法がわからないことです。

ダウンは、クライアントのためのコードで、ビデオの速度を制御します。

クライアントコード:

package player; 

import java.io.BufferedReader; 
import java.io.DataInputStream; 
import java.io.IOException; 
import java.io.InputStreamReader; 
import java.io.PrintStream; 
import java.net.Socket; 
import java.net.UnknownHostException; 
import java.util.Scanner; 

public class client { 

public static int inputPlayer = 0; 

public static void main(String[] args) throws UnknownHostException, IOException { 

    String accept; 
    int input; 


    DataInputStream inC = null; 
    Scanner sc1 = null; 

    Socket s = null; 

    try { 

     s = new Socket ("169.254.218.194", 1342); 
     Scanner sc = new Scanner (System.in); 
     System.out.println("Accept connection!"); 
     accept = sc.next(); 
     PrintStream p = new PrintStream (s.getOutputStream()); 
     p.println(accept); 
     //inC = new DataInputStream(s.getInputStream()); 


    } 

    catch (Exception e) { 
     e.printStackTrace(); 
    } 


    while (true) { 
      sc1 = new Scanner (s.getInputStream()); 
      input = sc1.nextInt(); 
      if (input > 0) { 
       inputPlayer = input; 
      } 

      System.out.println("I" + input); 
      //System.out.println("IP" + inputPlayer); 
    } 
} 

public int getInputPlayer() { 
    return this.inputPlayer; 
} 
} 

プレーヤーコード:私がやりたい

package player; 

import java.awt.BorderLayout; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import java.awt.event.WindowAdapter; 
import java.awt.event.WindowEvent; 
import java.util.Scanner; 

import javax.swing.JButton; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 
import javax.swing.SwingUtilities; 
import javax.swing.WindowConstants; 

import uk.co.caprica.vlcj.component.EmbeddedMediaPlayerComponent; 
import uk.co.caprica.vlcj.discovery.NativeDiscovery; 

public class Player { 

private final JFrame frame; 
private final EmbeddedMediaPlayerComponent mediaPlayerComponent; 



public static void main(final String[] args) { 
    new NativeDiscovery().discover(); 
    SwingUtilities.invokeLater(new Runnable() { 
     @Override 
     public void run() { 
      new Player(args); 
     } 
    }); 
} 

public Player(String[] args) { 
    frame = new JFrame("My First Media Player"); 
    frame.setBounds(100, 100, 600, 400); 
    frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); 
    frame.addWindowListener(new WindowAdapter() { 
     @Override 
     public void windowClosing(WindowEvent e) { 
      mediaPlayerComponent.release(); 
      System.exit(0); 
     } 
    }); 

    JPanel contentPane = new JPanel(); 
    contentPane.setLayout(new BorderLayout()); 

    mediaPlayerComponent = new EmbeddedMediaPlayerComponent(); 
    contentPane.add(mediaPlayerComponent, BorderLayout.CENTER); 

    Scanner in = new Scanner (System.in); 

    frame.setContentPane(contentPane); 
    frame.setVisible(true); 

     mediaPlayerComponent.getMediaPlayer().playMedia("file:URL"); 
    mediaPlayerComponent.getMediaPlayer().skip(1000); 



    client c = new client(); 
    float i = c.getInputPlayer(); 

    while (true) { 
     //float i = in.nextFloat(); 
     //System.out.println(i); 


     mediaPlayerComponent.getMediaPlayer().setRate(i); 
    } 
} 
} 

すべてはプレイヤーのクラスの私は変数としてクライアントクラスから変数 inputPlayerを使用することです。 "[000000001ade9eb0]コア入力エラー:入力制御用FIFOオーバーフロー、タイプ= 2中傷" あなたの助けのための

感謝を

私が行ってきたように、Eclipseは私にエラーを返します。

答えて

0

ここにいくつかの問題があります。

  • clientクラスのコードを実行されることはありません(ところで、クラス名は大文字で始める必要がありますが)。そのクラスのすべてのコードをメインメソッドに入れました。このメソッドは、そのクラスを選択してアプリケーションを実行すると実行されます。本質的に、ここには2つの別々のアプリケーションがあります。あなたが同時にそれらを実行する場合でも、他のクラスのインスタンスに直接アクセスすることができないので、あなたを助けません。
  • iは一度だけ設定し、ループ
  • 内に更新されることはありませんあなたは、通常の方法にclientクラスのmainメソッドを回すことができ、それでも、あなたは彼ら場合は、同じ時刻に実行2つのwhile(true)のループを持つことはできません同じスレッドにあります。

この段階でスレッドを処理するのが少し面倒であれば、単純に両方のクラスを1つにまとめることができます。 1つのループは入ってくるデータをスキャンし、プレーヤーのスピードを設定します。これは、プレイヤー自体の実装方法によっては機能しないかもしれませんが、試してみることもできます。

+0

私はそんなに多くの問題を期待していなかった:) OK、私はそれらを解決したと思う。スレッドを使って新しいプログラムを実装します。しかし、今はスレッドの実行時間をうまく管理する方法がわかりません。問題は、プログラムを起動すると、最初のスレッドが実行を開始し、停止して2番目のスレッドが実行され、これが無限に実行されていることです。だから私は最初の実行を行うためにX msのために2番目のスレッドを一時停止しなければならないし、2番目のものを実行するためにX msのために最初のものを一時停止しなければならない...そして私はこれを行う方法を知らない。 – yann9

関連する問題