2016-11-29 272 views
-5

我有如下数据的几个数据包,多线程处理

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 

我要读由字节的每个数据包的字节,并存储NODE_ID(粗体的值)和X值(correcsponds至字节9和字节10 & 11)。

我需要编写一个代码,其中,我需要检测特定node_id的x值检测更改,如果该更改符合我的标准,则需要生成声音。

我有两个不同的node_id,4和7 ,所以我需要单独捕获节点4和节点7的X值,并检测值的变化。

  • 我所做的: 读取数据包,如果node_id为4,则调用thread1并运行。 如果node_id是7,则调用thread2并运行。

线程正在逐个处理所有数据包,而不是基于node_id的。

如何编写代码以便单独使用线程处理数据包?

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

我想你需要一些模块(你可能已经有一些了)。

  1. 读分组
  2. 检测节点ID(与寻找模式)和发送该分组到合适的线程。
  3. 处理与数据包传送

总之,你需要三个线程。

其中一个,我称之为主线程,在上面的列表中管理1,2,另外两个处理对应于节点ID的分组。

所以你需要两种不同类型的线程。 主线程和处理线程。