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

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

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

iOSとは、Apple製のスマートフォンであるiPhoneやタブレット端末のiPadに搭載しているオペレーションシステム(OS)です。その他にもiPod touch・Apple TVにも搭載されています。

TCP

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

Swift

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

Q&A

2回答

5788閲覧

swift4によるソケット通信

agagagaga

総合スコア10

iOS

iOSとは、Apple製のスマートフォンであるiPhoneやタブレット端末のiPadに搭載しているオペレーションシステム(OS)です。その他にもiPod touch・Apple TVにも搭載されています。

TCP

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

Swift

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

0グッド

1クリップ

投稿2019/01/08 08:54

編集2019/01/08 09:05

私はswift4でのソケット通信を実現させようとしています。
そこで
https://qiita.com/sensuikan1973/items/76c0bd861564859ebe4c
上記のサイトを参考にさせていただき進めています。

import UIKit class ViewController: UIViewController { var Connection1 = Connection() @IBOutlet weak var TB_SendCommand: UITextField! @IBAction func BT_Connect(sendr: AnyObject){ Connection1.connect() } @IBAction func BT_Send(sendr: AnyObject){ //テキストの文字を取得してsendCommand()を行う let sendtext = TB_SendCommand.text if ((sendtext! as NSString).length > 0) { Connection1.sendCommand(command: sendtext!) } } @IBAction func BT_End(sendr: AnyObject){ Connection1.sendCommand(command: "end") } override func viewDidLoad() { super.viewDidLoad() // Do any additional setup after loading the view, typically from a nib. } override func didReceiveMemoryWarning() { super.didReceiveMemoryWarning() // Dispose of any resources that can be recreated. } } class Connection: NSObject, StreamDelegate { let ServerAddress: CFString = NSString(string: "xxx.xxx.xxx.xxx") //IPアドレスを指定 let serverPort: UInt32 = xxxx //開放するポートを指定 private var inputStream : InputStream! private var outputStream: OutputStream! //** /* @brief サーバーとの接続を確立する */ func connect(){ print("connecting.....") var readStream : Unmanaged<CFReadStream>? var writeStream: Unmanaged<CFWriteStream>? CFStreamCreatePairWithSocketToHost(nil, self.ServerAddress, self.serverPort, &readStream, &writeStream) self.inputStream = readStream!.takeRetainedValue() self.outputStream = writeStream!.takeRetainedValue() self.inputStream.delegate = self self.outputStream.delegate = self self.inputStream.schedule(in: RunLoop.current, forMode: RunLoopMode.defaultRunLoopMode) self.outputStream.schedule(in: RunLoop.current, forMode: RunLoopMode.defaultRunLoopMode) self.inputStream.open() self.outputStream.open() print("connect success!!") } //** /* @brief inputStream/outputStreamに何かしらのイベントが起きたら起動してくれる関数 * 今回の場合では、同期型なのでoutputStreamの時しか起動してくれない */ func stream(_ stream:Stream, handle eventCode : Stream.Event){ //print(stream) } //** /* @brief サーバーにコマンド文字列を送信する関数 */ func sendCommand(command: String){ var ccommand = command.data(using: String.Encoding.utf8, allowLossyConversion: false)! let text = ccommand.withUnsafeMutableBytes{ bytes in return String(bytesNoCopy: bytes, length: ccommand.count, encoding: String.Encoding.utf8, freeWhenDone: false)!} self.outputStream.write(UnsafePointer(text), maxLength: text.utf8.count) print("Send: (command)") //"end"を受信したら接続切断 if (String(describing: command) == "end") { self.outputStream.close() self.outputStream.remove(from: RunLoop.current, forMode: RunLoopMode.defaultRunLoopMode) while(!inputStream.hasBytesAvailable){} let bufferSize = 1024 var buffer = Array<UInt8>(repeating: 0, count: bufferSize) let bytesRead = inputStream.read(&buffer, maxLength: bufferSize) if (bytesRead >= 0) { let read = String(bytes: buffer, encoding: String.Encoding.utf8)! print("Receive: (read)") } self.inputStream.close() self.inputStream.remove(from: RunLoop.current, forMode: RunLoopMode.defaultRunLoopMode) } } }

しかし、

RangeText="self.outputStream.write(UnsafePointer(text), maxLength: text.utf8.count)"
error: Segmentation fault: 11

このようなエラーが出てしまい、直せなくて困っています。
調べたところポインタが初期化されていないと出てしまうエラーではないかと思うのですが、改善の方法がわかりません。
どなたかご教授願いたいです。

補足
このアプリでは入力した任意の文字列をサーバー側に送るプログラムとなっていますが、もしも入力なしで固定の文字(例えば"1")を送る方法がありましたらそちらもご教授願いたいです。

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

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

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

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

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

y_waiwai

2019/01/08 08:58

ソースコードを提示しましょう
agagagaga

2019/01/08 09:02

すみません修正しました。
t_obara

2019/01/08 11:31

生ソケットを利用しなければいけない理由はあるのでしょうか?https等を利用するのであれば、そのような苦労もなさそうだと思いますが。
agagagaga

2019/01/08 12:18

iosアプリとコミュニケーションロボットであるSOTAとのリアルタイム通信を考えているのですが、通信に関する知識が薄く、まずソケットでの通信を試してみようといった感じです。 より良い方法があるのであれば教えていただきたいです。
guest

回答2

0

こんにちは
Swift初心者です。
こちらのページをもとにソケット通信を作成しています。
func streamの中、受信部分を作成しているのですが、、
サンプルがあれば、教えていただきたいです。

投稿2019/07/28 23:35

Rabitttt

総合スコア17

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

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

takabosoft

2019/07/29 00:40

ここは回答をする場所ですので、質問は新規に立ててください。
Rabitttt

2019/07/29 01:14

失礼しました。 新規で立てます
guest

0

元のソースがUnsafePointer(String型の変数)で何故動いていたのかが謎ですが、
少なくともSwift4では

swift

1func sendCommand(command: String){ 2 var ccommand = command.data(using: String.Encoding.utf8, allowLossyConversion: false)! 3 ccommand.withUnsafeBytes { bytes in 4 self.outputStream.write(bytes, maxLength: ccommand.count) 5 } 6 print("Send: (command)")

などと書かないと動かないと思います。

投稿2019/01/10 08:57

takabosoft

総合スコア8356

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.47%

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

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

質問する

関連した質問