NewLife.Net——开始网络编程

时间:2022-12-30 09:58:05

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

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

/// <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 = ,
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 = ; i < ; i++)
{
Thread.Sleep(); var str = "你好" + (i + );
client.Send(str);
} client.Dispose();

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

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

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

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

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

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

NewLife.Net——开始网络编程的更多相关文章

  1. 猫哥网络编程系列:HTTP PEM 万能调试法

    注:本文内容较长且细节较多,建议先收藏再阅读,原文将在 Github 上维护与更新. 在 HTTP 接口开发与调试过程中,我们经常遇到以下类似的问题: 为什么本地环境接口可以调用成功,但放到手机上就跑 ...

  2. python select网络编程详细介绍

    刚看了反应堆模式的原理,特意复习了socket编程,本文主要介绍python的基本socket使用和select使用,主要用于了解socket通信过程 一.socket模块 socket - Low- ...

  3. Linux Socket 网络编程

    Linux下的网络编程指的是socket套接字编程,入门比较简单.在学校里学过一些皮毛,平时就是自学玩,没有见识过真正的socket编程大程序,比较遗憾.总感觉每次看的时候都有收获,但是每次看完了之后 ...

  4. 猫哥网络编程系列:详解 BAT 面试题

    从产品上线前的接口开发和调试,到上线后的 bug 定位.性能优化,网络编程知识贯穿着一个互联网产品的整个生命周期.不论你是前后端的开发岗位,还是 SQA.运维等其他技术岗位,掌握网络编程知识均是岗位的 ...

  5. 浅谈C&num;网络编程&lpar;一&rpar;

    阅读目录: 基础 Socket编程 多线程并发 阻塞式同步IO 基础 在现今软件开发中,网络编程是非常重要的一部分,本文简要介绍下网络编程的概念和实践. Socket是一种网络编程接口,它是对传输层T ...

  6. C&plus;&plus;11网络编程

    Handy是一个简洁优雅的C++11网络库,适用于linux与Mac平台.十行代码即可完成一个完整的网络服务器. 下面是echo服务器的代码: #include <handy/handy.h&g ...

  7. Java - 网络编程

    Java的网络编程学习,关于计算机基础的学习参考:计算机网络基础学习 - sqh.     参考:  

  8. Linux网络编程-IO复用技术

    IO复用是Linux中的IO模型之一,IO复用就是进程预先告诉内核需要监视的IO条件,使得内核一旦发现进程指定的一个或多个IO条件就绪,就通过进程进程处理,从而不会在单个IO上阻塞了.Linux中,提 ...

  9. Python Socket 网络编程

    Socket 是进程间通信的一种方式,它与其他进程间通信的一个主要不同是:它能实现不同主机间的进程间通信,我们网络上各种各样的服务大多都是基于 Socket 来完成通信的,例如我们每天浏览网页.QQ ...

随机推荐

  1. gradle项目中profile的实现

    gradle中并没有直接类似maven中的profile支持,只能变通的用其它方法来处理,在打包不同环境的应用时,通常会遇到二类问题: 一.不同的环境依赖的jar包不同 拿web开发来说,生产环境一般 ...

  2. 7个你可能不认识的CSS单位

    众所周知CSS技术我们虽然很熟悉,在使用的过程却很容易被困住,这让我们在新问题出现的时候变得很不利.随着web继续不断地发展,对于新技术新解决方案的要求也会不断增长.因此,作为网页设计师和前端开发人员 ...

  3. paip&period;调试js 查看元素事件以及事件断点

    paip.调试js  查看元素事件以及事件断点 ff 26 +firebug 查看不出来.. 360 ,虽然也是chrome 基础,但是开发工具烂阿,也是显示不出来.. 作者Attilax  艾龙,  ...

  4. 写hive db的两种方法

    方法1tmp_channel_hive_file="/tmp/tmp_channel_hive_file"tmp_channel_hive_file_new="/tmp/ ...

  5. 成功在神舟K650c-i7 d2(i7-4700MQ、HM87)上装好了Windows XP

    成功在神舟K650c-i7 d2(i7-4700MQ.HM87)上装好了Windows XP 本来已经在K650c上装好了Windows7.Windows8双系统,奈何某些旧软件只能在Windows ...

  6. win10安装数据库&colon;&lbrack;INS-13001&rsqb;

    升级win10系统之后,需要重新安装Oracle,因为在安装Oralce11g时,使用64位的会出现各种不兼容问题,我每次安装都是使用32位的数据库. 在安装时点击setup.exe之后,出现了:[I ...

  7. oracle-pl&sol;sql之一

    http://www.cnblogs.com/huyong/archive/2011/05/10/2041951.html#_Toc15837 SQL语言只是访问.操作数据库的语言,并不是一种具有流程 ...

  8. Eclipse For Android 代码自动提示功能

    Eclipse for android 实现代码自动提示智能提示功能,介绍 Eclipse for android 编辑器中实现两种主要文件 java 与 xml 代码自动提示功能,解决 eclips ...

  9. 【极值问题】【CF33C】 Wonderful Randomized Sum

    传送门 Description 给你一个数列\(A\),你可以选择任意一个前缀和任意一个后缀,前缀后缀可重合.给他们乘\(-1\).求最大能获得的序列和. Input 第一行是一个数\(n\)代表数列 ...

  10. linux top 各个标识的含义 详解

        top之前一直都是一知半解,今天周末加班,我的工作已经完成,在等同事吃饭,就把这个写下来. 第一行: top - 20:42:47 up 57 days,  1:25,  4 users,  ...