自己写调度器,就要从tcp通信入手;心跳的实现除了使用socket,想不到其他任何方案。

socket基本使用demo:

  • Socket Client:
  static void Main(string[] args)
{
Socket c; //int port = 4029;
// 避免使用127.0.0.1,我在本机测试是不能运行的
//string host = "127.0.0.1";
//IPAddress ip = IPAddress.Parse(host);
//IPEndPoint ipe = new IPEndPoint(ip, port);//把ip和端口转化为IPEndPoint实例
string ip = string.Empty;
System.Net.IPHostEntry IpEntry = System.Net.Dns.GetHostEntry(System.Net.Dns.GetHostName());
for (int i = ; i != IpEntry.AddressList.Length; i++)
{
if (!IpEntry.AddressList[i].IsIPv6LinkLocal)
{
ip = IpEntry.AddressList[i].ToString();
}
}
IPEndPoint ipend = new IPEndPoint(IPAddress.Parse(ip), ); c = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);//创建一个Socket try
{
c.Connect(ipend);//连接到服务器 Console.WriteLine("连接到Socket服务端..."); Console.WriteLine("发送消息到服务端...");
string sendStr = "m s g";
byte[] bs = Encoding.Default.GetBytes(sendStr);
c.Send(bs, bs.Length, ); string recvStr = "";
byte[] recvBytes = new byte[];
int bytes;
bytes = c.Receive(recvBytes, recvBytes.Length, );//从服务器端接受返回信息
recvStr += Encoding.Default.GetString(recvBytes, , bytes); Console.WriteLine("服务器返回信息:" + recvStr);
}
catch (ArgumentNullException ex1)
{
Console.WriteLine("ArgumentNullException:{0}", ex1);
}
catch (SocketException ex2)
{
Console.WriteLine("SocketException:{0}", ex2);
}
//string ip = string.Empty;
//System.Net.IPHostEntry IpEntry = System.Net.Dns.GetHostEntry(System.Net.Dns.GetHostName());
//for (int i = 0; i != IpEntry.AddressList.Length; i++)
//{
// if (!IpEntry.AddressList[i].IsIPv6LinkLocal)
// {
// ip = IpEntry.AddressList[i].ToString();
// }
//}
//IPEndPoint ipend = new IPEndPoint(IPAddress.Parse(ip), 8889);
//Socket sc = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
//sc.Connect(ipend);
//string message = "请升级软件";
//byte[] bt = Encoding.GetEncoding("gb2312").GetBytes(message);
//sc.Send(bt, bt.Length, 0);
//byte[] rebuff = new byte[1024];
//int recive = sc.Receive(rebuff, rebuff.Length, 0);
//string returnval = "";
//returnval += Encoding.GetEncoding("gb2312").GetString(rebuff, 0, recive); sc.Close();
//Console.WriteLine(returnval); Console.ReadKey();
}
  • Socket Server:
  class Program
{
static SocketListener listener; public static void Main(string[] args)
{
System.Timers.Timer t = new System.Timers.Timer();
//实例化Timer类,设置间隔时间为5000毫秒;
t.Elapsed += new System.Timers.ElapsedEventHandler(CheckListen);
//到达时间的时候执行事件;
t.AutoReset = true;
t.Start(); listener = new SocketListener();
listener.ReceiveTextEvent += new SocketListener.ReceiveTextHandler(ShowText);
listener.StartListen(); // 客户最近提出一个需求,要在WEB上远程管理客户端软件。那我们就仿路由器那种模式用SOCKET来解决吧。做了个DEMO,本机测试OK,拿到别的机器上做服务器,
//提示由于目标机器积极拒绝,无法连接。查询各种资料,有的说是端口没开,有的说是服务没开。各种雾水啊!仔细一想,问题可能出在本机在局域网IP上,
//而不是用127.0.0.1。更正代码后,问题解决。下面演示服务器端代码的关键部分。
//string ip = "";
//System.Net.IPHostEntry IpEntry = System.Net.Dns.GetHostEntry(System.Net.Dns.GetHostName());
//for (int i = 0; i != IpEntry.AddressList.Length; i++)
//{
// if (!IpEntry.AddressList[i].IsIPv6LinkLocal)
// {
// ip = IpEntry.AddressList[i].ToString();
// }
//} //IPEndPoint ipend = new IPEndPoint(IPAddress.Parse(ip), 8889);
//Socket sc = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
//sc.Bind(ipend); //Socket acc; //while (true)
//{
// sc.Listen(1);
// acc = sc.Accept();
// byte[] buff = new byte[1024];
// int recbyte = acc.Receive(buff, buff.Length, 0);
// if (recbyte == 0)
// break;
// string reciveval = "";
// reciveval += Encoding.Default.GetString(buff, 0, recbyte); // Console.WriteLine(reciveval);
// string returnValue = "Accepted";
// byte[] returnBy = Encoding.Default.GetBytes(returnValue);
// acc.Send(returnBy, returnBy.Length, 0);
//} //acc.Close();
//sc.Close(); Console.ReadKey();
} private static void ShowText(string text)
{
Console.WriteLine(text);
} private static void CheckListen(object sender, System.Timers.ElapsedEventArgs e)
{
if (listener != null && listener.Connection != null)
{
Console.WriteLine("连接数:" + listener.Connection.Count.ToString());
}
}
} public class Connection
{
Socket _connection; public Connection(Socket socket)
{
_connection = socket;
} public void WaitForSendData()
{
try
{
while (true)
{
byte[] bytes = new byte[];
string data = ""; //等待接收消息
int bytesRec = this._connection.Receive(bytes); if (bytesRec == )
{
// ReceiveText("客户端[" + _connection.RemoteEndPoint.ToString() + "]连接关闭...");
break;
} data += Encoding.UTF8.GetString(bytes, , bytesRec);
ReceiveText("收到消息:" + data); string sendStr = "服务端已经收到信息!";
byte[] bs = Encoding.UTF8.GetBytes(sendStr);
_connection.Send(bs, bs.Length, );
}
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
} public delegate void ReceiveTextHandler(string text);
public event ReceiveTextHandler ReceiveTextEvent;
private void ReceiveText(string text)
{
if (ReceiveTextEvent != null)
{
ReceiveTextEvent(text);
}
}
} public class SocketListener
{
public Hashtable Connection = new Hashtable(); public void StartListen()
{
Agine:
try
{
//端口号、IP地址
//int port = 8889;
//string host = "127.0.0.1";
//IPAddress ip = IPAddress.Parse(host);
//IPEndPoint ipe = new IPEndPoint(ip, port);
string ip = string.Empty;
System.Net.IPHostEntry IpEntry = System.Net.Dns.GetHostEntry(System.Net.Dns.GetHostName());
for (int i = ; i != IpEntry.AddressList.Length; i++)
{
if (!IpEntry.AddressList[i].IsIPv6LinkLocal)
{
ip = IpEntry.AddressList[i].ToString();
}
}
IPEndPoint ipend = new IPEndPoint(IPAddress.Parse(ip), );
//创建一个Socket类
Socket s = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
s.Bind(ipend);//绑定2000端口
s.Listen();//开始监听 ReceiveText("启动Socket监听..."); while (true)
{
Socket connectionSocket = s.Accept();//为新建连接创建新的Socket ReceiveText("客户端[" + connectionSocket.RemoteEndPoint.ToString() + "]连接已建立..."); Connection gpsCn = new Connection(connectionSocket);
gpsCn.ReceiveTextEvent += new Connection.ReceiveTextHandler(ReceiveText); Connection.Add(connectionSocket.RemoteEndPoint.ToString(), gpsCn); //在新线程中启动新的socket连接,每个socket等待,并保持连接
Thread thread = new Thread(new ThreadStart(gpsCn.WaitForSendData));
thread.Name = connectionSocket.RemoteEndPoint.ToString();
thread.Start();
}
}
catch (ArgumentNullException ex1)
{
ReceiveText("ArgumentNullException:" + ex1);
}
catch (SocketException ex2)
{
ReceiveText("SocketException:" + ex2);
} goto Agine;
} public delegate void ReceiveTextHandler(string text);
public event ReceiveTextHandler ReceiveTextEvent;
private void ReceiveText(string text)
{
if (ReceiveTextEvent != null)
{
ReceiveTextEvent(text);
}
}
}

代码实现参考:http://blog.bossma.cn/csharp/csharp_socket_example/

https://msdn.microsoft.com/zh-cn/library/System.Net.Sockets.Socket(v=vs.100).aspx

.net 调度器怎么实现心跳(socket除了他,没选择吧)的更多相关文章

  1. linux cfs调度器_理论模型

    参考资料:<调度器笔记>Kevin.Liu <Linux kernel development> <深入Linux内核架构> version: 2.6.32.9 下 ...

  2. Yarn 调度器Scheduler详解

    理想情况下,我们应用对Yarn资源的请求应该立刻得到满足,但现实情况资源往往是有限的,特别是在一个很繁忙的集群,一个应用资源的请求经常需要等待一段时间才能的到相应的资源.在Yarn中,负责给应用分配资 ...

  3. 05-k8s调度器、预选策略、优选函数

    目录 k8s调度器.预选策略.优选函数 节点选择过程 调度器 预选策略 优选函数 高级调度设置机制 node选择器/node亲和调度 pod亲和性 污点调度 Taints 与 Tolerations ...

  4. YARN调度器(Scheduler)详解

    理想情况下,我们应用对Yarn资源的请求应该立刻得到满足,但现实情况资源往往是有限的,特别是在一个很繁忙的集群,一个应用资源的请求经常需要等待一段时间才能的到相应的资源.在Yarn中,负责给应用分配资 ...

  5. 监听器初始化Job、JobTracker相应TaskTracker心跳、调度器分配task源码级分析

    JobTracker和TaskTracker分别启动之后(JobTracker启动流程源码级分析,TaskTracker启动过程源码级分析),taskTracker会通过心跳与JobTracker通信 ...

  6. Erlang/OTP 17.0-rc1 新引入的"脏调度器"浅析

    最近在做一些和 NIF 有关的事情,看到 OTP 团队发布的 17 rc1 引入了一个新的特性“脏调度器”,为的是解决 NIF 运行时间过长耗死调度器的问题.本文首先简单介绍脏调度器机制的用法,然后简 ...

  7. CDN调度器HAProxy、Nginx、Varnish

    http://www.ttlsa.com/web/the-cdn-scheduler-nginx-haproxy-varnish/ CDN功能如下:1.将全网IP分为若干个IP段组,分组的依据通常是运 ...

  8. MapReduce多用户任务调度器——容量调度器(Capacity Scheduler)原理和源码研究

    前言:为了研究需要,将Capacity Scheduler和Fair Scheduler的原理和代码进行学习,用两篇文章作为记录.如有理解错误之处,欢迎批评指正. 容量调度器(Capacity Sch ...

  9. yarn的调度器

    三种调度器 1.FIFO Scheduler 把应用按提交的顺序排成一个队列,这是一个先进先出队列,在进行资源分配的时候,先给队列中最头上的应用进行分配资源,等最前面的应用需求满足后再给下一个分配,以 ...

随机推荐

  1. Yii源码阅读笔记(五)

    Object 是一个基础类,实现了属性的功能,其基本内容如下: namespace yii\base; use Yii; /** * Object is the base class that imp ...

  2. a compromise between lock overhead and data safety

    High Performance My SQL  THIRD EDITION A locking strategy is a compromise between lock overhead and ...

  3. 统计学习方法笔记 -- Boosting方法

    AdaBoost算法 基本思想是,对于一个复杂的问题,单独用一个分类算法判断比较困难,那么我们就用一组分类器来进行综合判断,得到结果,"三个臭皮匠顶一个诸葛亮" 专业的说法, 强可 ...

  4. mina学习(一)

    Mina:是一个帮助用户开发高性能和高伸缩性网络应用程序的框架 学习地址链接:http://www.cnblogs.com/xuekyo/archive/2013/03/06/2945826.html ...

  5. Lazarus中TScreen类使用介绍

    描述:虚拟屏幕(桌面)可以包含多个物理显示器.Screen对象是鼠标指针.字体.窗体. 对于Delphi兼容的(不可见)DataModules也被列出了. 同时也追踪当前活动窗体窗体.控件和指针. S ...

  6. jsonObject jsonarray

    1.JAR包简介 要使程序可以运行必须引入JSON-lib包,JSON-lib包同时依赖于以下的JAR包: commons-lang.jar commons-beanutils.jar commons ...

  7. nodejs 基本类型和语法

    写在前面 今天想要查下Node的类型什么的知识,想要总结下,在Googol上看到一个文章,但是原始的链接不在了,在快照中把这篇文章拉出来,如果原作者有问题,请联系我! 该文章都是一些JS的基础,高手自 ...

  8. 业界有很多MQ产品

    目前业界有很多MQ产品,我们作如下对比: RabbitMQ 是使用Erlang编写的一个开源的消息队列,本身支持很多的协议:AMQP,XMPP, SMTP, STOMP,也正是如此,使的它变的非常重量 ...

  9. java JDK8 学习笔记——第17章 反射与类加载器

    第十七章 反射与类加载器 17.1 运用反射 反射:.class文档反映了类基本信息,从Class等API取得类信息的方式称为反射. 17.1.1 Class与.class文档 1.java.lang ...

  10. Redis学习笔记--五种数据类型的使用场景

    String 1.String 常用命令: 除了get.set.incr.decr mget等操作外,Redis还提供了下面一些操作: 获取字符串长度 往字符串append内容 设置和获取字符串的某一 ...