目前,我已实现了socket通信。现在想把侦听端做成托盘程序,可是由于侦听端是用死循环来实现侦听的,无法实现托盘程序,怎样才能实现让侦听端循环侦听,而又不是死循环。这样,我的托盘程序里的事件才起作用。

解决方案 »

  1.   

    侦听端为什么是死循环呢.
    是用时间Span来监听的吧.
    我以前是用多线程做的,一个线程监听,一个线程弄托盘,一个线程处理数据.
    不过这样很头疼,线程管理是个问题.你试试吧.
      

  2.   

    是用
    while(true){...}
    实现的,这个方法执行不完,托盘的双击事件无法激活
      

  3.   

    while(true)
    {
      ....}
    系统开销会增加。
      

  4.   

    我给你一个简单的例子,你可以参考一下。
    using System;
    using System.IO;
    using System.Net;
    using System.Net.Sockets;   
    using System.Collections.Generic;
    using System.Text;namespace Listener
    {
        class clsWinSockListener
        {
            private Socket sckListen;
            private Socket[] sckAccept = new Socket[5];
            private byte[] sndBuff;
            private byte[] revBuff;
            int useSck = 0;
            int port = 8080;        public void Listen()
            {
                
                IPAddress[] addr = Dns.GetHostAddresses(Dns.GetHostName() ); 
                IPEndPoint endpoint = new IPEndPoint(addr[0], 8080);
                 
                sckListen = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
                  
                sckListen.Bind(endpoint);  
                sckListen.Listen(10);
               
                sckListen.BeginAccept(Listen_Callback, sckListen);
                
            }        private void Listen_Callback(IAsyncResult ar)
            {
                Socket s = (Socket)ar.AsyncState;
                Socket s2 = s.EndAccept(ar);
                if (ar.IsCompleted)
                {
                    if (useSck >= 5)
                    {
                        string over = "403|";//假设服务端socket最大上限为5,超过5个就拒绝
                        sndBuff = Encoding.UTF8.GetBytes(over);
                        s2.Send(sndBuff);
                        s2.Disconnect(false);
                        s2.Close();
                        return;
                    }
                    port++;
                    string retus = "1000|" + port.ToString() ;
                    sckAccept[useSck] = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
                    IPAddress[] addr = Dns.GetHostAddresses(Dns.GetHostName());
                    IPEndPoint endpoint = new IPEndPoint(addr[0], port);
                    sckAccept[useSck].Bind(endpoint);
                    sckAccept[useSck].Listen(1);
                    sckAccept[useSck].BeginAccept(Commn_Callback, sckAccept[useSck]);
                    sndBuff = Encoding.UTF8.GetBytes(retus);
                    s2.Send(sndBuff);
                    Console.WriteLine("I am connected to " + IPAddress.Parse(((IPEndPoint)s2.RemoteEndPoint).Address.ToString()) + " on port number " + ((IPEndPoint)s2.RemoteEndPoint).Port.ToString());
                    s2.Disconnect(false); 
                    s2.Close();
                    useSck++;
                    sckListen.BeginAccept(Listen_Callback, sckListen);
                }
            }
              } 
    }
    这是异步方式的例子,很简单,没有考虑过多细节,比如像C端断开后,server端socket计数等问题,你看看吧。
    希望能有帮助。
      

  5.   


    这不是很底层的东西啊.
    lz:假如是你的CUP占用比较高的话.我觉得应该是你的程序逻辑可能有点问题.
    1个线程只需要处理接受和发送结果.
    1个线程处理业务逻辑
    ...
    这样的话应该没什么问题.问一下写Log了没有?你可以用Log监视啊
      

  6.   

    监听时不要用while(true),用异步的方法就可降低cpu使用率
      

  7.   

    谢谢各位!
    这几天忙另一个程序,还没来得及考虑CPU的利用率。
    终于有时间考虑CPU的问题了。Log监视?不明白
      

  8.   

    你好 可以把你实现的这个功能发给我看看不  我想学习这一块 谢谢
    [email protected]
      

  9.   

    一直监听的话CPU利用率是个问题。
      

  10.   


    当然可以,不过,现在还不完善,cpu利用率太高,等完成了,再发给你