第一个stackoverflow问题!我已经搜索过......我保证。我还没有找到任何答案来解决我的困境。我有一个……至少可以说是一个严重恶化的问题。长话短说,我正在为一款游戏开发基础架构,其中移动应用程序(Android 应用程序和 iOS 应用程序)使用套接字与服务器通信,将数据发送到数据库。后端服务器脚本(我称之为 BES 或后端服务器)有几千行代码。本质上,它有一个 main 方法接受到套接字的传入连接并将它们分叉,以及一个从套接字读取输入并确定如何处理它的方法。大多数代码位于从数据库发送和接收数据并将其发送回移动应用程序的方法中。除了我添加的最新方法外,它们都工作正常。此方法从数据库中抓取大量数据,将其编码为 JSON 对象,然后将其发送回移动应用程序,移动应用程序也会从 JSON 对象中对其进行解码并执行它需要执行的操作。我的问题是这个数据非常大,而且大多数时候不会在一次数据写入中通过套接字。因此,我在套接字中添加了一个额外的数据写入,通知应用程序它即将接收的 JSON 对象的大小。但是,在此写入发生后,下一次写入会将空数据发送到移动应用程序。我在套接字中添加了一个额外的数据写入,通知应用程序它即将接收的 JSON 对象的大小。但是,在此写入发生后,下一次写入会将空数据发送到移动应用程序。我在套接字中添加了一个额外的数据写入,通知应用程序它即将接收的 JSON 对象的大小。但是,在此写入发生后,下一次写入会将空数据发送到移动应用程序。
奇怪的是,当我删除发送 JSON 对象大小的第一个写入时,JSON 对象的实际发送工作正常。它非常不可靠,我必须希望它一口气发送所有内容。更奇怪的是,当我将第二次写入发送的数据的大小设置为一个巨大的数字时,iOS 应用程序会正确读取它,但它会将数据放在一个空数组的中间。
世界上到底发生了什么?非常感谢任何见解!下面只是我在服务器端的两个写命令的基本片段。
请记住,在此脚本中的其他任何地方,读取和写入都可以正常工作,但这是我背靠背执行 2 次写入操作的唯一地方。
服务器脚本位于使用 Berkeley 套接字的原生 C 语言的 Ubuntu 服务器上,而 iOS 使用称为 AsyncSocket 的包装类。
int n;
//outputMessage contains a string that tells the mobile app how long the next message
//(returnData) will be
n = write(sock, outputMessage, sizeof(outputMessage));
if(n < 0)
//error handling is here
//returnData is a JSON encoded string (well, char[] to be exact, this is native-C)
n = write(sock, returnData, sizeof(returnData));
if(n < 0)
//error handling is here
移动应用程序进行了两次读取调用,并且outputMessage
很好,但returnData
始终只是一堆空数据,除非我覆盖sizeof(returnData)
到一些非常大的数字,在这种情况下,iOS 将在其他空数据的中间接收数据对象(确切地说是 NSData 对象)。还需要注意的是,我在 iOS 端的 AsyncSocket 类中使用的方法读取数据的长度达到了它从第一次写入调用接收到的长度。因此,如果我告诉它读取,比如 10000 字节,它将创建一个该大小的 NSData 对象,并在从套接字读取时将其用作缓冲区。
非常感谢任何帮助。提前谢谢大家!