c/s 程序的 监听程序(做了个c/s的程序,按时间不同执行一个固定操作,怕它出问题会停止,需要个监听程序)
如何做
听到这个需求脑子空白 - -! 请大家给出意见和解决方案
(看看反响,明天再加分)
如何做
听到这个需求脑子空白 - -! 请大家给出意见和解决方案
(看看反响,明天再加分)
解决方案 »
- 多窗体在同一个主窗体的panel中显示的问题 求回答
- 关闭模式窗体
- c# webbrowser 问题
- 如何快速学习C#以达到能编写WINDOWS程序的程度?
- csc无法编译cs文件问题
- 我是C#新手,请高手们帮我把这个代码修改成访问SQL数据库的代码,原来是访问ACCESS的
- 两个数据库A和B有一个相同的表table1,如何实现把A.table1的一行记录插入到B.table1
- 怎么把Random生成的数组成员与其他数组的成员进行比较啊?(高手指导一下)
- C#小白问个很菜的问题。大家别笑话啊
- 谁知道在ADO.Net中如何产生一个数据库文件mdb然后连接到程序中?
- 论坛里面没人会转png图片???不是吧 大虾在哪
- 如何动态生成BS中的界面
要做个进程监听,取出进程表,看c/s程序是否运行即可。
用哪些类和方法呢?ms提供了吗?
希望大家帮帮忙,小弟不胜感激!~
就是在同一个系统下,监视c/s程序是否运行正常,
我想到的就只能看系统进程列表里,是否有这个c/s程序的进程在运行,如果没有给出提示 (c/s已经中断)
第一:
如果你的监控程序放在client端同一台PC上的话,那么你可以尝试从进程监控,防止client异常退出。
第二:
如果你只是担心你的client端SOCKT会挂掉,不与服务端通讯的话,那么你可以修改一下你的客户端,让你的客户端再启动一个线程,这个线程监听SOCKET,接收你的监听程序发送的信息,然后返回。返回的信息可以是你的Client当前SOCKET线程的状态等等。(其实这种办法。是我在写服务端程序的时候,用于获得服务端状态的一个做法)。
第一:
如果你的监控程序放在client端同一台PC上的话,那么你可以尝试从进程监控,防止client异常退出。
第二:
如果你只是担心你的client端SOCKT会挂掉,不与服务端通讯的话,那么你可以修改一下你的客户端,让你的客户端再启动一个线程,这个线程监听SOCKET,接收你的监听程序发送的信息,然后返回。返回的信息可以是你的Client当前SOCKET线程的状态等等。(其实这种办法。是我在写
监听程序两边都要写。
1、A程序周期性地将系统时间写入到一个公共资源,比如当地文本文件或数据库某个字段
2、B程序周期性地去检测这个资源,和当时的时间做对比,如果超过一定范围就认为A不正常工作,这时候可以先kill所有A的线程,然后重新启动A
另一个是监听上边程序的程序, 共同部署在同一台机器上,
需要两个程序互相监听 - -! 如果其中一个不工作了 怎么重新启动它呢 (process.Kill()后,怎么再重新启动它呢)
帖子已经加分,希望大家给出解答(不会薄了回贴人的)
不是有个Process类的嘛,好象可以运行程序
using System;
using System.Collections.Generic;
using System.Text;
using System.Diagnostics;
using System.Threading;
using LogLibrary;
using System.Windows.Forms;
namespace MonitorUtermServerProcess
{
class Program
{
static void Main(string[] args)
{
try
{
System.AppDomain.CurrentDomain.SetData("APP_CONFIG_FILE", System.Windows.Forms.Application.ExecutablePath + @".config"); }
catch
{
Console.WriteLine("读取指定的config文件失败,将读取默认的config文件");
}
try
{
ProcessObject ps = new ProcessObject(Properties.Settings.Default.ProcessPath, Properties.Settings.Default.ProcessName, Properties.Settings.Default.ProcessArgs);
Thread thread = new Thread(new ParameterizedThreadStart(Dowork));
thread.IsBackground = true;
thread.Start(ps);
}
catch (Exception ex)
{
Console.WriteLine("监视主程序异常" + ex.Message);
LogLibrary.LogRollingFile.Info("监视主程序异常" + ex.Message);
}
finally { Console.ReadLine(); }
} static void Dowork(object p)
{
ProcessObject ps = p as ProcessObject;
string pName = ps.ProcessName;
string pPath = ps.ProcessPath;
string pArgs = ps.ProcessArgs;
while (true)
{
try
{
bool isFindProcess = false;
Process[] processes = Process.GetProcesses();
//Console.WriteLine("是否在运行,Count:" + (processes == null ? " NUll" : processes.Length.ToString()));
if (processes != null)
{
foreach (Process pro in processes)
{ //Console.WriteLine(pro.ProcessName);
if (pName.ToLower() == pro.ProcessName.ToLower())
{
isFindProcess = true;
//Console.WriteLine("目标程序在运行");
break;
}
}
}
if (isFindProcess == false)
{
//重启程序
Console.WriteLine(pName + " 程序异常退出,准备重新启动 当前时间:"+DateTime.Now.ToString("yyyy-MM-dd HH:mm:sss"));
LogLibrary.LogRollingFile.Info(pName + " 程序异常退出,准备重新启动 当前时间 :" + DateTime.Now.ToString("yyyy-MM-dd HH:mm:sss"));
ProcessStartInfo info = new System.Diagnostics.ProcessStartInfo();
info.FileName = pPath;
info.Arguments = pArgs;
Process proc = new Process();
try
{
//
//启动外部程序
//
proc = System.Diagnostics.Process.Start(info);
}
catch (Exception ex)
{
Console.WriteLine("启动程序异常:" + ex.Message);
LogLibrary.LogRollingFile.Error(pName + "启动程序异常:" + ex.Message);
//return;
} }
//Sleep 30 秒
Thread.Sleep(Properties.Settings.Default.ThreadLoopTime);
}
catch (Exception exxx)
{
Console.WriteLine("监控程序异常:" + exxx.Message);
LogLibrary.LogRollingFile.Error(pName + "监控程序异常:" + exxx.Message);
}
}
}
} class ProcessObject
{
string processName = string.Empty;
string processPath =string.Empty;
string processArg = string.Empty;
public ProcessObject( string processpath,string processname,string processarg)
{
processPath = processpath;
processName = processname;
processArg = processarg;
}
public string ProcessName
{
get { return processName; }
}
public string ProcessPath
{
get { return processPath; }
}
public string ProcessArgs
{
get { return processArg; }
}
}
}
2个方面.
1是监视 进程.进程挂了必然就有问题.2是监视程序逻辑.这得看程序是怎么跑的了.
比如有的程序不负责socket通信 而只是简单的 SQL操作.还有的只是 简单的 写文本日志操作(几分钟写一个什么什么记录之类的)这样的话就得分类处理了.
写文件可以简单监视文件是否有变化.
写SQL可以简单监视SQL行.
可以使用:
string pName="文件名称";
bool isFindProcess = false;
Process[] processes = Process.GetProcesses();
if (processes != null)
{
foreach (Process pro in processes)
{
if (pName.ToLower() == pro.ProcessName.ToLower())
{
isFindProcess = true;
break;
}
}
}
if (isFindProcess == false)
{
ProcessStartInfo info = new System.Diagnostics.ProcessStartInfo();
info.FileName = "文件绝对路径";
info.Arguments = pArgs;
Process proc = new Process();
proc = System.Diagnostics.Process.Start(info);
以上为核心代码,稍加修改即可!最后记得把这段代码放到一个定时器控件中运行,定时器的执行时间随你自己设置!
主要就是process类和processStartInfo类的使用而已
IPHostEntry iphostendpoint = Dns.GetHostEntry(hostname);
IPAddress[] address = iphostendpoint.AddressList;
IPEndPoint ipep = new IPEndPoint(address[0], 8001);//建立远程计算机的的socket
receivesocket.Bind(ipep);
receivesocket.Listen(0);
监听,当有客户端连接就可以发送信息了