簡體   English   中英

如何在iOS(Swift或ObjectiveC)中實現這樣的套接字調用?

[英]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 IOmsgpack之類的標准協議,而不要發明自己的協議,因為它們具有更好,更好的庫和更廣泛的社區支持。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM