C#socket通讯服务器(连接状态监控)

class SocketServerManager
{
public delegate void ConnectStateEventHandler();
public event ConnectStateEventHandler ConnectedEvent;//客户端连线
public event ConnectStateEventHandler DisConnectedEvent;//客户端掉线

public delegate void ReceiveMsgEventHandler(byte[] order);
public event ReceiveMsgEventHandler ReceiveMsgEvent;

static Socket _socket = null;
static IPEndPoint iep = null;
static bool isListening = false;
static bool isConnected = false;
static Dictionary<EndPoint, Socket> dic = null;
static EndPoint ep = null;

public SocketServerManager(string strIP,int port)
{
_socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
IPAddress IP = IPAddress.Parse(strIP.Trim());
iep = new IPEndPoint(IP, port);
dic=new Dictionary<EndPoint,Socket>();
}

public void Start()
{
_socket.Bind(iep);
isListening = true;
Thread t = new Thread(Listen);
t.IsBackground = true;
t.Start();
}

private void Listen()
{
while (isListening)
{
_socket.Listen(0);
Socket newsocket = _socket.Accept();
if (ConnectedEvent != null) ConnectedEvent();
ep = newsocket.RemoteEndPoint;
dic.Add(ep, newsocket);
isConnected = true;
Thread t1 = new Thread(ReceiveMsg);
t1.IsBackground = true;
t1.Start();
}
}

private void ReceiveMsg()
{
while (isConnected)
{
byte[] buffer=new byte[32];
int count = dic[ep].Receive(buffer);
if (count > 0&&ReceiveMsgEvent != null)
{
ReceiveMsgEvent(buffer);
}
if (!IsSocketConnected(dic[ep]) && DisConnectedEvent != null)
{
DisConnectedEvent();
isConnected = false;
}
Thread.Sleep(200);
}
}

public void SendMsg(byte[] order)
{
dic[ep].Send(order,order.Length,SocketFlags.None);
}

private bool IsSocketConnected(Socket s)
{
return !((s.Poll(1000, SelectMode.SelectRead) && (s.Available == 0)) || !s.Connected);
}
}

时间: 2024-12-11 03:44:59

C#socket通讯服务器(连接状态监控)的相关文章

比isConnected()更靠谱的的获取socket实时连接状态!

看到这个标题,预计非常多人会说用socket.isConnected()或者socket.isClosed()等方法来推断即可了,但其实这些方法都是訪问socket在内存驻留的状态,当socket和server端建立链接后,即使socket链接断掉了,调用上面的方法返回的仍然是链接时的状态,而不是socket的实时链接状态.以下给出样例证明这一点. server端: package com.csc.server; import java.net.*; /** * @description 从这里

C#socket通讯客户端(连接状态监控,掉线重连)

public class SocketClientManager { public delegate void ConnectStateEventHandler(); public event ConnectStateEventHandler ConnectedEvent;//连接成功 public event ConnectStateEventHandler DisConnectedEvent;//连接失败 public delegate void ReceiveMsgEventHandler

Android线程中队UI进行操作、按钮长按实现连续发送命令的效果、检测socket与服务器连接状态

线程中设置UI问题: Android处于安全考虑,禁止在子线程中队系统的UI进行操作,因此,需要通过Handler对其进行处理. 在子线程中,当需要进行UI相关操作时,可通过Handler类实现. 1.在主线程中创建Handler,其功能为监听msg,当收到msg时进行一些操作 public Handler mHandler = new Handler() { public void handleMessage(Message msg) { switch (msg.what) {...}}} 2

zabbix监控nginx连接状态

zabbix学习笔记:zabbix监控nginx连接状态 zabbix监控nginx zabbix可以监控nginx的状态,关于一个服务的状态可以查看服务本身的状态(版本号.是否开启),还应该关注服务能力(例如以nginx的负载效果:连接数.请求数和句柄数).下面我们使用zabbix监控nginx. nginx的安装 如果想要查看nginx的服务状态,在对nginx进行源码安装的时候要选中–with-http_stub_status_module模块. 1.解压安装包: [[email prot

通过jkstatus监控JK-1.2.40连接状态

/** * 通过jkstatus监控JK-1.2.40连接状态 * ---------------------------------------------------------------------------------------------------------------------- * 配置jkstatus * 0)本文是建立在Apache与Tomcat采用JK的方式整合的基础上,整合过程详见http://blog.csdn.net/jadyer/article/detai

按照zabbix客户端及自定义监控nginx连接状态

一.下载客户端按照包,这里用rpm包安装 [[email protected] ~]# rpm -ivh http://repo.zabbix.com/zabbix/3.0/rhel/7/x86_64/zabbix-agent-3.0.4-1.el7.x86_64.rpm 修改客户端配置文件 Server=127.0.0.1 ServerActive=127.0.0.1 改为zabbix server实际的IP地址(比如zabbix server的IP地址为10.0.0.100) Server=

Linux系统下通过Socket文件描述符寻找连接状态

Proc虚拟文件系统下面有许多数字命名的子目录,这些数字表示系统当前运行的进程号: 其中/proc/N/fd目录下面保存了打开的文件描述符,指向实际文件的一个链接.如下: [[email protected]_10_1_17_138 song_test]# ll /proc/25465/fd total 0 lrwx------ 1 root root 64 Apr 14 09:36 0 -> /dev/pts/4 (deleted) lrwx------ 1 root root 64 Apr

实现LVS的持久连接以及健康状态监控功能

一.实现LVS的持久连接. 功能:无论ipvs使用何种scheduler,其都能够实现在指定时间范围内始终将来自同一个ip地址的请求发往同一个RS:此功能是通过lvs持久连接模板实现,其与调度方法无关. ①在LVS上设置一个虚拟网卡别名. ②在VIP上用iptables 打上标记,把80和443端口标记为99.  ③设置LVS的虚拟IP(VIP)和真实IP(DIP). ④测试.  [持久连接默认十分钟] 二.实现LVS健康状态监控功能. 实现监控状态监控基于持久连接的基础上进行试验. ①安装包

socket 如何判断远端服务器的连接状态?连接断开,需重连

fluent-logger-java is a Java library, to record events via Fluentd, from Java application. https://github.com/fluent/fluent-logger-java 使用该sdk过程发现,tcp连接断开之后,该sdk的重连机制无效. 2018-01-26 12:36:25,620 ERROR [org.fluentd.logger.sender.RawSocketSender] - <org