如何在 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

iOS 应用内购买:Objective-C 与 Swift [重复]

如何使用iOS原生语言编写Swift类?