#c# #websocket #socket.io #websocket4net
#c# #websocket #socket.io #websocket 4net
Вопрос:
Я настраиваю клиент C # websocket для сервера, реализованного в nodejs (используя socket.io ). Используя [Websocket4net]:https://github.com/kerryjiang/WebSocket4Net . Мой код может подключаться к серверу сокетов, но к WebClient.Отправка («сообщение») не вызывает события сервера. Я застрял при отправке сообщения или вызове событий с сервера, используя websocket4net lib. Я выбрал эту библиотеку, потому что моя реализация находится в framework 2.0 или ниже.
Я пытался использовать websocket.send («message») для вызова события сообщения после подключения, но оно не распознается на сервере. Не удалось вызвать функцию на сервере. Также изучил команду выполнения, но не смог реализовать это в моем классе.
public class JniorWebSocket : IDisposable
{
//public delegate void LogEventHandler(object sender, LogEventArgs args);
//public event LogEventHandler Log;
public event EventHandler Connected;
public event EventHandler Disconnected;
private WebSocket _websocket;
private string _uri;
private string sid;
public JniorWebSocket(string host) : this(host, 0) { }
public JniorWebSocket(string host, int port)
{
_uri = "ws://" host;
if (0 != port) _uri = ":" port "/join/?EIO=3amp;transport=websocket";
_websocket = new WebSocket(_uri);
_websocket.Opened = new EventHandler(websocket_Opened);
_websocket.Error = Websocket_Error;
_websocket.Closed = websocket_Closed;
_websocket.MessageReceived = Websocket_MessageReceived;
_websocket.Open();
}
public void Dispose()
{
_websocket.Dispose();
GC.SuppressFinalize(this);
}
public bool AllowUnstrustedCertificate
{
get
{
return _websocket.AllowUnstrustedCertificate;
}
set
{
_websocket.AllowUnstrustedCertificate = value;
}
}
public void Connect()
{
_websocket.Open();
while (_websocket.State == WebSocketState.Connecting) { };
if (_websocket.State != WebSocketState.Open)
{
throw new Exception("Connection is not opened.");
}
}
public void Close()
{
_websocket.Close();
}
public void Send(string message)
{
try
{
_websocket.Send(message);
}
catch (Exception ex)
{
}
}
private void Websocket_Error(object sender, ErrorEventArgs e)
{
}
private void Websocket_MessageReceived(object sender, MessageReceivedEventArgs e)
{
if (e.Message.IndexOf("{") != -1)
{
var json = JObject.Parse(e.Message.Substring(e.Message.IndexOf("{")));
sid = json["sid"].ToString();
Console.WriteLine(sid);
if ("Error".Equals(sid)) HandleErrorMessage(json);
}
}
private void HandleErrorMessage(JObject json)
{
}
private void websocket_Opened(object sender, EventArgs e)
{
Connected?.Invoke(this, EventArgs.Empty);
Send(string.Empty);
}
private void websocket_Closed(object sender, EventArgs e)
{
Disconnected?.Invoke(this, EventArgs.Empty);
}
}
Вызов этого класса из моего основного
JniorWebSocket jniorWebSocket = new JniorWebSocket(uri, port);
jniorWebSocket.AllowUnstrustedCertificate = true;
jniorWebSocket.Connect();
jniorWebSocket.Send("message");
сокет.ввод -вывод на стороне nodejs
const server = require('http').Server(app);
global.socketIO = SocketIO(server, { path: '/join' });
global.socketIO.on('connection', (socket) =>
{
socket.on('message',async (data) => {
console.info(data);
});
socket.on('authenticate', async (data) => {
try {
}
} catch(error) {
console.warn('Error while authenticating socket', error);
}
});
});
Я новичок в этой реализации websocket C # и не понимаю, как я могу вызывать серверные события, и после этого я также напишу некоторые события на стороне клиента.
Ожидайте вызова всех событий сервера от клиента.
Комментарии:
1. У меня такая же проблема .. вы решили свою проблему? спасибо
2. @ertan2002 к сожалению, нет… На стороне .net нет реализации, доступной для сокета. или половина доступна, я могу сказать. Я создам репозиторий github и внедрю его.
3. Я решил проблему, используя SocketIoClientDotNet. Просто имейте в виду, что вы должны указывать прямой URL-адрес без какого-либо расширения, такого как EIO или transport и т. Д. например: localhost: 1453 и он работает для настольных компьютеров и xamarin.mobile, а моя платформа была 4.5
Ответ №1:
Он работает для настольного приложения и приложения xamarin.android
Я использовал эту библиотеку, даже если она устарела https://github.com/Quobject/SocketIoClientDotNet
вы можете установить непосредственно из nuget Install-Package SocketIoClientDotNet
using Quobject.EngineIoClientDotNet.Client.Transports;
using Quobject.SocketIoClientDotNet.Client;
var option = new IO.Options()
{
QueryString = "Type=Desktop",
Timeout = 5000,
ReconnectionDelay = 5000,
Reconnection = false,
ransports = Quobject.Collections.Immutable.ImmutableList.Create<string>(PollingXHR.NAME)
};
socket = IO.Socket("http://localhost:1453",option);
socket.On(Socket.EVENT_CONNECT, () =>
{
socket.Emit("iAmOnline", "1234");
});
socket.On("youAreOnline", () =>
{
Console.WriteLine("I am Online");
});
socket.On("hi", (data) =>
{
Console.WriteLine(data);
socket.Disconnect();
});
вы можете добавить любой транспорт по своему усмотрению. Я добавил xhr-опрос из-за брандмауэра. Вы можете использовать WebSocket.ИМЯ и/или Polling.NAME
Комментарии:
1. .Net версии 4.5 Я тоже могу это сделать, мне нужна обратная связь, совместимая с .net 2.0 и использующая webhttprequest? также вы следите за сокетом. протоколы ввода-вывода, такие как длительный опрос, сначала с использованием http, затем websocket, а затем создание комнаты и общение?
2. @BhushanGholave Я хотел бы также иметь .net standard (не уверен, что вы говорите о .net 2.0 framework или стандарте), но .net standard не поддерживается.. и почему вы будете использовать webhttprequest? Читать engine.io (тема цели) и вы увидите, что они сделали то, что вы сказали..