2016-11-29 6 views
-5

Iは以下のようにデータのいくつかのパケットを持っている、私はバイトにより各パケットのバイトを読み取り、バイト9にcorrecsponds NODE_ID(太字の値)とX値を(格納する必要がマルチスレッド処理

00 FF FF 00 00 08 00 64 00 **07** 08 FC 09 90 07 09 

00 FF FF 00 00 08 00 64 00 **04** 08 0B 07 E3 0A 0B 

00 FF FF 00 00 08 00 64 00 **07** 09 25 09 C0 0B C7 

00 FF FF 00 00 08 00 64 00 **04** 08 13 07 E3 0A 0B 

00 FF FF 00 00 08 00 64 00 **07** 09 2E 09 C1 0B C6 

00 FF FF 00 00 08 00 64 00 04 **08** 13 07 E3 0A 07 

バイト10 & 11)。

特定のnode_idのx値の変化を検出する必要があるコードを記述する必要があります。その変更が条件に一致する場合、サウンドを生成する必要があります。

私は2つの異なるnode_id、4と7を持っていますので、ノード4とノード7のX値を別々にキャプチャして値の変化を検出する必要があります。

  • 私が行ったこと: パケットを読み取り、node_idが4の場合はthread1を呼び出して実行してください。 node_idが7の場合は、thread2を呼び出して実行します。

スレッドはnode_idに基づいてすべてのパケットを1つずつ処理しています。

スレッドを使用してパケットを別々に処理するようにコーディングする方法はありますか?

import java.io.*; 
import java.nio.*; 
import java.net.*; 
import org.jfugue.pattern.Pattern; 
import org.jfugue.player.Player; 
import java.lang.*; 
import java.util.Arrays; 
import java.lang.String; 
import java.util.concurrent.Executor; 
import java.util.concurrent.Executors; 

class RunnableDemo implements Runnable { 
    public boolean running = false; 
    private Thread t; 
    private String threadName; 
    private int x_val; 
    private int nodeid; 
    private static final int UNIQUE_INDEX_COUNT = 10; 
    private static int[] xValChangeInfo = new int[UNIQUE_INDEX_COUNT]; 
    static int indexCount = 0; 
    static int[] nodeidarr = new int[UNIQUE_INDEX_COUNT]; 
    static int nodearrCount =0; 
    static int state=0; 


    RunnableDemo(String name, int x_value,int node_id) 
    { 
     threadName = name; 
     this.x_val = x_value; 
     nodeid=node_id; 

    } 

    public void run() 
    {   
     System.out.println("Running Thread = "+threadName);  
     //System.out.printf("***************************"); 
     System.out.println("x_val = "+x_val); 
     System.out.printf("***************************"); 
     checkForUniqueValue(x_val, threadName); 

    } 

    public void start() 
    { 
     //System.out.println("Starting " + threadName); 
     if (t == null) 
    { 
      t = new Thread (this, threadName); 
    // System.out.println("Starting 1111" + threadName); 
      t.start(); 
     } 
    } 

    public static int roundingOffXValue(int xValue) 
    { 
     int quotientx = 0; 
     int dividend = xValue; 
     int divisor = 10; 
     for(int j=0; j<=1; j++) 
     {  
      quotientx = dividend/divisor; 
      dividend = quotientx * 10; 
      divisor = divisor * 10; 
     } 
     quotientx = quotientx *100; 
     //System.out.println("x:" +quotientx); 
     return quotientx; 
    } 

    public static void checkBoundForTone(int[] xValChangeInfo, String TName) 
    { 
     // TODO Make sure not to modify xValChangeInfo 
     Player player = new Player(); 
     Pattern pattern_xup = new Pattern("C"); 
     if(indexCount == UNIQUE_INDEX_COUNT) 
     { 
      resetArray(xValChangeInfo); 
      return; 
     } 
     int a = 0; 
     int b = 0; 
     for(int i = 1; i < indexCount; i++) 
     { 
      if(xValChangeInfo[i-1] < xValChangeInfo[i]) 
      { 
       a = a+Math.abs(xValChangeInfo[i-1] - xValChangeInfo[i]); 
      } 

      if (a > 300) 
      { 
       if(xValChangeInfo[i-1] > xValChangeInfo[i]) 
       { 
        b=b+Math.abs(xValChangeInfo[i-1] - xValChangeInfo[i]); 

       } 
       if(b>300) 
       { 
        resetArray(xValChangeInfo); 
        System.out.println("node_id: " +TName); 
        //System.out.printf("%d ",node_id); 
        System.out.println(""); 
        System.out.printf("a : %d b : %d",a, b); 
        System.out.println(""); 
        player.play(pattern_xup); 
       } 
      } 

     } 

    } 

