我可以接收更多的字节在一次传输从这个c#到android设备

本文关键字:传输 一次 设备 android 字节 我可以 | 更新日期: 2023-09-27 17:52:43

我正在尝试通过蓝牙传输长字符串(2286字节)。我有一个关于通过蓝牙接收长json字符串的问题。这不是问题,因为它正在接收,而是它接收的方式。我想知道是否有可能在一次传输中接收更多字节,或者它只是一个限制。

好的,那么在c#方面…这是服务器循环…

 _screenWriterCallBT("Bluetooth Server started, waiting for clients..");
        BluetoothListener blueListener = new BluetoothListener(mUUID);
        blueListener.Start();
        BluetoothClient conn = blueListener.AcceptBluetoothClient();
        _screenWriterCallBT("Bluetooth Client has connected");
        Stream mStream = conn.GetStream();
        while (true)
        {
            try
            {
                byte[] recieved = new byte[1024];
                mStream.Read(recieved, 0, recieved.Length);
                string content = Encoding.ASCII.GetString(recieved);
                _screenWriterCallBT("Recieved: " + content + "via bluetooth");
                ParseJson parseJson = new ParseJson();
                JsonReturn = parseJson.InitialParsing(content); //parse message
                byte[] sent = Encoding.ASCII.GetBytes(JsonReturn);
                mStream.Write(sent, 0, sent.Length);
                _screenWriterCallBT("Test" + sent.Length);
                string messageSent = Encoding.ASCII.GetString(sent);
                _screenWriterCallBT("sent via Bluetooth: " + messageSent);
            }
            catch (IOException exception)
            {
                _screenWriterCallBT("Bluetooth Client has disconnected. Exception:" + exception + "'n");
            }
        }

它似乎有效。

_screenWriterCallBT("Test" + sent.Length); // says 2286 bytes on the long string i'm trying to send.

在Android端,我也有一个服务器监听和发送:

 public void run() {
    byte[] buffer; 
    int bytes;
    while (true) {
        try {
            buffer = new byte[1024];
            // Read from the InputStream
            bytes = mmInStream.read(buffer);
            System.out.println(bytes);
            if(bytes != 0)
                listener.messageReceivedFromServer(MESSAGE_READ, bytes, -1, buffer);
        } catch (IOException e) {
            break;
        }
    }
}

它工作,并接收字节,但它以一种奇怪的方式接收它们。

System.out.println(bytes); prints 1010, 1010, 266

所以,基本上我每次都得到一个截断的json字符串我不能把它变成json对象。我有一个想法,当收到消息时,它将其写入一个临时字符串,并测试它是否是一个有效的json对象,然后继续进行,直到它有效。无论如何,我想我应该来看看是否有任何堆栈溢出大师可以照亮任何光,如果我做错了什么,或者可以改变什么?

干杯本

我可以接收更多的字节在一次传输从这个c#到android设备

您需要读取直到接收到所有数据,您只从流中读取一次,因此最终只读取部分数据。你在while(true)循环中部分地这样做,但是你不知道什么时候你有一个完整的数据传输,就像你发现的那样。

从c#的角度来看,这里有一个需要的说明:

var sb = new StringBuilder();
while(mStream.DataAvailable())
{
    byte[] received = new byte[1024];
    mStream.Read(received, 0, received.Length);
    sb.Append(Encoding.ASCII.GetString(received));
}
var receivedString = sb.ToString();
_screenWriterCallBT("Received: " + receivedString + "via bluetooth");
ParseJson parseJson = new ParseJson();
JsonReturn = parseJson.InitialParsing(receivedString); //parse message

android端也一样。