Как я могу добиться вызова сокета, как это в iOS (Swift или ObjectiveC)? - PullRequest
0 голосов
/ 05 мая 2018

Это код в 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 голосов
/ 05 мая 2018

Если вы хотите сделать это без сторонних библиотек, тогда вы можете использовать функцию CFStreamCreatePairWithSocketToHost для создания входных и выходных потоков (объект сокета не требуется).

Вот пример кода для настройки
И поиск показывает еще много

В iOS вы не можете сразу писать или читать потоки, вам нужно подождать, пока сокет не будет подключен, и вы получите разрешение на чтение / запись. Это делается путем реализации NSStreamDelegate .

Если вы получили событие NSStreamEventHasSpaceAvailable, вы можете записать свою строку в выходной поток. Вам не нужен PrintWriter, чтобы просто написать строку, потому что легко преобразовать NSString в NSData и записать NSData.

Если вы получаете событие NSStreamEventHasBytesAvailable, это означает, что вы можете попытаться прочитать данные из входного потока в некоторый буфер (например, NSMutableData). Нет встроенного BufferedReader с методом readLine, поэтому вам придется самостоятельно буферизовать данные и определить, когда там появляется символ новой строки. После этого вы можете вырезать часть буфера до новой строки и преобразовать NSData в NSString (или объект JSON с помощью NSJSONSerialization ).

Примечание: вызовы scheduleInRunLoop могут показаться запутанными, но они необходимы для начала приема событий через делегата. Это как бы сообщает системе, в каком потоке вы хотите их получить.

P.S. Я согласен с комментаторами, что если у вас есть контроль над кодом сервера, лучше использовать стандартный протокол, такой как Socket IO или msgpack , а не придумывать свой собственный, потому что они лучше и лучше поддержка библиотек и более широкого сообщества.

...