-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);
}
}
请在这里分享您的代码 – Sachith
我已添加上面的代码 – mng