Первый вопрос stackoverflow!Я искал ... обещаю.Я не нашел никаких ответов на мое затруднительное положение.У меня ... серьезно обостряющаяся проблема, если не сказать больше.Короче говоря, я разрабатываю инфраструктуру для игры, в которой мобильные приложения (приложение для Android и приложение для iOS) взаимодействуют с сервером с помощью сокетов для отправки данных в базу данных.Скрипт внутреннего сервера (который я называю BES или Back End Server) имеет длину в несколько тысяч строк кода.По сути, у него есть основной метод, который принимает входящие подключения к сокету и разветвляет их, а также метод, который считывает входные данные из сокета и определяет, что с ним делать.Большая часть кода заключается в методах, которые отправляют и получают данные из базы данных и отправляют их обратно в мобильные приложения.Все они работают нормально, за исключением нового метода, который я добавил.Этот метод получает большой объем данных из базы данных, кодирует их как объект JSON и отправляет обратно в мобильное приложение, которое также декодирует его из объекта JSON и выполняет то, что ему нужно.Моя проблема в том, что эти данные очень велики, и большую часть времени не проходят через сокет за одну запись данных.Таким образом, я добавил одну дополнительную запись данных в сокет, который сообщает приложению о размере объекта JSON, который он собирается получить.Однако после этой записи при следующей записи в мобильное приложение отправляются пустые данные.
Странно то, что при удалении первой записи, которая отправляет размер объекта JSON, происходит фактическая отправка JSON.Объект работает нормально.Это просто очень ненадежно, и я должен надеяться, что это отправит все в одном чтении.Чтобы добавить еще больше странности в ситуацию, когда я делаю размер данных, которые вторая запись отправляет огромное число, приложение iOS будет читать его правильно, но оно будет иметь данные в середине в противном случае пустого массива.
Что в мире происходит?Любое понимание очень ценится!Ниже приведен лишь базовый фрагмент моих двух команд записи на стороне сервера.
Имейте в виду, что ВСЕГДА в этом сценарии нормально работают операции чтения и записи, но это единственное место, где я выполняю 2 операции записи.спина к спине.
Серверный скрипт находится на сервере Ubuntu в нативном C с использованием сокетов Беркли, а 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, считывает данные до той длины, которую они получают от первого вызова write.Поэтому, если я скажу ему прочитать, скажем, 10000 байт, он создаст объект NSData такого размера и будет использовать его в качестве буфера при чтении из сокета.
Любая помощь очень, С благодарностью приветствуется.Спасибо всем заранее!