У меня есть сервер на php и webSocket клиент на js в браузере. Как создать сокет соединения с этим же сервером на C# через протокол tcp? Использую стандартную библиотеку System.Net.WebSockets.
Ни разу я не использовал сокеты, решил разобраться и вот что у меня получилось в итоге:
В качестве сервера для отправки возьму 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
, тут уже смотрите сами как вам надо.
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Есть некоторое имя сервера SQL Server, например DESKTOP-1TUВ своем проекте в VS в файле App
Подскажите, пожалуйста, как правильно реализовать подобную рамку? Интересует именно форма углов, это можно сделать сделать на чистом CSS?
Приветстсвую! Решил поработать с двоичными числами в Qt, а точнее разобраться с константами из enum'a QStyle :: StateFlag