1.背景
接到一个任务,是C#端做Socket的客户端,服务端在用Java,Java那边用的Socket组件是 netty-socketio,在网上找了很多,最后发现用SocketIoClientDotNet可以连通。
2.C#客户端代码实现
using Newtonsoft.Json.Linq;
using Quobject.Collections.Immutable;
using Quobject.SocketIoClientDotNet.Client;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace ConsoleApp1
{
internal class Program
{
static void Main(string[] args)
{
var options = new IO.Options();
options.QueryString = "roomId=spc";
options.IgnoreServerCertificateValidation = true;
options.AutoConnect = true;
options.ForceNew = true;
options.Timeout = 1000*5;
// options.Transports = new ImmutableList<string>("websocket");
var socket = IO.Socket("ws://***.**.**.***:4000/", options);//实例化对象
socket.On(Socket.EVENT_CONNECT, () => //监听链接
{
Console.WriteLine("链接成功");
socket.Emit("sendMessage", "ccdcd"); //发送消息,前面是事件后面是时间 注意:发消息要保证链接是通的,如果链接不通就发数据,再链接上就发不出去
socket.On("sendMessage", (data) => //监听事件
{
Console.WriteLine(data);
// var b = (JObject)data; //将数据转一下
// Console.WriteLine(b['name']);
Console.WriteLine(data);
//socket.Disconnect(); //退出链接
});
});
socket.Connect(); //链接
socket.On(Socket.EVENT_DISCONNECT, () => {
//this.m_robot.OutLogMsg("退出联网");
//conn_net = false;
socket.Close();
}); //socket.close(); 方法只能在这里disconnect 下 关闭其他如 reconnet等等不行
Console.ReadKey();
}
}
}
3.注意点
注意SocketIoClientDotNet的版本,刚开始使用的版本是0.9.0版本(第一个版本),不稳定,有时候能连接成功有时候连接不成功。后来升级到了最新的版本这个问题得与解决,但是出现了一个新的问题,就是每次连接的时候,会与服务端随机建立2~4个连接。客户端这边没法控制建立的连接数。目前的做法是服务端那边控制,只开启最新的连接。把其余的连接关闭。创建实例后不需要再写Socket.connect(),不然会创建多个连接
由于Java服务端不是我这边开发的。没有java服务端的代码(请谅解)。