[英]How can I achieve a socket call like this in iOS (Swift or 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();}
如果要在沒有第三方庫的情況下本機執行此操作,則可以使用CFStreamCreatePairWithSocketToHost函數來創建輸入和輸出流(不需要套接字對象)。
在iOS上,您無法立即寫入或讀取流,而必須等到套接字連接好后,才能獲得讀取/寫入的權限。 這是通過實現NSStreamDelegate來完成的。
如果在那里獲得NSStreamEventHasSpaceAvailable事件,則可以將字符串寫入輸出流。 您不需要PrintWriter即可編寫字符串,因為將NSString轉換為NSData並編寫NSData很容易。
如果收到NSStreamEventHasBytesAvailable事件,則意味着您可以嘗試將數據從輸入流讀取到某個緩沖區(例如NSMutableData)。 沒有帶readLine方法的內置BufferedReader,因此您將不得不自己緩沖數據並檢測何時出現換行符。 之后,您可以剪切緩沖區的一部分直到新行,然后將NSData轉換為NSString (或使用NSJSONSerialization 轉換為JSON對象)。
注意:scheduleInRunLoop調用可能看起來很混亂,但是要求它們開始通過委托接收事件。 它告訴系統您要在哪個線程上接收它們。
PS我同意評論者的意見,如果您可以控制服務器代碼,則最好使用諸如Socket IO或msgpack之類的標准協議,而不要發明自己的協議,因為它們具有更好,更好的庫和更廣泛的社區支持。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.