发送浮点数据到我的客户端应用程序

问题描述 投票:-1回答:3

我写了一篇文章的服务器代码在C和我愿不断将数据发送到我的客户端应用程序的每个迭代。

while (1)
{
    startInt = mymillis();//capture starting time

    Sensor_raw_data_float = Sensor_Read_Values_();
    float data = Sensor_raw_data_float.x * 0.007;

    send(sockfd, &data , sizeof(float),0);//Send to client

    //Wait until 5ms
    while (mymillis() - startInt < (5))
    {
        usleep(100);
    }

}

我试着用“snprintf的”发送前到我的浮点数据转换为字符串,但我意识到,整个系统开始放慢脚步,落后很多。

因此我试图做客户端的代码编辑。连接是关系到什么,我试图做我的客户端代码的主要部分

    import android.os.Bundle;
    import android.os.Handler;
    import android.os.Message;
    import android.support.v7.app.AppCompatActivity;
    import android.view.View;
    import android.widget.Button;
    import android.widget.EditText;
    import android.widget.TextView;

public class MainActivity extends AppCompatActivity {

EditText editTextAddress, editTextPort, editTextMsg;
Button buttonConnect, buttonDisconnect, buttonSend;
TextView textViewState, textViewRx;

ClientHandler clientHandler;
ClientThread clientThread;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

textViewRx = (TextView) findViewById(R.id.received);

    clientHandler = new ClientHandler(this);
}

private void updateState(String state){
    textViewState.setText(state);
}

private void updateRxMsg(String rxmsg){
    textViewRx.append(rxmsg + "\n");

}


public static class ClientHandler extends Handler {
    public static final int UPDATE_STATE = 0;
    public static final int UPDATE_MSG = 1;
    public static final int UPDATE_END = 2;
    private MainActivity parent;

    public ClientHandler(MainActivity parent) {
        super();
        this.parent = parent;
    }

    @Override
    public void handleMessage(Message msg) {

        switch (msg.what){
            case UPDATE_STATE:
                parent.updateState((String)msg.obj);
                break;
            case UPDATE_MSG:
                parent.updateRxMsg((String)msg.obj);
                break;
            case UPDATE_END:
                parent.clientEnd();
                break;
            default:
                super.handleMessage(msg);
        }

    }

}

}

我试图编辑我updateRxMsg(字符串rxmsg)的代码

 private void updateRxMsg(String rxmsg){
    private void updateRxMsg(String rxmsg){
    //textViewRx.append(rxmsg + "\n");
    float f = Float.parseFloat(rxmsg);
    String mytext=Float.toString(f);
    textViewRx.append(mytext + "\n");
}

}

但我仍然得到垃圾在我的TextView打印出来。我无法弄清楚是什么问题,但我怀疑它是与编码。我想获得关于如何从我的服务器,让我的浮点数据到我的客户端的一些帮助。

更新:将是我bufferreader等代码,起初我认为问题不在于这里,但我将它张贴在这里了。

