Handler 收到的字符串长度经常会少一个,我发的99个字节,经常只收到98个呢,请高手指点一下。

motingwei 2018-12-14 01:47:26
package com.example.control_air;

/
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.net.Socket;
import java.net.UnknownHostException;

import android.app.Activity;
import android.graphics.Color;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.text.Spannable;
import android.text.SpannableString;
import android.text.style.ForegroundColorSpan;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.CheckBox;
import android.widget.CompoundButton;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast;

public class MainActivity extends Activity {
Socket socket = null;// 开辟一个socket控件
Button enterbut = null;//
EditText IP = null;
EditText PORT = null;


EditText Aozero = null;// 温度
EditText Aofull = null;// 湿度

Button butLED1 = null;
Button butLED2 = null;

Button but3 = null;
Button but4 = null;

OutputStream outputstream;
InputStream in;

CheckBox TENcheck;
CheckBox ZEROcheck;
CheckBox FULLcheck;


TextView Btesttext=null;

EditText errortext = null;
EditText msglong = null;

TextView totaltext = null;
TextView TestHex=null;

boolean isConnected = false;
boolean led1data = false, led2data = false;

int a;
byte ledstatu=0;
Short b;
String xx;
byte butf[];
byte abutf[];
int errortimes=0,totaltimes=0;

static BufferedReader mBufferedReaderServer = null;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
enterbut = (Button) findViewById(R.id.conn);// 获取ID号

IP = (EditText) findViewById(R.id.editIp);
IP.setText("10.10.100.254");
//IP.setText("192.168.16.103");
PORT = (EditText) findViewById(R.id.editport);
PORT.setText("8899");

edttemp = (TextView) findViewById(R.id.edittemp);
edthumi = (TextView) findViewById(R.id.edithumi);
maxHW= (EditText)findViewById(R.id.MaxHW);

enterbut.setOnClickListener(new enterclick());
butLED1 = (Button) findViewById(R.id.BUTLED1);
butLED2 = (Button) findViewById(R.id.BUTLED2);
/*
* 发送数据按键
*/
/*public class sendzeroclick implements OnClickListener {

@Override
public void onClick(View arg0) {
// TODO Auto-generated method stub
if (socket != null) {
try {
OutputStream outputstream = socket.getOutputStream();
if (Aozero != null && Aozero.length()>0){

byte buf[] = new byte[5];// 开辟2个空间
buf[0] =1;
buf[1] =2;
buf[2] =3;
buf[3] =4;
buf[4] =5;
outputstream.write(buf);
outputstream.flush();
Toast.makeText(MainActivity.this, "数据发送成功!", 0).show();
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} // 连接输出流
} else
Toast.makeText(MainActivity.this, "WIFI连接错误,请检查!", 0).show();
}
}



Handler mHandler = new Handler() { // 等待socket连接成功
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
String a, LED1status, LED2status;
String b ,c ,d;
int xx=9;

//Thread.sleep(500);

switch (msg.what) {
case 0:// TCP断开连接
enterbut.setText("建立连接");
Toast.makeText(MainActivity.this, "服务器连接断开!", 0).show();
break;
case 1:// 表明TCP连接成功,可以进行数据交互了
enterbut.setText("断开连接");
Toast.makeText(MainActivity.this, "服务器连接成功!", 0).show();
new InputThread().start();// 开启接收线程
// edttemp.setText("456");
break;
case 2:// 有数据进来
String result = msg.getData().get("msg").toString();
TestHex.setText(String.valueOf(result.length()));
if (++totaltimes>100){
totaltimes=0;
}
TestHex.setText("数据包长度: "+ String.valueOf(result.length()));
totaltext.setText("通讯包数: "+ String.valueOf(totaltimes));
break;
}
}
};

/**************** 定义按键触发事件函数 *******************/
public class enterclick implements OnClickListener {

@Override
public void onClick(View arg0) {
if (!isConnected)// 没有连接上
new ClientThread().start();// 打开连接
else// 连接上,断开连接
{
if (socket != null) {
try {
socket.close();
socket = null;
isConnected = false;
// 得到一个消息对象,Message类是有Android操作系统提供
Message msg = mHandler.obtainMessage();
msg.what = 0;
mHandler.sendMessage(msg);
} catch (IOException e) {
e.printStackTrace();
}

}
}
}

}

// 开辟一个线程 ,线程不允许更新UI socket连接使用
public class ClientThread extends Thread {

public void run() {
try {
socket = new Socket(IP.getText().toString(),Integer.parseInt(PORT.getText().toString()));// 建立好连接之后,就可以进行数据通讯了
isConnected = true;
in = socket.getInputStream();
// 得到一个消息对象,Message类是有Android操作系统提供
Message msg = mHandler.obtainMessage();
msg.what = 1;
mHandler.sendMessage(msg);
} catch (UnknownHostException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}// 连接服务器
}
}

public class InputThread extends Thread {

public void run() {
while (true) {
if (socket != null) {

String datain = readFromInputStream(in);
try {
if (!datain.equals("")) {
Message msg = new Message();
msg.what = 2;
Bundle data = new Bundle();
data.putString("msg", datain);
msg.setData(data);
mHandler.sendMessage(msg);
}

} catch (Exception e) {
}

try {
Thread.sleep(200);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
}

public String readFromInputStream(InputStream in) {
int count = 0;
byte[] inDatas = null;
try {
while (count == 0) {
count = in.available();
}
inDatas = new byte[count];
in.read(inDatas);
return new String(inDatas, "gb2312");
} catch (Exception e) {
e.printStackTrace();
}
return null;
}

/******************************************
* @return
*/

@Override
public boolean onCreateOptionsMenu(Menu menu) {

getMenuInflater().inflate(R.menu.main, menu);
return true;
}



}
...全文
243 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
王能 2018-12-24
  • 打赏
  • 举报
回复
应该是你的Socket链接中断了,你可以写一段日志收集的代码,记住有错误先看日志、然后分析,分析不出来加log打断点
motingwei 2018-12-24
  • 打赏
  • 举报
回复
好的,非常感谢你,主要是初学者,有好些工具不太会用,另外我刚刚还发现我把这个程序安装到别的手机上时,只要一操作WIFI发送数据用这个outputstream,程序就自动退出来了,安装到我自己的手机上就不会退出,想请教一下这是什么原因呢?会不会是安卓手机版本问题呢?
王能 2018-12-24
  • 打赏
  • 举报
回复
这个应该没人帮你,主要的一点,你得学会分析:写log、看日志、打断点,不要遇见问题就百度、发帖,这是最笨的方法,只有自己都试过了实在不会才去查。首先你得确定你发送的一定是00个字符,所以在发送的前一行代码log出你得字节内容和字节数,然后确定你接收的字节内容和字节数,在接收转换之前打印出接收的字节内容和字节数
motingwei 2018-12-24
  • 打赏
  • 举报
回复
我是固定发送一组数共99个字符,每次都发一样的数,有时候能收到99个,有时候只能收到98个。
motingwei 2018-12-24
  • 打赏
  • 举报
回复
发送没问题,我用TCP测试软件检测过,另外一个软件接收到的长度就是对的。
王能 2018-12-14
  • 打赏
  • 举报
回复
是你收到的时候或就少了一个字节或者发送就发错了,不是handler的问题

80,351

社区成员

发帖
与我相关
我的任务
社区描述
移动平台 Android
androidandroid-studioandroidx 技术论坛(原bbs)
社区管理员
  • Android
  • yechaoa
  • 失落夏天
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