首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > C# >

C# C/S 异步通信有关问题

2012-12-24 
C#C/S异步通信问题一下代码在Winform中运行正常,但是在console中,执行到DoBeginAcceptTcpClient的listener

C# C/S 异步通信问题

一下代码在Winform中运行正常,但是在console中,执行到DoBeginAcceptTcpClient的  listener.BeginAcceptTcpClient(new AsyncCallback(this.DoAcceptTcpClientCallback), listener);后系统就运行结束了,请问是什么原因


    public void Start()
        {
            Thread t = new Thread(new ThreadStart(this.BeginListen));
            t.Start();
        }

        private void BeginListen()
        {
            try
            {
                IPAddress ip = IPAddress.Parse("127.0.0.1");
                TcpListener listener = new TcpListener(ip, Settings.Default.Port);
                listener.Start();
                Console.WriteLine("=====Socket文件服务开启=====");

                DoBeginAcceptTcpClient(listener);


            }
            catch (Exception ex)
            {
                Console.WriteLine("文件服务开启失败原因为:");
                Console.WriteLine(ex.Message);
            }
        }

        /// <summary>
        /// begin a new connection by asynchronous
        /// </summary>
        /// <param name="listener"></param>
        private void DoBeginAcceptTcpClient(TcpListener listener)
        {
            listener.BeginAcceptTcpClient(new AsyncCallback(this.DoAcceptTcpClientCallback), listener);
        }
        }


        private void DoAcceptTcpClientCallback(IAsyncResult ar)
        {

            try
            {
                TcpListener listener = ar.AsyncState as TcpListener;
                TcpClient tcpClient = listener.EndAcceptTcpClient(ar);

                NetworkStream netStream = tcpClient.GetStream();




                string remoteIp = tcpClient.Client.RemoteEndPoint.ToString();
                Console.WriteLine("Connect " + remoteIp);
         
                //add a new listener,so we can accept a new connection
                listener.BeginAcceptTcpClient(new AsyncCallback(this.DoAcceptTcpClientCallback), listener);

                string receive = string.Empty;
                //receive data 
                netStream.BeginRead(buffer, 0, buffer.Length, new AsyncCallback(DoReceiveCallback), netStream);
            }
            catch (Exception ex)
            {

                Console.WriteLine(ex.Message);
            }
        }


        private void DoReceiveCallback(IAsyncResult ar)
        {
            try
            {
                NetworkStream netStream = ar.AsyncState as NetworkStream;
                if (netStream == null)
                {
                    return;
                }
                int count = 0;
                try
                {
                    count = netStream.EndRead(ar);
                    netStream.BeginRead(buffer, 0, buffer.Length, new AsyncCallback(DoReceiveCallback), netStream);
                }
                catch { }

                string msg = System.Text.Encoding.Default.GetString(buffer, 0, count);
                             // Console.WriteLine(msg);


            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.Message);
            }
        }



[最优解释]
Server server = new Server();           
  server.Start(); 
在后面加一句Console.ReadLine();
[其他解释]
main函数里面的代码看看,估计是主线程结束了
[其他解释]
main中就直接调用了Start 函数

static void Main(string[] args)        {
            Server server = new Server();
            server.Start();
        }


[其他解释]
应该是线程问题,我最近也在研究C# Socket异步通信,还不是很了解,推荐你看一下《Visual C# 网络编程技术与实践》中异步通信的部分,希望对你有帮助
[其他解释]
我也觉得是主线程结束了,请问该怎么改呢
[其他解释]
引用:
我也觉得是主线程结束了,请问该怎么改呢


Server server = new Server();           
  server.Start(); 
在后面加一句Console.ReadLine(); 

热点排行