データ送信は送信可能になった時にデータを送るだけでいけます。
データ変換処理の情報が少ないからそこはちょっと手間取るかも。
ソースコード
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 | /** データ送信 */ func send(msg: String) { // 接続されていない場合接続 if !isConnected { connect() } print( "request is " + msg) // エンコード let request = msg.dataUsingEncoding( NSShiftJISStringEncoding, allowLossyConversion: false ) let requestBytes = UnsafePointer<uint8>(request!.bytes) let requestLength = request!.length // 書き込み可能になった送信 var timeout = 5 * 100000 // wait 5 seconds before giving up while !self.outputStream.hasSpaceAvailable { usleep(1000) // wait until the socket is ready timeout -= 100 if timeout < 0 { print( "time out" ) self.delegate.didReceivedResponseData(Connection.ERR_MSG) return } else if self.outputStream.streamError != nil { print( "disconnect Stream" ) self.delegate.didReceivedResponseData(Connection.ERR_MSG) return // disconnectStream will be called. } } // 送信可能になったら書き込む print( "write" ) self.outputStream.write(requestBytes, maxLength: requestLength) } |
解説
接続処理が完了していることを前提にしています。
まずString型の送信データを送信用に変換します。
エンコーディングがUTF8だとうまく動作しなかった気が、要検証。
安定性を重視するために同期的に送信しています。
非同期にする場合はNSOperationQueue().addOperationWithBlock { [weak self] in ... で送信処理を囲めば実現できます。
outputStream.hasSpaceAvailable を参照して送信可能になるまでループしています。
一定時間が過ぎたらあるいはストリームエラーが発生したらエラーとして終了します。
書き込み可能になったらエンコードした送信データとデータサイズを引数にoutputStream.write メソッドを呼び出します。
サーバ側で受信が確認できれば成功です。
今日はここまで。
前回の記事
ソケット接続
次の記事
データ受信
まとめ