NewLife.Net—开始网络编程

来源:大石头

cnblogs.com/nnhy/p/newlife_net_echo.html

网络编程的重要性就不说了,先上源码:

https://github.com/nnhy/NewLife.Net.Tests

一个服务端,就是监听一些端口,接收客户端连接和数据,进行处理,然后响应。

/// 定义服务端,用于管理所有网络会话

class MyNetServer : NetServer

{

}

/// 定义会话。每一个远程连接唯一对应一个网络会话,再次重复收发信息

class MyNetSession : NetSession

{

/// 客户端连接

public override void Start()

{

base.Start();

// 欢迎语

var str = String.Format("Welcome to visit ! []\r\n", Remote, Environment.MachineName);

Send(str);

}

/// 收到客户端数据

///

protected override void OnReceive(ReceivedEventArgs e)

{

WriteLog("收到:", e.Packet.ToStr());

// 把收到的数据发回去

Send(e.Packet);

}

}

服务端核心类是NetServer,一般来说,每个网络服务端都会写一个自己的类来继承NetServer,以方便编写自己的NetSession会话逻辑。

实在简单的应用,也可以直接实例化NetServer,然后通过事件来处理收到的连接和数据。

这里我们写了个MyNetServer,没有任何代码,仅仅是为了指定使用哪个网络会话类。

网络会话NetSession非常重要,每一个Tcp连接就对应一个会话,对Udp来说同一个远端套接字(IP+端口)就是一个会话。

网络会话最重要的有几块:

Start会话开始,Tcp三次握手之后,双方还没有发送数据包之前,此时可以做一些准备工作,或者向客户端发送欢迎语。Udp会话开始在第一个数据包达到时。

OnReceive接收,每次收到数据包以后,都会触发该方法,数据包位于e.Packet。Tcp默认同步处理,未完成当前数据包处理之前,不会接收本连接的下一个数据包。

Send发送。发送Packet数据包给本会话连接的客户端,扩展方法支持发送字符串或数据流。

注意:粘包问题在OnReceive之前处理,下回有专门文章分析,接收数据的ReceivedEventArgs里面还有个Message,支持编码器对数据包进行解码成为消息。

本例程是Echo回声程序,因此OnReceive把收到的数据包原样发回去。

服务端用法很简单

static NetServer _server;

static void TestServer()

{

// 实例化服务端,指定端口,同时在Tcp/Udp/IPv4/IPv6上监听

var svr = new MyNetServer

{

Port = 1234,

Log = XTrace.Log

};

svr.Start();

_server = svr;

}

指定端口和日志,然后就可以开始服务了。

默认在Tcp/Udp/IPv4/IPv6上监听,客户端爱用哪个协议来连接都行。

当然,NetServer还可以支持多个端口同时监听,共用数据处理代码。

客户端用法更简单

var uri = new NetUri("tcp://127.0.0.1:1234");

var client = uri.CreateRemote();

client.Log = XTrace.Log;

client.Received += (s, e) =>

{

XTrace.WriteLine("收到:", e.Packet.ToStr());

};

client.Open();

for (var i = 0; i

{

Thread.Sleep(1000);

var str = "你好" + (i + 1);

client.Send(str);

}

client.Dispose();

这里的NetUri直接从字符串里面解析协议、地址、端口,然后CreateRemote建立客户端。这里会自动识别Tcp/Udp。

也是指定日志,方便我们查看工作过程。还有两个开关 LogSend/LogReceive能输出更详细的数据包日志。

Received事件里面处理收到的数据包。

Open开始连接服务端,如果网络不同,这里会抛出异常。Tcp客户端有断线重连机制。

发送数据包也很简单,直接Send就好,高级应用需要在发送后等待响应数据,可以用 await SendAsync。

因为程序很简单,也可以用telnet命令来测试该服务端。

看完本文有收获?请转发分享给更多人

关注「DotNet」,提升.Net技能

淘口令:复制以下红色内容,再打开手淘即可购买

范品社,使用¥极客T恤¥抢先预览(长按复制整段文案,打开手机淘宝即可进入活动内容)

  • 发表于:
  • 原文链接http://kuaibao.qq.com/s/20180508B0FM1I00?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。

扫码关注云+社区

领取腾讯云代金券