如何在 iOS(Swift 或 Objective C)中实现这样的套接字调用?
Posted
技术标签:
【中文标题】如何在 iOS(Swift 或 Objective C)中实现这样的套接字调用?【英文标题】:How can I achieve a socket call like this in iOS (Swift or ObjectiveC)? 【发布时间】:2018-10-15 15:29:59 【问题描述】:这是 Java 中用于进行套接字调用的代码,但我想知道如何在 ios(Swift 或 Objective-C)中复制它或类似的东西
public String MakeSocketRequest()
DataInputStream inputSt;
DataOutputStream outputSt;
Socket socket = new Socket(InetAddress.getByName("socketurl.io"), 40008);
String jsonStr = "\"id\":1,\"method\":\"themethod\"";
inputSt = new DataInputStream(socket.getInputStream());
outputSt = new DataOutputStream(socket.getOutputStream());
PrintWriter pw = new PrintWriter(outputSt);
pw.println(string);
Log.d("PrintWriter", jsonStr);
pw.flush();
BufferedReader bfr = new BufferedReader(new InputStreamReader(inputSt));
JSONObject json = new JSONObject(bfr.readLine());
Log.d("Json", json.toString());
inputSt.close();
outputSt.close();
return json.toString();
【问题讨论】:
***.com/a/50062606/5461400 就我个人而言,我更喜欢使用CocoaAsyncSocket - 可能需要花点时间了解一下,但它也非常强大 RocketSoket、Soket.io 等库可以帮助我们解决问题 github.com/facebook/SocketRocket#readme , github.com/socketio/socket.io-client-swift 非常感谢你们的推荐!!我让它与 CocoaAsyncSocket 一起工作。 【参考方案1】:如果您想在没有 3rd 方库的情况下以本机方式执行此操作, 那么你可以使用CFStreamCreatePairWithSocketToHost函数来创建输入输出流(不需要socket对象)。
Here's some example code to set this upAnd the search shows many more
在 iOS 上,您不能立即写入或读取流,您必须等到套接字连接,并且您获得读取/写入权限。这是通过实现NSStreamDelegate 来完成的。
如果你在那里得到 NSStreamEventHasSpaceAvailable 事件,你可以将你的字符串写入输出流。你不需要PrintWriter来写一个字符串,因为很容易convert NSString to NSData,写NSData。
如果你得到 NSStreamEventHasBytesAvailable 事件,意味着你可以尝试从输入流中读取数据到某个缓冲区(比如 NSMutableData)。没有带有 readLine 方法的内置 BufferedReader,因此您必须自己缓冲数据并检测何时出现换行符。之后,您可以剪切缓冲区的一部分,直到新行和convert NSData to NSString(或使用NSJSONSerialization 的JSON 对象)。
注意:scheduleInRunLoop 调用可能看起来令人困惑,但它们需要通过委托开始接收事件。它有点告诉系统你想在哪个线程上接收它们。
附:我同意评论者的观点,如果你可以控制服务器代码,最好使用像 Socket IO 或 msgpack 这样的标准协议,而不是自己发明,因为它们有更好更好的库和更广泛的社区支持。
【讨论】:
这是我所期待的答案,非常感谢。最后我用 CocoaAsyncSocket 和你出色的解释让它工作了。以上是关于如何在 iOS(Swift 或 Objective C)中实现这样的套接字调用?的主要内容,如果未能解决你的问题,请参考以下文章
在 iOS 中使用核心图形上下文绘制圆 - Objective-C 或 Swift
如何在 Flutter 插件的 Swift 编写的 iOS 部分中使用 Objective-C 框架
如何在 iOS 上将“MongoDB 日期时间(ISO 日期)”解析为 NSDate(swift 和 Objective-c)
如何在 iOS 应用程序的同一个项目中集成 Objective-C 和 Swift pod