c/s 程序的 监听程序(做了个c/s的程序,按时间不同执行一个固定操作,怕它出问题会停止,需要个监听程序)
如何做
听到这个需求脑子空白 - -! 请大家给出意见和解决方案
(看看反响,明天再加分)

解决方案 »

  1.   

    请参考:http://topic.csdn.net/u/20081110/14/365f835c-5b20-4ea1-a65f-edfee0c6d9f7.html
      

  2.   

    做C/S程序,首先要确定是用UDP还是TCP如果是UDP的话,那么只要建立一个组件不停的监听远方发送来的数据,以及发送数据去远方,这个组件在客户端和服务器端都可以使用,这只是基本的.由于UDP不保证数据到达远方主机的完整性,所以最主要的还是要定义好自己的协议,在数据完整性检查上要做好处理,比如数据接收不全需要对方重发等问题都要有细致的处理!如果是使用TCP的话,那么就必需要建立好客户端组件和服务器端组件,因为两端在连接,监听方面的处理不同,所以需要分为两个不同的组件.这些基本工作做好后就可以定义自己的协议来传送数据,由于TCP的数据传输在完整性方面保证得比较好,所以在数据检查这部分不必费太多的神,不过这也和操作系统有关系,不同的操作系统因做不同的处理!总之C/S程序不是想象中的那么难做,但也没有想象中那么容易,主要还是要结合实际,因为每个项目的应用都不同,所以在实现上也会有很大的不同,不过本人也在学习这方面的知识,愿与楼主一起交流,学习!
      

  3.   

    今天和客户那边碰了一下,只要求在放c/s程序的那台服务器上监听这个程序即可。
    要做个进程监听,取出进程表,看c/s程序是否运行即可。
    用哪些类和方法呢?ms提供了吗? 
    希望大家帮帮忙,小弟不胜感激!~
      

  4.   

    我觉得做这个监听程序的意义不大,
    就是在同一个系统下,监视c/s程序是否运行正常,
    我想到的就只能看系统进程列表里,是否有这个c/s程序的进程在运行,如果没有给出提示 (c/s已经中断)
      

  5.   

    感觉你的这个C/S程序有点像跑批处理用的对象,或者轮询查询某些数据。
    第一:
    如果你的监控程序放在client端同一台PC上的话,那么你可以尝试从进程监控,防止client异常退出。
    第二:
    如果你只是担心你的client端SOCKT会挂掉,不与服务端通讯的话,那么你可以修改一下你的客户端,让你的客户端再启动一个线程,这个线程监听SOCKET,接收你的监听程序发送的信息,然后返回。返回的信息可以是你的Client当前SOCKET线程的状态等等。(其实这种办法。是我在写服务端程序的时候,用于获得服务端状态的一个做法)。
      

  6.   

    觉你的这个C/S程序有点像跑批处理用的对象,或者轮询查询某些数据。 
    第一: 
    如果你的监控程序放在client端同一台PC上的话,那么你可以尝试从进程监控,防止client异常退出。 
    第二: 
    如果你只是担心你的client端SOCKT会挂掉,不与服务端通讯的话,那么你可以修改一下你的客户端,让你的客户端再启动一个线程,这个线程监听SOCKET,接收你的监听程序发送的信息,然后返回。返回的信息可以是你的Client当前SOCKET线程的状态等等。(其实这种办法。是我在写
      

  7.   

    写个Windows服务程序不久可以了吗?
    监听程序两边都要写。
      

  8.   

    看楼主的意思是不是这样的:A是一个服务或者一直运行的程序,现在要做一个B,要不停检测A程序是否正常运行?如果是这样的话,我给你一个思路:
    1、A程序周期性地将系统时间写入到一个公共资源,比如当地文本文件或数据库某个字段
    2、B程序周期性地去检测这个资源,和当时的时间做对比,如果超过一定范围就认为A不正常工作,这时候可以先kill所有A的线程,然后重新启动A
      

  9.   

    我现在分成两个c/s程序实现,一个是根据时间片,执行一个操作数据库的方法(取数据发给其他服务器)
    另一个是监听上边程序的程序, 共同部署在同一台机器上,
    需要两个程序互相监听 - -! 如果其中一个不工作了 怎么重新启动它呢 (process.Kill()后,怎么再重新启动它呢)
    帖子已经加分,希望大家给出解答(不会薄了回贴人的)
      

  10.   

    要知道程序的路径
    不是有个Process类的嘛,好象可以运行程序
      

  11.   

    lZ说得是监视程序进程把,不是socket监听...很容易混淆的.
    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; }
            }
        }
    }
      

  12.   

    12楼在理.
    2个方面.
    1是监视 进程.进程挂了必然就有问题.2是监视程序逻辑.这得看程序是怎么跑的了.
    比如有的程序不负责socket通信 而只是简单的 SQL操作.还有的只是 简单的 写文本日志操作(几分钟写一个什么什么记录之类的)这样的话就得分类处理了.
    写文件可以简单监视文件是否有变化.
    写SQL可以简单监视SQL行.
      

  13.   

    楼主需要的是双进程守护技术吧,其实也就是在打开了C/S进程后再开启一个进程来遍历进程列表,如果发现进程列表里没有C/S进程的话那么立即重新启动C/S进程!
    可以使用:
                       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);
                            
    以上为核心代码,稍加修改即可!最后记得把这段代码放到一个定时器控件中运行,定时器的执行时间随你自己设置!
      

  14.   

    20楼和22楼已经说得很详细了
    主要就是process类和processStartInfo类的使用而已
      

  15.   

    我曾经写过一个维护windows服务的服务,就是说有一个服务程序需要的服务,为了怕这个服务自己退出或其他什么不正常的,就写了另一个服务来维护这个服务,也就是当我这个服务自己退出后,我的另一个维护此服务的服务会自动是这个服务启动,正常工作,可以自己设置监听的时间。比如说5秒一次!!
      

  16.   

    Socket receivesocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
    IPHostEntry iphostendpoint = Dns.GetHostEntry(hostname);
    IPAddress[] address = iphostendpoint.AddressList;
    IPEndPoint ipep = new IPEndPoint(address[0], 8001);//建立远程计算机的的socket
    receivesocket.Bind(ipep);
    receivesocket.Listen(0);
    监听,当有客户端连接就可以发送信息了