    public static void resetArray(int[] xValChangeInfo) 
    { 
     indexCount = 0; 

    } 
    public static void resetNodeArray(int[] xValChangeInfo) 
    { 
     nodearrCount = 0; 

    } 
    public static void checkForUniqueValue(int xValue, String TName) 
    { 
     int xValue_rounded = roundingOffXValue(xValue); 

     if(indexCount == 0 && (xValChangeInfo[indexCount] != xValue_rounded)) 
     { 
      xValChangeInfo[indexCount] = xValue_rounded; 
      indexCount++; 
     } 
     else if (indexCount != 0 &&(xValChangeInfo[indexCount-1] != xValue_rounded)) 
     { 
      xValChangeInfo[indexCount] = xValue_rounded; 
      indexCount++; 
      checkBoundForTone(xValChangeInfo, TName); 
     } 
     //System.out.println("checkForUniqueValue"); 
     for (int i = 0; i < indexCount; i++) 
     { 
//   System.out.println(""); 
      System.out.println("..........."); 
      System.out.printf("%d ",xValChangeInfo[i]); 
     } 
    } 
} 



class ParseClient 
{ 
    private static final int MIN_XVALUE = 1700; 
    private static final int MAX_XVALUE = 2400; 
    private static final int UNIQUE_INDEX_COUNT = 10; 
    //static int[] xValChangeInfo = new int[UNIQUE_INDEX_COUNT]; 
    //static int indexCount = 0; 
    static int[] nodeidarr = new int[UNIQUE_INDEX_COUNT]; 
    static int nodearrCount =0; 
    static int node_id; 
    public static void main(String args[]) throws Exception 
    { 
     Socket clientSocket = new Socket("sowmya-Lenovo-ideapad-500-15ACZ",6789); 
     DataOutputStream outToServer = new DataOutputStream(clientSocket.getOutputStream()); 
     DataInputStream dataInput = new DataInputStream(clientSocket.getInputStream()); 
     //RunnableDemo R1 = new RunnableDemo("Thread-1"); 
     while(true) 
     { 
      readPacket(dataInput); 

     } 
    } 


    public static void checkforuniquenodes(int nodeid,int xvalue) 
    { 
     int x_val=xvalue; 
     if(nodearrCount ==0) 
     { 
      nodeidarr[nodearrCount]=nodeid; 
      nodearrCount++; 
      RunnableDemo R1 = new RunnableDemo("R"+nodeid, xvalue,nodeid); 
      R1.start(); 
     } 
     else 
     { 
      for (int i=0; i<nodearrCount; i++) 
      { 
       if (nodeidarr[i] == nodeid) 
       { 
        RunnableDemo R1 = new RunnableDemo("R"+nodeid, xvalue, nodeid); 
          R1.start(); 
       } 
       else 
       { 
       nodeidarr[i+1]=nodeid; 
       RunnableDemo R2 = new RunnableDemo("R"+nodeid, xvalue,nodeid); 
       R2.start(); 
       } 
      } 

     }  

     } 

    public static void readPacket(DataInputStream dataInput) 
    { 
     Byte pkt_byte=0; 
     int t = 0; 
     int X1 = 0, X2 = 0; 
     int x_val = 0; 
     for (int byte_index = 0; byte_index <= 15; byte_index++)  
     { 
      try 
      { 
       pkt_byte = dataInput.readByte(); 
      } 
      catch (IOException e) 
      { 
       // Do something here  
      } 
      if(pkt_byte < 0) 
      { 
       t = pkt_byte & 0xFF; 
      } 
      else 
      { 
       t = pkt_byte.intValue(); 
      } 
      if(byte_index == 9) 
      { 
       node_id = t; 
      } 

      if(byte_index == 10) 
      { 
       X1 = t << 8; 
      } 
      else if (byte_index == 11) 
      { 
       X2 = t; 
       x_val = X1+X2; 
      } 
     } 

     checkforuniquenodes(node_id, x_val); 

    } 
} 
+0

ここにあなたのコードを共有してください – Sachith

+0

私は上記のコードを追加しました – mng

答えて

-2

私はいくつかのモジュールが必要だと思います。パケット

  • (見つけるパターンを有する)ノードIDを検出し、適切なスレッドにパケットを送信する読み取り

    1. パケットによる処理は、結論として

    を届け、あなたは3つのスレッドを必要としています。

    メインスレッドと呼ばれるものは、上記のリストの1,2を管理します。 他の2つはノードIDに対応するパケットを処理します。

    したがって、2種類のスレッドが必要です。 メインスレッドと処理スレッド。

  • 関連する問題