Я получаю заголовок пакета, сначала использую socket.readData (toLength: 5, withTimeout: -1, tag: 0), затем я вычисляю длину тела в делегате didRead и использую socket.readData (toLength: bodySize, withTimeout: - 1, тег: 0) для продолжения приема основного пакета после прочтения основного пакета я снова прочту 5 заголовок,
public func socket(_ sock: GCDAsyncSocket, didRead data: Data, withTag tag: Int) {
if ( (data.count < DATA_HEADER_LENGTH && tag == Scocket_Tag_Header) || data.count == 0 ) { return }
let type = data[0]
let aaaa = [UInt8](data)
print("type \(aaaa)")
if (type == S_H_RQ_TYPE) {
self.sendHeartPackage()
return;
}
if ( tag == Scocket_Tag_Header ) {
let bodyLen = self.getContentSize(bytes: data)
self.beginReadBody(length: bodyLen , tag: self.getBodyTag(headType: type))
return
}else if ( tag == Scocket_Tag_Message_Body ) {
self.progressMessage(data: data)
}else if ( tag == Scocket_Tag_Reply_Body ) {
self.progressReply(data: data)
}
self.beginReadHeader()
}
func beginReadHeader() {
self.readData(length: UInt(DATA_HEADER_LENGTH), timeout: -1, tag: Scocket_Tag_Header)
}
И когда я отправлю данные на сервер, я прочитаю заголовок 5 в didWriteDataWithTag
делегат
public func socket(_ sock: GCDAsyncSocket, didWriteDataWithTag tag: Int) {
self.beginReadHeader()
}
Я отправляю данные на сервер, затем делегат didWriteDataWithTag
работает
Теперь я получаю данные с сервера с 5 байтами (правильная длина заголовка), я вычисляю размер тела с 45 и запустить readDataToLength с 45, но случаются странные вещи. Я все равно получаю 5 байтов в следующий раз, когда в первый раз будет 45 байтов [2, 0, 0, 0, 45] размер тела 45 в следующий раз [10, 28, 99 , 111, 110]
Я предлагаю запустить readDataToLength дважды. Есть ли хороший способ решить эту проблему?