NewLife.Net——开始网络编程
网络编程的重要性就不说了,先上源码: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+端口)就是一个会话。
网络会话最重要的有几块:
- 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 = ,
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——开始网络编程的更多相关文章
- 猫哥网络编程系列:HTTP PEM 万能调试法
注:本文内容较长且细节较多,建议先收藏再阅读,原文将在 Github 上维护与更新. 在 HTTP 接口开发与调试过程中,我们经常遇到以下类似的问题: 为什么本地环境接口可以调用成功,但放到手机上就跑 ...
- python select网络编程详细介绍
刚看了反应堆模式的原理,特意复习了socket编程,本文主要介绍python的基本socket使用和select使用,主要用于了解socket通信过程 一.socket模块 socket - Low- ...
- Linux Socket 网络编程
Linux下的网络编程指的是socket套接字编程,入门比较简单.在学校里学过一些皮毛,平时就是自学玩,没有见识过真正的socket编程大程序,比较遗憾.总感觉每次看的时候都有收获,但是每次看完了之后 ...
- 猫哥网络编程系列:详解 BAT 面试题
从产品上线前的接口开发和调试,到上线后的 bug 定位.性能优化,网络编程知识贯穿着一个互联网产品的整个生命周期.不论你是前后端的开发岗位,还是 SQA.运维等其他技术岗位,掌握网络编程知识均是岗位的 ...
- 浅谈C#网络编程(一)
阅读目录: 基础 Socket编程 多线程并发 阻塞式同步IO 基础 在现今软件开发中,网络编程是非常重要的一部分,本文简要介绍下网络编程的概念和实践. Socket是一种网络编程接口,它是对传输层T ...
- C++11网络编程
Handy是一个简洁优雅的C++11网络库,适用于linux与Mac平台.十行代码即可完成一个完整的网络服务器. 下面是echo服务器的代码: #include <handy/handy.h&g ...
- Java - 网络编程
Java的网络编程学习,关于计算机基础的学习参考:计算机网络基础学习 - sqh. 参考:
- Linux网络编程-IO复用技术
IO复用是Linux中的IO模型之一,IO复用就是进程预先告诉内核需要监视的IO条件,使得内核一旦发现进程指定的一个或多个IO条件就绪,就通过进程进程处理,从而不会在单个IO上阻塞了.Linux中,提 ...
- Python Socket 网络编程
Socket 是进程间通信的一种方式,它与其他进程间通信的一个主要不同是:它能实现不同主机间的进程间通信,我们网络上各种各样的服务大多都是基于 Socket 来完成通信的,例如我们每天浏览网页.QQ ...
随机推荐
- Sqoop执行mysql删除语句
如果使用Sqoop删除mysql中的数据,并且传递动态日期参数,则使用下方的方法: 创建一个sh文件,内容如下: #!/bin/sh ## 环境变量生效 . /etc/profile #[调度删除导入 ...
- 如何在Cocos2D 1.0 中掩饰一个精灵(一)
大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处. 如果觉得写的不好请告诉我,如果觉得不错请多多支持点赞.谢谢! hopy ;) 原帖来自Ray Wunderlich写的精彩的文章 How To ...
- iOS学习新知识-加速计和陀螺仪
一.CoreMotion框架介绍 我们知道有一些iOS的应用,会有一些特殊的要求,比如: 电子罗盘指南针之类的应用:让我们知道方向. 运动类型软件:让我们知道我们跑步多少公里. 社交软件中的摇一摇功能 ...
- C++ Primer 有感(标准库map类型)
map是键-值对的集合.map类型通常可以理解为关联数组:可以使用键作为下标获取一个值,正如内置数组一样.而关联的本质在于元素的值于某个特定的键相关联,而并非通过元素在数组中的位置获取. 1.map对 ...
- Maven nexus安装、配置和使用
简介 Nexus 可以代理并缓存 Maven 构件,当 Maven 需要下载构件的时候,就不需要反复的请求中央仓库. 有些公司都不提供外网给项目组人员,因此就不能使用 Maven 访问 ...
- (四十四)TabBarController和NagivationController配合
如果既要使用TabBar分页,又要使用Nagivation导航,那么只能是TabBar为根,Nagivation为TabBar子视图,每一个TabBar对应一个Nagivation导航的一系列页面. ...
- javascript语法之流程控制语句
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- 认识一下Android 事件分发机制
1.引子 由于android是采用分层布局(可以想象成PS时的图层概念一样),这样才可以在有限大小的手机屏幕上完成一些复杂的操作.当手指点击屏幕开始,这些动作在各层之间如何传递?就引出了Android ...
- 程序压力测试、性能测试AB、Webbench、Tsung
负载生成器是一些生成用于测试的流量的程序.它们可以向你展示服务器在高负载的情况下的性能,以及让你能够找出服务器可能存在的问题.为了得到更加客观和准确的数值,应该从远程访问.局域网访问 ...
- 如何运行 rpcz python example
试着运行 rpcz-python 的 example.过程记录如下.假设protobuf-py已经按照protobuf的安装说明安装了.发现 protobuf-2.5.0版的python包是pytho ...