質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
TCP

TCP(Transmission Control Protocol)とは、トランスポート層のプロトコルで、コネクション型のデータサービスです。

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

Q&A

1回答

6125閲覧

SwiftでTCPクライアントを連続的に通信する

edisonthk

総合スコア11

TCP

TCP(Transmission Control Protocol)とは、トランスポート層のプロトコルで、コネクション型のデータサービスです。

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

0グッド

0クリップ

投稿2015/05/07 09:06

TCPクライアントとサーバーの通信を連続的に行って欲しいですが、現状では送信・受信は一回のみとなっているので、どうしたら連続的に通信ができますか。

理想

iOS ------> server iOS <------ server iOS ------> server iOS <------ server and forever ...

現状(問題)

iOS ------> server iOS <------ server one time only

サーバのソースコードはテスト済みで特に問題がないので、swiftで問題が発生していると思いますが、指摘していただけたら嬉しいです。よろしくお願いします。

var sendFlag:Bool = true; func initTcpNetwork(host:String,port :Int,delegate:NSStreamDelegate? ) { NSStream.getStreamsToHostWithName(host, port: port, inputStream: &inputstream, outputStream: &outputstream) inputstream?.delegate=self; outputstream?.delegate=self; dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0)){ self.printQueueLabel(); let loop = NSRunLoop.currentRunLoop(); self.inputstream?.scheduleInRunLoop(loop, forMode: NSDefaultRunLoopMode); self.outputstream?.scheduleInRunLoop(loop, forMode: NSDefaultRunLoopMode); self.inputstream?.open() self.outputstream?.open() loop.run(); } } func stream(aStream: NSStream, handleEvent eventCode: NSStreamEvent) { switch (eventCode){ case NSStreamEvent.OpenCompleted: NSLog("Stream opened"); break case NSStreamEvent.HasSpaceAvailable: NSLog("has space"); if(sendFlag) { sendFlag = false; var outputstream = aStream as? NSOutputStream; var str = "0"; var data: NSData = str.dataUsingEncoding(NSUTF8StringEncoding, allowLossyConversion: false)!; outputstream?.write(UnsafePointer<UInt8>(data.bytes), maxLength: data.length); } break case NSStreamEvent.HasBytesAvailable: var inputstream = aStream as? NSInputStream; var buffer = [UInt8](count: 4096, repeatedValue: 0); while ((inputstream?.hasBytesAvailable) != nil) { var len = inputstream?.read(&buffer, maxLength: 4096); if (len > 0) { var output: NSString = NSString(bytes:&buffer, length:len!, encoding:NSASCIIStringEncoding)!; dispatch_async(dispatch_get_main_queue(), { self.handleDataReceived(output); }) } } self.sendFlag = true; break case NSStreamEvent.ErrorOccurred: var err = aStream.streamError; print(err?.description); break case NSStreamEvent.EndEncountered: aStream.close(); aStream.removeFromRunLoop(NSRunLoop.currentRunLoop(), forMode: NSDefaultRunLoopMode); break default: NSLog("unknown.") } }

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ちなみに連続的に通信する意図としては、ファイルのダウンロード・アップロードでしょうか?
もしそうであればその辺りの処理を吸収してくれるNSURLSessionを使うともっと楽に書けますよ

投稿2015/07/12 23:13

__moai

総合スコア264

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問