开始网络编程

网络编程的重要性就不说了,先上源码:https://github.com/nnhy/NewLife.Net.Tests

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

/// <summary>定义服务端,用于管理所有网络会话</summary>class MyNetServer : NetServer<MyNetSession>{}/// <summary>定义会话。每一个远程连接唯一对应一个网络会话,再次重复收发信息</summary>class MyNetSession : NetSession<MyNetServer>{    /// <summary>客户端连接</summary>
    public override void Start()
    {         base.Start();        // 欢迎语
        var str = String.Format("Welcome to visit {1}!  [{0}]\r\n", Remote, Environment.MachineName);
        Send(str);
    }    /// <summary>收到客户端数据</summary>
    /// <param name="e"></param>
    protected override void OnReceive(ReceivedEventArgs e)
    {
        WriteLog("收到:{0}", e.Packet.ToStr());        // 把收到的数据发回去         Send(e.Packet);
    }
}

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

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

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

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

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

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

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

  3. 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("收到:{0}", e.Packet.ToStr());
};
client.Open();for (var i = 0; i < 5; 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命令来测试该服务端。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
在计算机网络编程领域中,Linux系统的网络编程技术有着非常重要的作用。如果要对Linux网络编程技术进行深入学习并掌握相关技术,在网络编程的基础知识学习之后,更需要好的网络编程指导书籍,其中之一就是《Linux网络编程》这本pdf。 该PDF以C语言为基础,主题集中在Linux系统下的socket编程。从最基础的使用socket创建TCP/IP连接,再到linux网络编程中比较重要的IO复用技术(如select/poll/epoll/kqueue),再到IPV6编程、网络安全以及多线程程序的编写,都有详细的说明和样例。此外,这本pdf还解释了许多难点读者通常会面临的系统调用和API,比如getaddrinfo、getnameinfo等。 总的来说,这本pdf具备以下七个方面的优点: 1. 适合初学者,从最基础的socket连接开始,循序渐进掌握网络编程技能。 2. 含有丰富的实例代码,读者可以从中学到标准的Linux网络编程模型。 3. 全面介绍IO复用的实现技术,能够有效提高服务端程序的并发能力和处理性能。 4. 在IPv6协议栈的更新和普及的背景下,该pdf更新了原有的IPv4编程技术,并为读者讲解了IPv6编程中需要注意的各种细节和改进。 5. 详细讲解了网络安全方面的内容,使读者了解到许多网络编程的安全问题和如何进行防范。 6. 内容简单易懂,配合详细的图示和实例代码,真正做到"所见所得"。 7. 不仅适合初学者,对于有经验的网络工程师也是一本很有价值的参考书,并能够解决许多实际网络编程场景中出现的问题。 因此,这本pdf对于想要学习Linux网络编程技术,从网络编程基础和IO复用技术的学习到网络安全、多线程程序以及IPv6编程的学习都具有非常大的参考价值,特别是对于初学者来说,经过深入学习后,能够对Linux网络编程技术有更加深入的理解,为参加面试和实际项目工作奠定更坚实的基础。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

智能大石头

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值