- 
                Notifications
    
You must be signed in to change notification settings  - Fork 138
 
Home
Connect to the socket.io server, listen events and emit some data.
var client = new SocketIO("http://localhost:11000/");
client.On("hi", response =>
{
    // You can print the returned data first to decide what to do next.
    // output: ["hi client"]
    Console.WriteLine(response);
    string text = response.GetValue<string>();
    // The socket.io server code looks like this:
    // socket.emit('hi', 'hi client');
});
client.On("test", response =>
{
    // You can print the returned data first to decide what to do next.
    // output: ["ok",{"id":1,"name":"tom"}]
    Console.WriteLine(response);
    
    // Get the first data in the response
    string text = response.GetValue<string>();
    // Get the second data in the response
    var dto = response.GetValue<TestDTO>(1);
    // The socket.io server code looks like this:
    // socket.emit('hi', 'ok', { id: 1, name: 'tom'});
});
client.OnConnected += async (sender, e) =>
{
    // Emit a string
    await client.EmitAsync("hi", "socket.io");
    // Emit a string and an object
    var dto = new TestDTO { Id = 123, Name = "bob" };
    await client.EmitAsync("register", "source", dto);
};
await client.ConnectAsync();The way to override the default options is as follows:
var client = new SocketIO("http://localhost:11000/", new SocketIOOptions
{
    Query = new List<KeyValuePair<string, string>>
    {
        new KeyValuePair<string, string>("token", "abc123"),
        new KeyValuePair<string, string>("key", "value")
    }
});| Option | Default value | Description | 
|---|---|---|
Path | 
/socket.io | 
name of the path that is captured on the server side | 
Reconnection | 
true | 
whether to reconnect automatically | 
ReconnectionAttempts | 
int.MaxValue | 
number of reconnection attempts before giving up | 
ReconnectionDelay | 
1000 | 
how long to initially wait before attempting a new reconnection. Affected by +/- RandomizationFactor, for example the default initial delay will be between 500 to 1500ms. | 
RandomizationFactor | 
0.5 | 
0 <= RandomizationFactor <= 1 | 
ConnectionTimeout | 
20000 | 
connection timeout | 
Query | 
IEnumerable<KeyValuePair<string, string>> | 
additional query parameters that are sent when connecting a namespace (then found in socket.handshake.query object on the server-side) | 
AutoUpgrade | 
true | 
If websocket is available, it will be automatically upgrade to use websocket | 
Client
await client.EmitAsync("ack", response =>
{
    // You can print the returned data first to decide what to do next.
    // output: [{"result":true,"message":"Prometheus - server"}]
    Console.WriteLine(response);
    var result = response.GetValue<BaseResult>();
}, "Prometheus");Server
socket.on("ack", (name, fn) => {
    fn({
        result: true,
        message: `${name} - server`
    });
});Client
client.On("ack2", async response =>
{
    // You can print the returned data first to decide what to do next.
    // output: [1, 2]
    Console.WriteLine(response);
    int a = response.GetValue<int>();
    int b = response.GetValue<int>(1);
    
    await response.CallbackAsync(b, a);
});Server
socket.emit("ack2", 1, 2, (arg1, arg2) => {
    console.log(`arg1: ${arg1}, arg2: ${arg2}`);
});The output of the server is:
arg1: 2, arg2: 1
This example shows how to emit and receive binary messages, The library uses System.Text.Json to serialize and deserialize json by default.
class FileDTO
{
    [JsonPropertyName("name")]
    public string Name { get; set; }
    [JsonPropertyName("mimeType")]
    public string MimeType { get; set; }
    [JsonPropertyName("bytes")]
    public byte[] Bytes { get; set; }
}client.OnConnected += async (sender, e) =>
{
    await client.EmitAsync("upload", new FileDTO
    {
        Name = "template.html"
        MimeType = "text/html",
        bytes = Encoding.UTF8.GetBytes("<div>test</div>")
    });
};
client.On("new files", response =>
{
    // You can print the returned data first to decide what to do next.
    // output: [{"name":"template.html","mimeType":"text/html","bytes":{"_placeholder":true,"num":0}}]
    Console.WriteLine(response);
    var result = response.GetValue<FileDTO>();
    Console.WriteLine(Encoding.UTF8.GetString(result.Bytes))
});The library uses System.Text.Json to serialize and deserialize json by default, If you want to change JsonSerializerOptions, you can do this:
var client = new SocketIO("http://localhost:11000/");
var jsonSerializer = socket.JsonSerializer as SystemTextJsonSerializer;
jsonSerializer.OptionsProvider = () => new JsonSerializerOptions
{
    PropertyNameCaseInsensitive = true
};Of course you can also use Newtonsoft.Json library, for this, you need to install SocketIOClient.Newtonsoft.Json dependency.
var jsonSerializer = new NewtonsoftJsonSerializer();
jsonSerializer.OptionsProvider = () => new JsonSerializerSettings
{
    ContractResolver = new DefaultContractResolver
    {
        NamingStrategy = new CamelCaseNamingStrategy()
    }
};
socket.JsonSerializer = jsonSerializer;You can set proxy and add headers for WebSocket client, etc.
var client = new SocketIO("http://localhost:11000/");
client.ClientWebSocketProvider = () =>
{
    var clientWebSocket = new DefaultClientWebSocket
    {
        ConfigOptions = o =>
        {
            var options = o as ClientWebSocketOptions;
            var proxy = new WebProxy("http://example.com");
            proxy.Credentials = new NetworkCredential("username", "password");
            options.Proxy = proxy;
            options.SetRequestHeader("key", "value");
            options.RemoteCertificateValidationCallback = (sender, certificate, chain, sslPolicyErrors) =>
            {
                Console.WriteLine("SslPolicyErrors: " + sslPolicyErrors);
                if (sslPolicyErrors == System.Net.Security.SslPolicyErrors.None)
                {
                    return true;
                }
                return true;
            };
        }
    };
    return clientWebSocket;
};The library uses System.Net.WebSockets.ClientWebSocket by default. Unfortunately, it does not support Windows 7 or Windows Server 2008 R2. You will get a PlatformNotSupportedException. To solve this problem, you need to install the SocketIOClient.Windows7 dependency and then change the implementation of ClientWebSocket.
client.ClientWebSocketProvider = () => new ClientWebSocketManaged();