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

时间:2018-05-05 07:22:59

标签: ios objective-c swift sockets

这是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 个答案:

答案 0 :(得分:1)

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

Here's some example code to set this up
And 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调用可能看起来令人困惑,但是他们需要通过委托开始接收事件。它告诉系统你想要接收它们的线程。

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