代码之家  ›  专栏  ›  技术社区  ›  Fertos

如何在iOS(Swift或ObjectiveC)中实现这样的套接字调用?

  •  0
  • Fertos  · 技术社区  · 7 年前

    这是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();}
    
    1 回复  |  直到 7 年前
        1
  •  1
  •   battlmonstr    7 年前

    如果您想在没有第三方库的情况下以本机方式执行此操作, 然后您可以使用 CFStreamCreatePairWithSocketToHost 函数创建输入和输出流(不需要套接字对象)。

    Here's some example code to set this up
    And the search shows many more

    在iOS上,您无法立即写入或读取流,您必须等待套接字连接,并且您获得读/写权限。这是通过实现 NSStreamDelegate

    如果您在那里获得了nsstreamventhassspaceavailable事件,则可以将字符串写入输出流。您不需要一个PrintWriter来编写字符串,因为它很容易 convert NSString to NSData ,并写入NSData。

    如果您获得了NSStreamEventHasBytesAvailable事件,意味着您可以尝试将数据从输入流读取到某个缓冲区(如NSMutableData)。没有内置的带readLine方法的BufferedReader,因此您必须自己缓冲数据,并在出现新行字符时进行检测。之后,您可以剪切缓冲区的一部分,直到新行,并且 convert NSData to NSString (或通过使用 NSJSONSerialization )。

    注意:scheduleinrunlop调用可能看起来很混乱,但需要它们通过委托开始接收事件。它可以告诉系统您希望在哪个线程上接收它们。

    P、 我同意评论者的观点,如果您可以控制服务器代码,那么最好使用标准协议,如 Socket IO msgpack 而不是自己发明,因为他们有更好更好的图书馆和更广泛的社区支持。