C  Socket使用以及DotNetty和Supersocket 框架

C#中Socket的使用

Socket是一种网络通信协议,是一组用于实现网络通信或者进行网络编程的API。在C#中使用Socket类进行网络编程,可以实现TCP/IP协议或UDP协议等的网络通信。

Socket类有传输层协议的内核实现,提供了客户端和服务器端的编程接口。C#中Socket的使用十分灵活,不仅可以用来进行简单的网络通信,还可以实现各种复杂的网络应用。下面我们来看一下Socket类的基本使用。

创建Socket对象

在C#中创建Socket对象非常简单,只需要在命名空间System.Net.Sockets中实例化Socket类即可:

```

Socket socket = new Socket(AddressFamily.InterNetwork,SocketType.Stream, ProtocolType.Tcp);

```

其中AddressFamily.InterNetwork表示IPv4协议族,SocketType.Stream表示基于流(TCP)协议的Socket对象,ProtocolType.Tcp表示使用TCP协议进行通信。

客户端连接服务器

一个最常见的需求是客户端连接服务器,我们可以使用以下代码:

```

IPAddress iPAddress = IPAddress.Parse("127.0.0.1");

IPEndPoint endPoint = new IPEndPoint(iPAddress, 8080);

socket.Connect(endPoint);

```

其中,IPAddress是服务器IP地址,IPEndPoint是IP地址和端口号的组合。Connect方法则是与服务器进行连接。

接收和发送数据

接收数据:

```

byte[] buffer = new byte[1024];

int length = socket.Receive(buffer);

string msg = Encoding.UTF8.GetString(buffer, 0, length);

```

其中,buffer是用于存储接收到的数据的缓冲区,Receive方法返回实际接收到的数据字节数,而数据的解析则依靠Encoding类来进行。

发送数据:

```

byte[] buffer = Encoding.UTF8.GetBytes("Hello World");

socket.Send(buffer);

```

Shutdown和Close方法

在C#中,我们通常会使用Shutdown方法来关闭Socket连接,它会触发TCP四次挥手协议,保证数据的完整性,同时释放资源:

```

socket.Shutdown(SocketShutdown.Both);

socket.Close();

```

其中SocketShutdown.Both表示关闭连接的同时,也会禁止Socket发送和接收数据。

以上就是C# Socket基本用法的介绍,接下来我们将会了解两个C#中比较流行的Socket框架。

DotNetty框架

DotNetty是一个高度优化过的NIO框架,它模拟了Java NIO框架,并且将其移植到了.NET平台上。DotNetty在处理高并发网络连接和大量数据传输上有着显著的优势,支持TCP、UDP、HTTP以及WebSocket等多种协议。

在使用DotNetty框架之前,需要先安装DotNetty的NuGet包,在Visual Studio的NuGet包管理器中搜索DotNetty即可安装。

下面我们来看一段简单的DotNetty程序:

```

private static async Task RunServerAsync()

{

IEventLoopGroup bossGroup = new MultithreadEventLoopGroup(1);

IEventLoopGroup workerGroup = new MultithreadEventLoopGroup();

try

{

var bootstrap = new ServerBootstrap()

.Group(bossGroup, workerGroup)

.Channel()

.ChildHandler(new ActionChannelInitializer(channel =>

{

IChannelPipeline pipeline = channel.Pipeline;

pipeline.AddLast(new DelimiterBasedFrameDecoder(8192, Delimiters.LineDelimiter()));

pipeline.AddLast(new StringEncoder(Encoding.UTF8));

pipeline.AddLast(new StringDecoder(Encoding.UTF8));

pipeline.AddLast(new EchoServerHandler());

}))

.Option(ChannelOption.SoBacklog, 128)

.ChildOption(ChannelOption.SoKeepalive, true);

IChannel serverChannel = await bootstrap.BindAsync(8080);

Console.ReadKey();

await serverChannel.CloseAsync();

}

finally

{

await Task.WhenAll(

bossGroup.ShutdownGracefullyAsync(TimeSpan.FromMilliseconds(100), TimeSpan.FromSeconds(1)),

workerGroup.ShutdownGracefullyAsync(TimeSpan.FromMilliseconds(100), TimeSpan.FromSeconds(1))

);

}

}

```

在此程序中,我们定义了一个Echo服务器,为了增加程序可读性,我们采用了Chaining Configuring API风格。程序过程如下:

1. 定义IEventLoopGroup对象,IEventLoopGroup主要负责事件和I/O处理任务的线程池;

2. 定义ServerBootstrap对象,它是一个服务端引导类,用于启动ServerChannel以及初始化需要的ChannelPipeline;

3. 调用BindAsync方法,绑定端口号,启动服务端;

4. 关闭服务端.

可以发现,使用DotNetty框架开发网络应用时,代码量大幅简化,而且易于维护和扩展。

Supersocket框架

SuperSocket是一个基于.NET的高性能Socket框架,专注于TCP和UDP通信。相较于DotNetty,SuperSocket更易用且定制化特点更突出,可实现快速搭建具有高可靠性的WebSocket应用。

在使用Supersocket框架之前,需要先安装SuperSocket和SuperSocket.ProtoBase的NuGet包,在Visual Studio的NuGet包管理器中搜索启发式命令行Sln即可下载。

下面我们来看一段简单的SuperSocket程序:

```

//定义服务器

var host = SuperSocketHostBuilder.Create()

.ConfigureSuperSocket((options) =>

{

options.Name = "MyServer";

options.Listeners = new List

{

new TcpSocketListenerOptions

{

Ip = "Any",

Port = 8080

}

};

})

.UsePipelineFilter()

.Build();

//启动服务器

await host.StartAsync();

...

//定义管道信息解析器

public class LinePipelineFilter : IFilter

{

public StringPackageInfo Filter(ref ReadOnlySequence buffer)

{

var reader = new SequenceReader(buffer);

var read = reader.TryReadTo(out ReadOnlySpan pack, (byte)'\n', true);

if (!read)

return null;

reader.Advance(1);

return new StringPackageInfo(Encoding.UTF8.GetString(pack.ToArray()), pack);

}

public void Reset() { }

public object Clone() => this.MemberwiseClone();

}

...

//定义服务

public class MyServer : WebSocketPushSession

{

public override async void HandlePackage(IPipelineHandlerContext context, StringPackageInfo package)

{

var remoteEndPoint = context.Session.RemoteEndPoint;

var content = package.Body;

await context.SendAsync(Encoding.UTF8.GetBytes("Hello world"));

}

}

```

在此程序中,我们定义了一个Echo服务器,程序过程如下:

1. 定义一些配置信息;

2. 配置监听者(这里监听的是TCP协议的8080端口);

3. 创建管道信息解析器(此处使用的是LinePipelineFilter);

4. 创建服务(这里使用WebSocketPushSession);

5. 启动服务器

可以发现,使用Supersocket框架开发网络应用时,不仅简化了代码量,而且降低了框架的开发难度,支持智能化的配置,易于操作和扩展。

综合来看,无论是使用DotNetty框架还是Supersocket框架,都能够显著简化网络应用的开发,提高开发效率和运行效率。然而,我们需要根据开发需求、项目复杂度、团队经验等因素进行选择,并根据需求进行灵活定制,才能发挥其真正的作用。 如果你喜欢我们三七知识分享网站的文章, 欢迎您分享或收藏知识分享网站文章 欢迎您到我们的网站逛逛喔!https://www.37seo.cn/

点赞(114) 打赏

评论列表 共有 1 条评论

静已思之愈脓 1年前 回复TA

祝自己笑口常开,快乐常在。

立即
投稿
发表
评论
返回
顶部