首页 > 解决方案 > 如何在 iOS(Swift 或 ObjectiveC)中实现这样的套接字调用?

问题描述

这是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();}

标签: iosobjective-cswiftsockets

解决方案


如果您想在没有 3rd-party 库的情况下本地执行此操作,则可以使用CFStreamCreatePairWithSocketToHost函数创建输入和输出流(不需要套接字对象)。

这是一些设置它的示例代码
搜索显示更多

在 iOS 上,您不能立即写入或读取流,您必须等到套接字连接,并且您获得读取/写入权限。这是通过实现NSStreamDelegate来完成的。

如果你在那里得到 NSStreamEventHasSpaceAvailable 事件,你可以将你的字符串写入输出流。你不需要 PrintWriter 来写一个字符串,因为很容易将 NSString 转换为 NSData,然后写 NSData。

如果您收到 NSStreamEventHasBytesAvailable 事件,则意味着您可以尝试从输入流中读取数据到某个缓冲区(如 NSMutableData)。没有带有 readLine 方法的内置 BufferedReader,因此您必须自己缓冲数据并检测何时出现换行符。之后,您可以剪切缓冲区的一部分直到新行,并将 NSData 转换为 NSString(或使用NSJSONSerialization的 JSON 对象)。

注意: scheduleInRunLoop 调用可能看起来令人困惑,但它们需要通过委托开始接收事件。它有点告诉系统你想在哪个线程上接收它们。

PS 我同意评论者的观点,如果你可以控制服务器代码,最好使用标准协议,如Socket IOmsgpack,而不是自己发明,因为它们有更好更好的库和更广泛的社区支持。


推荐阅读