Java 让JSON字符串跨越多个套接字接收()
现在我可以通过网络向我的Android应用程序发送JSON字符串了。唯一的问题是,目前消息长度不超过几百个字符。这将很快扩展到每个JSON字符串数千个字符。在将JSON字符串发送到解析器(否则会崩溃)之前,如何确保已收到整个JSON字符串 例如,我在线程中接收数据的基本方式:Java 让JSON字符串跨越多个套接字接收(),java,android,json,sockets,Java,Android,Json,Sockets,现在我可以通过网络向我的Android应用程序发送JSON字符串了。唯一的问题是,目前消息长度不超过几百个字符。这将很快扩展到每个JSON字符串数千个字符。在将JSON字符串发送到解析器(否则会崩溃)之前,如何确保已收到整个JSON字符串 例如,我在线程中接收数据的基本方式: while (true) { try { // Read from the DataInputStream bytes = mmDataIn.read(buffer);
while (true)
{
try
{
// Read from the DataInputStream
bytes = mmDataIn.read(buffer); //buffer is a 4096 size byte[]
Log.d("JSON", "dataread: " + String.valueOf(bytes)); //only prints stuff > 0
parseJSON(buffer); //will not work unless full JSON
}
catch (IOException e)
{
Log.e("JSON", "disconnected", e);
break;
}
}
我计划使用StringBuilder来拼凑JSON字符串,但我不知道如何判断何时完成
我在读这篇文章:
但是,对于JSON字符串,最好的方法是什么呢?我假设这是很常见的,并且有一个标准的处理方法。谢谢。如果您收到的数据超过了缓冲区的容量,您必须选择一个更大的缓冲区,或者重复将输入流读取到缓冲区中,并连接生成的json,然后再将其传递到parseJSON方法中 对于任何InputStream,如果read返回-1,则表示已到达输入流的末尾,因此这也适用于DataInputStream 干杯,
Tom如果接收到的数据超过了缓冲区的容量,则必须选择一个更大的缓冲区,或者重复将输入流读取到缓冲区中,并连接生成的json,然后再将其传递到parseJSON方法中 对于任何InputStream,如果read返回-1,则表示已到达输入流的末尾,因此这也适用于DataInputStream 干杯,
汤姆那就把我的缓冲区设成65536这样一个可笑的尺寸吧?宁愿使用StringBuilder方法,但read永远不会返回-1。read方法返回(javadoc)“读取到缓冲区的总字节数,如果由于到达流的结尾而没有更多数据,则返回-1。”因此,如果它一直返回>-1,则表示它还没有完成。或者您的意思是,对读取块的调用会阻塞,并且根本不会返回任何内容?是的,对读取块的调用。我在一个单独的线程中运行它来避免这种情况,但是它不能帮助它返回-1。我不确定我能在这里跟随你。我不知道在一个单独的线程中运行它如何避免阻塞调用:它仍然会阻塞,对吗?如果它阻塞,您将无法获得json。我想说的是,问题在于它阻碍了。这意味着远程服务器不再发送任何数据(因为整个json都已发送?),但它尚未关闭连接,因此您的客户机不知道所有数据都已接收,只是一直等待更多数据到达。但我也注意到你抓住了一个例外。它是在你的情况下抛出的吗?抱歉,它不能避免实际的阻塞,但它允许我的应用程序同时正常运行,因为只有网络线程被阻塞。此应用程序持续下载JSON数据,因此只有当用户断开与服务器的连接时,连接才会关闭。我认为我能做的唯一解决办法是在发送任何数据包之前尝试发送长度。不太理想,但我看不到Android上有多少非阻塞套接字。所以就把我的缓冲区设置成一个可笑的大小,比如65536?宁愿使用StringBuilder方法,但read永远不会返回-1。read方法返回(javadoc)“读取到缓冲区的总字节数,如果由于到达流的结尾而没有更多数据,则返回-1。”因此,如果它一直返回>-1,则表示它还没有完成。或者您的意思是,对读取块的调用会阻塞,并且根本不会返回任何内容?是的,对读取块的调用。我在一个单独的线程中运行它来避免这种情况,但是它不能帮助它返回-1。我不确定我能在这里跟随你。我不知道在一个单独的线程中运行它如何避免阻塞调用:它仍然会阻塞,对吗?如果它阻塞,您将无法获得json。我想说的是,问题在于它阻碍了。这意味着远程服务器不再发送任何数据(因为整个json都已发送?),但它尚未关闭连接,因此您的客户机不知道所有数据都已接收,只是一直等待更多数据到达。但我也注意到你抓住了一个例外。它是在你的情况下抛出的吗?抱歉,它不能避免实际的阻塞,但它允许我的应用程序同时正常运行,因为只有网络线程被阻塞。此应用程序持续下载JSON数据,因此只有当用户断开与服务器的连接时,连接才会关闭。我认为我能做的唯一解决办法是在发送任何数据包之前尝试发送长度。不太理想,但我看不到Android上有多少非阻塞套接字。肯定有JSON解析器API接受InputStream参数?肯定有JSON解析器API接受InputStream参数?