問題描述:
app與上位機來回發送資料。同一局域網下的TCP的socket通信。(上位機的代碼流程功能等均沒有問題,是標準的。)
現在在某一個環節,app發出一個資料包后,上位機就會給應答,但是在app端收到為null(日志說是Attempt to read from null array)也就無法根據命令進行下一步操作,我用網路除錯助手代替上位機時,看到app沒收到后人工再發一次應答,就能收到了。但是上位機不可能重復發兩次。想請教各位大神這是什么問題,如何解決。。。困擾很久了。有想法者歡迎聯系 qq:1206814310
/***
* 獲取資料執行緒
*/
public Runnable runnable = new Runnable() {
@Override
public void run() {
try {
while (true) {
if (socket.isConnected()) {
if (!socket.isInputShutdown()) {
data = new byte[527];//資料最長527
int len;
if ((len = in.read(data)) != -1) {//獲取輸入流資料
INDATA = new byte[len];
System.arraycopy(data, 0, INDATA, 0, len);
wl.writeLog("接受到資料"+bytesToHexString(INDATA));
retra=0; //收到資料后:不需要重傳
sharedPreferences = null;
sharedPreferences = getSharedPreferences("msbDATA", Context.MODE_PRIVATE);
sKey = AES.getsKey(sharedPreferences, ID);
DataAnalysis dataanalysis = new DataAnalysis();
byte[] IN_CMD_DATA = dataanalysis.inDataDivide(INDATA, sKey);
wl.writeLog(dataanalysis.getResult());
wl.writeLog("命令字與資料"+bytesToHexString(IN_CMD_DATA));
result = dataanalysis.getResult();
switch (IN_CMD_DATA[0]) {
case 0x0F:。。。
case 0x8F:。。。
default:
break;
}
}
}
} else {
// initSocket();
}
}
} catch (Exception e) {
Log.d("MainActivity", "結束計時 接受執行緒例外catch");
e.printStackTrace();
}
}
};
/**
* 發送資料
*/
public void sendData(){
try {
if (in != null)
in.close();
if (out != null)
out.close();
if (socket != null)
socket.close();
socket = null;
out = null;
in = null;
socket = new Socket(HOST, PORT);
in = socket.getInputStream();
out = socket.getOutputStream();
Message msg = scHandler.obtainMessage();//啟動接收資料!!必須加不然第二次就接收不到了。。。
msg.what = 0;//這個就是啟動接受資料執行緒
scHandler.sendMessage(msg);
} catch (IOException ex) {
Log.d("MainActivity", "結束計時 sendData里面新建socket例外catch");
ex.printStackTrace();
}
if (socket != null) {
if (socket.isConnected()) {
if (!socket.isOutputShutdown()) {
getData();//呼叫 獲取everydata
OUTDATA = DataProcessing.outDataCombination(START, TYPE, ID, CTRL, L, CMD_DATA, CS,END);
try {
out.write(OUTDATA);//發送界面資料
} catch (IOException e) {
Log.d("MainActivity", "結束計時 發送資料write例外catch");
e.printStackTrace();
}
}
}
}
}
這個是發送和接受資料的相關代碼。
求各路大神急救!萬分感謝!
uj5u.com熱心網友回復:
發送資料是主執行緒還是子執行緒?有沒有例外拋出?
建議debug步進查看
uj5u.com熱心網友回復:
發送資料是主執行緒。by the way 問題已經解決uj5u.com熱心網友回復:
那就by the way解決方法,然后無滿意結貼uj5u.com熱心網友回復:
你在胡說啥呢?轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/97094.html
標籤:Android
