【问题标题】:Infinite nulls received from readLine() method从 readLine() 方法接收到的无限空值
【发布时间】:2015-03-23 12:53:08
【问题描述】:

我制作了一个将加速度计坐标发送到我的电脑的应用程序。android端客户端的代码是:

public class MainActivity extends Activity implements SensorEventListener{
private SensorManager senSensorManager;
private Sensor senAccelerometer;
private long lastUpdate = 0;
float x ;
float y ;
float z;
TextView xt,yt,zt;
String st="left";
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    senSensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);
    senAccelerometer = senSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
    senSensorManager.registerListener(this,senAccelerometer,SensorManager.SENSOR_DELAY_NORMAL);
    xt= (TextView) findViewById(R.id.xc);
    yt= (TextView) findViewById(R.id.yc);
    zt= (TextView) findViewById(R.id.zc);
    new SendMsg().execute();
}

public void onSensorChanged(SensorEvent sensorEvent) {
    Sensor mySensor = sensorEvent.sensor;

    if (mySensor.getType() == Sensor.TYPE_ACCELEROMETER) {
      x = sensorEvent.values[0];
      y = sensorEvent.values[1];
      z = sensorEvent.values[2];
        long curTime = System.currentTimeMillis();

        if ((curTime - lastUpdate) > 100) {
            long diffTime = (curTime - lastUpdate);
            lastUpdate = curTime;
            xt.setText(String.valueOf(x));
            yt.setText(String.valueOf(y));
            zt.setText(String.valueOf(z));

         }
    }
}


public void onAccuracyChanged(Sensor sensor, int accuracy) {

}
protected void onPause() {
    super.onPause();
    senSensorManager.unregisterListener( this);
}
protected void onResume() {
    super.onResume();
    senSensorManager.registerListener( this, senAccelerometer, SensorManager.SENSOR_DELAY_NORMAL);
}

private class SendMsg extends AsyncTask<String, Void, String> {
    Socket s= null;
    OutputStream os;
    PrintWriter pw;
    @Override
    protected String doInBackground(String... params) {

        try {
            s = new Socket("192.168.0.102",2345);
            os=s.getOutputStream();
            pw=new PrintWriter(os);
            while(true){
                pw.println(x+" "+y+" "+z);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
        return "executed";
    }
    protected void onPostExecute(String result) {

    }
}

而pc端服务器代码为:

public static void main(String[] args) throws IOException, AWTException {
    ServerSocket ss = new ServerSocket(2345);
    Socket s = ss.accept();
    InputStream is = s.getInputStream();
    InputStreamReader isr = new InputStreamReader(is);
    BufferedReader br = new BufferedReader(isr);
    System.out.println("message received from server is :");
    for (;;) {
        String ms = br.readLine();
        System.out.println("" + ms);

    }

}

似乎应用程序正在发送 NULL 而不是发送加速度计坐标,并且相同的内容正在服务器端打印。

尽管很努力,但我还是无法弄清楚问题所在。

【问题讨论】:

  • 您是否尝试过使用“log.d”语句来查看您得到了什么?放入 pw.println 语句旁边。

标签: java android sockets tcp client-server


【解决方案1】:

你错了。 TCP 不能“发送空值”。 readline() 方法返回 null, * 而不是你接收 数据。

原因很简单,readLine() 在流结束时返回 null,而您没有检查它。这在 Javadoc 中有明确说明。当它返回 null 时,对等方已关闭连接,因此您必须停止读取并通常关闭套接字。通常的写法是:

while ((line = br.readLine()) != null)
{
    // ...
}

【讨论】:

  • 什么?当然,您不会期待 Google 系统调用的海报或阅读手册页吗?
猜你喜欢
  • 2021-08-12
  • 2019-01-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-05-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多