ios - 如何在 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();}
解决方案
如果您想在没有 3rd-party 库的情况下本地执行此操作,则可以使用CFStreamCreatePairWithSocketToHost函数创建输入和输出流(不需要套接字对象)。
在 iOS 上,您不能立即写入或读取流,您必须等到套接字连接,并且您获得读取/写入权限。这是通过实现NSStreamDelegate来完成的。
如果你在那里得到 NSStreamEventHasSpaceAvailable 事件,你可以将你的字符串写入输出流。你不需要 PrintWriter 来写一个字符串,因为很容易将 NSString 转换为 NSData,然后写 NSData。
如果您收到 NSStreamEventHasBytesAvailable 事件,则意味着您可以尝试从输入流中读取数据到某个缓冲区(如 NSMutableData)。没有带有 readLine 方法的内置 BufferedReader,因此您必须自己缓冲数据并检测何时出现换行符。之后,您可以剪切缓冲区的一部分直到新行,并将 NSData 转换为 NSString(或使用NSJSONSerialization的 JSON 对象)。
注意: scheduleInRunLoop 调用可能看起来令人困惑,但它们需要通过委托开始接收事件。它有点告诉系统你想在哪个线程上接收它们。
PS 我同意评论者的观点,如果你可以控制服务器代码,最好使用标准协议,如Socket IO或msgpack,而不是自己发明,因为它们有更好更好的库和更广泛的社区支持。
推荐阅读
- laravel - 隐藏 laravel MethodNotAllowedHttpException
- angular - Angular 9:在代码覆盖率中包含所有测试用例
- apache-spark - 我应该在 PySpark 中选择 RDD 还是 DataFrame 之一?
- python - 如何拆分数据集以在 Python 中进行训练、测试和验证?
- functional-programming - F# - 访问来自不同项目的参考单元格
- perl - 如何在 Perl 中打印包变量
- macos - mac os 中的 AWS ECR 登录命令管道
- c - linux中进程的环境变量存储在哪里?
- flutter - 如何使用gestureDetector onPanUpdate以连续顺序播放动画和删除所有动画
- python - 从元组列表中查找元组元素总和的所有组合