У меня есть сервер на php и webSocket клиент на js в браузере. Как создать сокет соединения с этим же сервером на C# через протокол tcp? Использую стандартную библиотеку System.Net.WebSockets.
-
2Возможный дубликат вопроса: Как правильно реализовать webSocket клиент на C#? – Геннадий П Jan 13 '20 at 05:15
1 Answers
Ни разу я не использовал сокеты, решил разобраться и вот что у меня получилось в итоге:
В качестве сервера для отправки возьму Echo сервер websocket.org.
И так, основной класс клиента для веб сокетов является
ClientWebSocket, он у насIDisposable, а значит используемusing:using var ws = new ClientWebSocket();Я использую c# 8, по этому using у меня в одну строку.
Дальше смотрим какие есть методы у данного объекта и замечаем, что по сути там всего 3 метода основных (
ConnectAsync(),SendAsync()иReceiveAsync(). Давайте теперь по порядку:ConnectAsync()- Подключаемся к указанному серверу, на вход принимает два параметра (UriиCancellationToken).await ws.ConnectAsync(new Uri("wss://echo.websocket.org"), CancellationToken.None);SendAsync()- Отправляет на сервер массив байтов с указанием типа отправленного сообщения. ПринимаетArraySegment<byte>,WebSocketMessageType,boolиCancellationToken:ArraySegment<byte> arraySegment = new ArraySegment<byte>(Encoding.UTF8.GetBytes("Привет мир!")); await ws.SendAsync(arraySegment, System.Net.WebSockets.WebSocketMessageType.Text, true, CancellationToken.None);ReceiveAsync()- Получает от сервера ответ. ПринимаетArraySegment<byte>в качестве буфера для записи данных, а такжеCancellationToken.ArraySegment<byte> bytesReceived = new ArraySegment<byte>(new byte[1024]); WebSocketReceiveResult result = await ws.ReceiveAsync(bytesReceived, CancellationToken.None); var response = Encoding.UTF8.GetString(bytesReceived.Array, 0, result.Count);
Вот собственно и все, что надо для простейшей работы с веб сокетами на C#.
Из замечаний:
CancellationToken- я везде использовал заглушку, для примера сойдет, а вот в проекте лучше создайте объектCancellationTokenSource, берите из него токен и работайте с ним. Иначе вы вряд-ли правильно завершите задачу.ReceiveAsync()- перед получением данных наверно стоит проверить, есть ли вообще соединение. Делается это примерно так:if (ws.State == WebSocketState.Open) { //Мы подключились и можем отправлять данные. }В интернете видел, что делают
whileцикл, который крутится до бесконечности, пока статусOpen, тут уже смотрите сами как вам надо.
- 15,694