public class ClientThread extends Thread{

String dstAddress;
int dstPort;
private boolean running;
MainActivity.ClientHandler handler;

Socket socket;
PrintWriter printWriter=null;
BufferedReader bufferedReader;

public ClientThread(String addr, int port, MainActivity.ClientHandler handler) {
    super();
    dstAddress = addr;
    dstPort = port;
    this.handler = handler;
    StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder()
            .permitAll().build();
    StrictMode.setThreadPolicy(policy);
}

public void setRunning(boolean running){
    this.running = running;
}

private void sendState(String state){
    handler.sendMessage(
            Message.obtain(handler,
                    MainActivity.ClientHandler.UPDATE_STATE, state));
}

public void txMsg(String msgToSend){
    if(printWriter != null){
        printWriter.println(msgToSend);
    }
}

@Override
public void run() {
    sendState("connecting...");

    running = true;

    try {
        socket = new Socket(dstAddress, dstPort);
        sendState("connected");

        OutputStream outputStream = socket.getOutputStream();
        printWriter = new PrintWriter(outputStream, true);

        InputStream inputStream = socket.getInputStream();
        InputStreamReader inputStreamReader =
                new InputStreamReader(inputStream);
        bufferedReader = new BufferedReader(inputStreamReader);

        while(running){

            //bufferedReader block the code
            String line = bufferedReader.readLine();
            if(line != null){
                handler.sendMessage(
                        Message.obtain(handler,
                                MainActivity.ClientHandler.UPDATE_MSG, line));
            }

        }

    } catch (IOException e) {
        e.printStackTrace();
    } finally {
        if(bufferedReader != null){
            try {
                bufferedReader.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }

        if(printWriter != null){
            printWriter.close();
        }

        if(socket != null){
            try {
                socket.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

    handler.sendEmptyMessage(MainActivity.ClientHandler.UPDATE_END);
}

}

我更新了我的代码:

import android.os.Message;
import android.os.StrictMode;

import java.io.BufferedInputStream;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.net.Socket;
import java.nio.ByteBuffer;

公共类ClientThread继承Thread {

String dstAddress;
int dstPort;
private boolean running;
MainActivity.ClientHandler handler;

Socket socket;
PrintWriter printWriter=null;
BufferedReader bufferedReader;

public ClientThread(String addr, int port, MainActivity.ClientHandler handler) {
    super();
    dstAddress = addr;
    dstPort = port;
    this.handler = handler;
    StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder()
            .permitAll().build();
    StrictMode.setThreadPolicy(policy);
}

public void setRunning(boolean running){
    this.running = running;
}

private void sendState(String state){
    handler.sendMessage(
            Message.obtain(handler,
                    MainActivity.ClientHandler.UPDATE_STATE, state));
}

public void txMsg(String msgToSend){
    if(printWriter != null){
        printWriter.println(msgToSend);
    }
}

@Override
public void run() {
    sendState("connecting...");

    running = true;

    try {
        socket = new Socket(dstAddress, dstPort);
        sendState("connected");

        OutputStream outputStream = socket.getOutputStream();
        printWriter = new PrintWriter(outputStream, true);

        InputStream inputStream = socket.getInputStream();
        InputStreamReader inputStreamReader =
                new InputStreamReader(inputStream);
        bufferedReader = new BufferedReader(inputStreamReader);

        int bufferSize = 8192;

        ByteBuffer bf = ByteBuffer.allocate(bufferSize);
            BufferedInputStream inFromServer = new BufferedInputStream(socket.getInputStream());
            while (true) {
                int b = inFromServer.read();
                if (b == -1) {
                    break;
                }
                bf.put( (byte) b);

                handler.sendMessage(
                        Message.obtain(handler,
                                MainActivity.ClientHandler.UPDATE_MSG, (byte) b));
            }

       // while(running){

            //bufferedReader block the code
        //    String line = bufferedReader.readLine();
       //     if(line != null){
       //         handler.sendMessage(
       //                 Message.obtain(handler,
       //                         MainActivity.ClientHandler.UPDATE_MSG, line));
      //      }

      //  }

    } catch (IOException e) {
        e.printStackTrace();
    } finally {
        if(bufferedReader != null){
            try {
                bufferedReader.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }

        if(printWriter != null){
            printWriter.close();
        }

        if(socket != null){
            try {
                socket.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

    handler.sendEmptyMessage(MainActivity.ClientHandler.UPDATE_END);
}

}

我很迷惑什么应该序改变ByteBuffer的工作,是不确定的,如果我正确地改变了它。谢谢!

java c sockets floating-point
3个回答
1
投票

让你的心。

如果你直接发送float,按照您发布的代码,用DataInputStream.readFloat()阅读。如果你是幸运的,字节顺序是一样的,你就大功告成了。

或将其转换为字符串,将其作为一条线,它读成一条线,并解析回float

不是两者的混合物。


0
投票

当发送浮子作为二进制数据,字节,我假设msg.obj实际上是一个字节数组。当浮子从Intel小端平台发送的4个字节,下面的代码应该工作。

       case UPDATE_MSG:
            byte[] flt = (byte[])msg.obj;
            if (flt.length != 4) {
                throw new IllegalStateException();
            }
            float x = ByteBuffer.wrap(flt)
                .order(ByteOrder.LITTLE_ENDIAN)
                .getFloat();
            break;

当你没有得到一个ClassCastException我还是有些怀疑。然而二进制数据不能由字符串,使用内部的Unicode,为UTF-16,其可能会破坏二进制数据被保持。


0
投票

作为一种解决办法,我建议你试试(10只繁衍到你想拥有的精密的功率)的浮点数转换成整数发送之前,看看你会得到什么样的数据。这可以帮助你缩小问题。如果你真的坚持使用浮点数你可能要参考这个问题:How are floating point numbers are stored in memory?

© www.soinside.com 2019 - 2024. All rights reserved.