我写了一个UdpClient的简单通讯程序,在webform间通讯没有问题,只是用windows service作为服务端就不行了,请问有谁知道是怎么回事呢?windows service中加了日志功能 没有报错,upd.Receive(ref RemoteIpEndPoint)这一步阻止了 客服端发送只要是webform的服务端运行,发送就可以,windows service就不行

解决方案 »

  1.   

    所有的服务,不管是tcp、udp、http、namedpipe、msmq等等,都应该集成在windows service中的,所以这是正选。集成在winform或者console中,只是业余调试测试而已。
      

  2.   

    这是我写的方法 ,然后在windows service中通过一个线程调用,在 Byte[] receiveBytes = udpClient.Receive(ref RemoteIpEndPoint);这一步阻止了 ,等待接收客户端传来的消息  可是我客户端已经传出消息了 还是一直阻止
    public  void Main()
            {
               
                try
                {                UdpClient udpClient = new UdpClient(12000);                string returnData = "client_end";                do
                    {                    //Console.WriteLine("服务器端接收数据:.............................");                    IPEndPoint RemoteIpEndPoint = new IPEndPoint(IPAddress.Any, 0);                    // 此处通过引用传值,获得客户端的IP地址及端口号                    Byte[] receiveBytes = udpClient.Receive(ref RemoteIpEndPoint);                    //此处获得客户端的数据                    returnData = Encoding.UTF8.GetString(receiveBytes);                    //Encoding.ASCII.GetString(receiveBytes); 此处若用ASCII,不能正确处理中文                   
                       
                                            Thread.Sleep(3000);
                        //TextBox2.Text = "向客户端发送数据:.............................";
                        //Console.WriteLine("向客户端发送数据:.............................");                    udpClient.Connect(Dns.GetHostName().ToString(), 11000);                    // Sends a message to the host to which you have connected.                    string sendStr = "我来自服务器端:" + DateTime.Now.ToString();                    Byte[] sendBytes = Encoding.UTF8.GetBytes(sendStr);                    //Byte[] sendBytes = Encoding.ASCII.GetBytes(sendStr); 此处若用ASCII,不能正确处理中文                    udpClient.Send(sendBytes, sendBytes.Length);                    //Console.WriteLine("This is the message server send: " + sendStr);
                        //TextBox3.Text = "This is the message server send: " + sendStr;
                    } while (returnData != "client_end");            }            catch (Exception e)
                {                //Console.WriteLine(e.ToString());            }        }
      

  3.   

    通过一个线程调用?好吧,你是同步方法,我不管这个了。我看到你弄了个try...catch,这明显是掩盖任何异常,你不想调试bug吗?把try...catch去掉吧。至少在debug(而非release)模式下不应该有。实际上即使是在release模式下,你的程序也没有什么逻辑应该自欺欺人地掩盖异常,所以不需要try....catch。在复杂的服务器程序下(这些其实应该使用异步、而不是同步),使用try...catch也只是在对于收到的消息进行业务计算的环节,将抛出的异常在这个表现成转换为协议规定的错误信息然后send给客户端。只是对于一条“解析执行消息”的语句才进行try...catch,而不是对整个程序都弄try...catch。滥用它,你就无法调试了。
      

  4.   

    在你的“returnData = Encoding.UTF8.GetString(receiveBytes);”语句设置断点,当客户端向12000端口写数据,服务程序从来也进入不了断点吗?
      

  5.   

    用的是这个 根本没有捕捉到异常  因为我log里没有写入异常 只写到2222 就阻止了 在等待消息传入
    public void Main()
            {
                FileStream fs = new FileStream("D:\\log.txt", FileMode.OpenOrCreate, FileAccess.Write);
                StreamWriter m_streamWriter = new StreamWriter(fs);
                m_streamWriter.BaseStream.Seek(0, SeekOrigin.End);
                m_streamWriter.WriteLine("--------运行到哪里了:1--------" + DateTime.Now.ToString() + "\n");
                m_streamWriter.Flush();
                m_streamWriter.Close();
                fs.Close();
                try
                {
                    FileStream fs2 = new FileStream("D:\\log.txt", FileMode.OpenOrCreate, FileAccess.Write);
                    StreamWriter m_streamWrite2 = new StreamWriter(fs2);
                    m_streamWrite2.BaseStream.Seek(0, SeekOrigin.End);
                    m_streamWrite2.WriteLine("--------运行到哪里了:2--------" + DateTime.Now.ToString() + "\n");
                    m_streamWrite2.Flush();
                    m_streamWrite2.Close();
                    fs2.Close();
                    UdpClient udpClient = new UdpClient(12000);
                    FileStream fs22 = new FileStream("D:\\log.txt", FileMode.OpenOrCreate, FileAccess.Write);
                    StreamWriter m_streamWrite22 = new StreamWriter(fs22);
                    m_streamWrite22.BaseStream.Seek(0, SeekOrigin.End);
                    m_streamWrite22.WriteLine("--------运行到哪里了:22--------" + DateTime.Now.ToString() + "\n");
                    m_streamWrite22.Flush();
                    m_streamWrite22.Close();
                    fs22.Close();
                    string returnData = "client_end";                do
                    {                    //Console.WriteLine("服务器端接收数据:.............................");
                        FileStream fs222 = new FileStream("D:\\log.txt", FileMode.OpenOrCreate, FileAccess.Write);
                        StreamWriter m_streamWrite222 = new StreamWriter(fs222);
                        m_streamWrite222.BaseStream.Seek(0, SeekOrigin.End);
                        m_streamWrite222.WriteLine("--------运行到哪里了:222--------" + DateTime.Now.ToString() + "\n");
                        m_streamWrite222.Flush();
                        m_streamWrite222.Close();
                        fs222.Close();
                        IPEndPoint RemoteIpEndPoint = new IPEndPoint(IPAddress.Any, 0);
                        FileStream fs2222 = new FileStream("D:\\log.txt", FileMode.OpenOrCreate, FileAccess.Write);
                        StreamWriter m_streamWrite2222 = new StreamWriter(fs2222);
                        m_streamWrite2222.BaseStream.Seek(0, SeekOrigin.End);
                        m_streamWrite2222.WriteLine("--------运行到哪里了:2222--------" + DateTime.Now.ToString() + "\n");
                        m_streamWrite2222.Flush();
                        m_streamWrite2222.Close();
                        fs2222.Close();
                        // 此处通过引用传值,获得客户端的IP地址及端口号                    Byte[] receiveBytes = udpClient.Receive(ref RemoteIpEndPoint);                    //此处获得客户端的数据
                        FileStream fs22222 = new FileStream("D:\\log.txt", FileMode.OpenOrCreate, FileAccess.Write);
                        StreamWriter m_streamWrite22222 = new StreamWriter(fs22222);
                        m_streamWrite22222.BaseStream.Seek(0, SeekOrigin.End);
                        m_streamWrite22222.WriteLine("--------运行到哪里了:22222--------" + DateTime.Now.ToString() + "\n");
                        m_streamWrite22222.Flush();
                        m_streamWrite22222.Close();
                        fs22222.Close();
                        returnData = Encoding.UTF8.GetString(receiveBytes);                    //Encoding.ASCII.GetString(receiveBytes); 此处若用ASCII,不能正确处理中文                    //Console.WriteLine("This is the message server received: " + returnData.ToString());                    Thread.Sleep(3000);
                        //Console.WriteLine("向客户端发送数据:.............................");                    udpClient.Connect("192.168.1.33", 11000);                    // Sends a message to the host to which you have connected.                    string sendStr = "服务器时间:" + DateTime.Now.ToString();                    Byte[] sendBytes = Encoding.UTF8.GetBytes(sendStr);                    //Byte[] sendBytes = Encoding.ASCII.GetBytes(sendStr); 此处若用ASCII,不能正确处理中文                    udpClient.Send(sendBytes, sendBytes.Length);                } while (returnData != "client_end");            }            catch (Exception e)
                {
                    FileStream fs3 = new FileStream("D:\\log.txt", FileMode.OpenOrCreate, FileAccess.Write);
                    StreamWriter m_streamWrite3 = new StreamWriter(fs3);
                    m_streamWrite3.BaseStream.Seek(0, SeekOrigin.End);
                    m_streamWrite3.WriteLine("--------运行到哪里了:3--------" + DateTime.Now.ToString() + "\n");
                    m_streamWrite3.Flush();
                    m_streamWrite3.Close();
                    fs3.Close();
                    EventLogError(e);
                    return;            }        }
            public void EventLogError(Exception ex)
            {
                //string path = service.CreateFolder() + "\\" + "log.txt";
                FileStream fs = new FileStream("D:\\log.txt", FileMode.OpenOrCreate, FileAccess.Write);
                StreamWriter m_streamWriter = new StreamWriter(fs);
                m_streamWriter.BaseStream.Seek(0, SeekOrigin.End);
                m_streamWriter.WriteLine("--------出现异常--------" + DateTime.Now.ToString() + "\n");
                m_streamWriter.WriteLine(ex.ToString() + "\n");
                m_streamWriter.Flush();
                m_streamWriter.Close();
                fs.Close();
            }
      

  6.   

    捕获到异常?你的try...catch被滥用了,捕获不到异常。
      

  7.   

    我只看两行(或者说三行吧!)代码:UdpClient udpClient = new UdpClient(12000);
    IPEndPoint RemoteIpEndPoint = null;
    Byte[] receiveBytes = udpClient.Receive(ref RemoteIpEndPoint);
    然后你就可以设置断点,写一个三四行的客户端测试程序来向这个端口发送数据,看看断点是否中断、中断时receivBytes内容是什么。其它的代码能删除就删除吧,我看着乱,无暇找它们的bug。实际产品中不应该有这么多无意义的代码。
      

  8.   

    你的代码我一下看不出什么毛边。说句题外话,总的来说,udp本来就是不可靠的通讯。在本机测试时,假设发送端重复多次饭送数据速度比较快,那么服务端只有50%的数据可以被Receive返回也是正常的。如果要使用可靠通信,应该使用TCP而不是UDP。做产品应该使用异步服务方式,而不是出现什么线程、循环之类的程序。
      

  9.   

    本来也是用的tcp的  但是tcp怎么返回结果给客户端呢?我客户端是webform 这个网上也没有找到资料学疏才浅啊  我现在想实现的功能是webform发送消息给服务器  服务器用windows服务接收 然后处理 返回结果给webform