我可以在从这个 c# 到 android 设备的一次传输中接收更多字节吗?
Can I receive more bytes in one transfer from this c# to android device?
我正在尝试通过蓝牙传输一个长字符串(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 对象然后继续直到它有效。不管怎样,我想我会来检查是否有任何 Stack overflow 专家可以照亮我是否做错了什么或可以改变什么?
干杯
本
您需要读取直到接收到所有数据,您只从流中读取一次,因此最终得到部分数据。您在 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边做同样的事情。
我正在尝试通过蓝牙传输一个长字符串(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 对象然后继续直到它有效。不管怎样,我想我会来检查是否有任何 Stack overflow 专家可以照亮我是否做错了什么或可以改变什么?
干杯 本
您需要读取直到接收到所有数据,您只从流中读取一次,因此最终得到部分数据。您在 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边做同样的事情。