Мастера DELPHI, Delphi programming community Рейтинг@Mail.ru Титульная страница Поиск, карта сайта Написать письмо 
| Новости |
Новости сайта
Поиск |
Поиск по лучшим сайтам о Delphi
FAQ |
Огромная база часто задаваемых вопросов и, конечно же, ответы к ним ;)
Статьи |
Подборка статей на самые разные темы. Все о DELPHI
Книги |
Новинки книжного рынка
Новости VCL
Обзор свежих компонент со всего мира, по-русски!
|
| Форумы
Здесь вы можете задать свой вопрос и наверняка получите ответ
| ЧАТ |
Место для общения :)
Орешник
Коллекция курьезных вопросов из форумов
Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / rsdn.org

 
Чтобы не потерять эту дискуссию, сделайте закладку « предыдущая ветвь | форум | следующая ветвь »

WebSocket


RhinoFC ©   (21.12.18 13:20

Здравствуйте.

Подскажите, как работать с WebSocket'ами в Дельфи?

Нужно открыть канал на стороне клиента, подключиться к хосту, авторизоваться и слушать сообщения от него.

Информации в инете о работе с вэб-сокетами фактически нет (ну, есть, но это всё "шляпа" какая-то).
Компонентов тоже. Скачал какую-то опенсорсную библиотеку (https://github.com/andremussche/DelphiWebsockets), но ничего добиться с её помощью не могу.
Делаю так:
 client := TIdHTTPWebsocketClient.Create(Self);
 client.Port := 12346;
 client.Host := 'https://app.relay.crisp.chat/';
 client.Connect;
 client.UpgradeToWebsocket;

В итоге ошибка "Host not found". И вот не могу понять, что не так делаю.
Я в этой теме совершенно не разбираюсь и разобраться не получается (в виду отсутствия информации).
Помогите кто-нибудь.


ws   (21.12.18 13:48[1]

в хосте у тебя не хост а ури.

хост это app.relay.crisp.chat


rhinofc ©   (21.12.18 14:11[2]

Всё равно ошибка. На этот раз Connect timed out. :(


rhinofc ©   (21.12.18 14:32[3]

Точнее сперва выдаёт
Socket Error # 10038 Socket operation on non-socket
А затем уже Connect timed out


ws   (21.12.18 14:38[4]

на этом хосте на порту 12346 никто никого не ждет


rhinofc ©   (21.12.18 15:10[5]

А какой порт использовать? В документации REST-API Crisp'a нет ни слова об этом


ws   (21.12.18 15:20[6]

с какого такого праздника REST'у, который по конституции всегда был stateless
вдруг потребовалось работать через вебсокеты, протокол с постоянным соединением?


rhinofc ©   (21.12.18 15:26[7]

Выдержка из документации (https://docs.crisp.chat/api/v1/#header-🔀-rtm-events):

RTM Events ¶
The REST API comes along with a RTM Events API. RTM Events are sent on a WebSocket channel that you can open alongside your REST API channel, which allows you to receive asynchronous replies and events for some of your actions via the REST API.

You may subscribe to events by opening a Socket.IO connection to the WebSocket endpoint: https://app.relay.crisp.chat/


ws   (21.12.18 15:45[8]

в эту документацию рыбу заворачивали.

заходим в Libraries, выбираем любое и смотрим внутрь.
и видим что все работает на обычном http/https
и никаких вебсокетов там нет и в помине


ws   (21.12.18 15:50[9]

вот например пистоновский клиент

import json          

/* вот он http/https транспорт */
from requests import request              

/* вот она бэйсик аус */
from requests.auth import HTTPBasicAuth

from .errors.route import RouteError
from .resources.bucket import BucketResource
from .resources.user import UserResource
from .resources.website import WebsiteResource

class Crisp(object):
 /* вот тебе обычные http заголовки */
 REQUEST_HEADERS = {
   "User-Agent": "python-crisp-api/1.1.0",
   "Content-Type": "application/json"
 }

 def __init__(self):
   self.__auth = {}

   self.__rest_host = None
   self.__rest_base_path = None
   self.__timeout = None

   self.bucket = BucketResource(self)
   self.user = UserResource(self)
   self.website = WebsiteResource(self)

 def authenticate(self, identifier, key):
   self.__auth["identifier"] = identifier
   self.__auth["key"] = key

/* вот он ури для апи. и он ни разу не wss:// а https:// */
 def get_rest_host(self):
   return self.__rest_host or "https://api.crisp.chat"


rhinofc ©   (21.12.18 17:03[10]

Да нет. Есть сокеты.
Вот здесь
https://github.com/crisp-im/go-crisp-api/blob/master/crisp/events.go


ws   (21.12.18 17:22[11]

The REST API comes along with a RTM Events API.

Два апи.

чат работает на рест по https.
чат не работает через вебсокеты.

вебсокетное апи - доп пришлепка сбоку к рест апи, для получения нотификаций о событиях. Чтобы не долбить постоянно сервер рест-запросами "а нет ли чего новенького?"

Сарайка строится начиная со стен. затем на них нахлобучивают крышу.
А не наоборот. Сначала крышу, под которую подпихивают стены.


rhinofc ©   (21.12.18 17:26[12]

Ну правильно. Мне как раз это и надо.
Я как раз и хочу на события подписаться.
C REST API у меня проблем нет. Проблема именно в событиях RTM.


rhinofc ©   (21.12.18 17:28[13]

Смотрю их исходники:

func (service *EventsService) getEndpointURL() (string) {
 var secure bool

 u, _ := url.Parse(service.client.config.RealtimeEndpointURL)
 host, portString, _ := net.SplitHostPort(u.Host)

 port, _ := strconv.ParseInt(portString, 10, 64)

 if u.Scheme == "https" {
   secure = true
 } else {
   secure = false
 }

 return gosocketio.GetUrl(host, int(port), secure)
}



Хрен пойми, откуда они порт берут.


ws   (21.12.18 17:43[14]

сплит строки на хост и порт. по двоеточию.
затем strtoint порту

высшая математика, уровень прокачанного доктора наук, акамедика


Styx ©   (21.12.18 21:29[15]

По умолчанию https слушает на порту 443


версия для печати

Написать ответ

Ваше имя (регистрация  E-mail 







Разрешается использование тегов форматирования текста:
<b>жирный</b> <i>наклонный</i> <u>подчеркнутый</u>,
а для выделения текста программ, используйте <code> ... </code>
и не забывайте закрывать теги! </b></i></u></code> :)


Наверх

  Рейтинг@Mail.ru     Титульная страница Поиск, карта сайта Написать письмо