这是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();}
答案 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 IO或msgpack这样的标准协议,而不是发明自己的协议,因为它们有更好更好的库和更广泛的社区支持。