C# socket 编程之 accept() 函数返回值解析

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/CV2017/article/details/83420328

accept() 函数会返回一个新的套接字,这个新的套接字在服务器端与客户端进行通信。

服务器端的绑定监听是一个套接字,与客户端通信的是另一个套接字(accept函数返回的套接字,注意这里不是返回客户端的套接字,返回的套接字是新建立在服务器上的,与客户端收发消息用的)

下面这段代码,是我在写公司业务代码时用到的,可以看一些关键点去理解我说的,比如服务器的绑定监听套接字是 socketWatch,与客户端收发消息的套接字是 sokClient

Thread threadWatch = null; // 负责监听客户端连接请求的 线程;
        Socket socketWatch = null; 
        Socket sokConnection = null;
        Dictionary<string, Socket> dict = new Dictionary<string, Socket>();
        Dictionary<string, Thread> dictThread = new Dictionary<string, Thread>();

        private void button1_Click(object sender, EventArgs e)
        {
            socketWatch = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);

            IPAddress address = IPAddress.Parse(textIP.Text.Trim());

            IPEndPoint endPoint = new IPEndPoint(address, int.Parse(textPort.Text.Trim()));
            try
            {
                // 将负责监听的套接字绑定到唯一的ip和端口上;
                socketWatch.Bind(endPoint);
            }
            catch (SocketException se)
            {
                MessageBox.Show("异常:" + se.Message);
                return;
            }
            // 设置监听队列的长度;
            socketWatch.Listen(10);
            // 创建负责监听的线程;
            threadWatch = new Thread(WatchConnecting);
            threadWatch.IsBackground = true;
            threadWatch.Start();
            ShowMsg("服务器启动监听成功!");
            //}
        }

        void ShowMsg(string str)
        {
            textMsg.AppendText(str + "\r\n");
        }

        //监听客户端
        void WatchConnecting()
        {
            while (true)
            {
                sokConnection = socketWatch.Accept(); // 一旦监听到一个客户端的请求,就返回一个与该客户端通信的 套接字;
                // 想列表控件中添加客户端的IP信息;
                lbOnline.Items.Add(sokConnection.RemoteEndPoint.ToString());
                // 将与客户端连接的 套接字 对象添加到集合中;
                dict.Add(sokConnection.RemoteEndPoint.ToString(), sokConnection);
                ShowMsg("客户端连接成功!"); //有一个 bug
                Thread thr = new Thread(RecMsg);
                thr.IsBackground = true;
                thr.Start(sokConnection);
                dictThread.Add(sokConnection.RemoteEndPoint.ToString(), thr);  //  将新建的线程 添加 到线程的集合中去。
            }
        }

        //接收消息
        void RecMsg(object sokConnectionparn)
        {
            Socket sokClient = sokConnectionparn as Socket;
            while (true)
            {
                byte[] arrMsgRec = new byte[1024 * 1024];
                // 将接受到的数据存入到输入  arrMsgRec中;
                try
                {
                    int iLength = sokClient.Receive(arrMsgRec);
                    string sStrReceMsg = Encoding.UTF8.GetString(arrMsgRec, 1, iLength);
                    string specialString = "DiChuang_te\0";
                    string[] sArr = sStrReceMsg.Split(';');

                    string sSqlPath = "D://LoginDB.db";
                    TeSQLite teSQL = new TeSQLite();
                    teSQL.teConnDB(sSqlPath);
                    if (teSQL.teCompareD(sArr[0], sArr[1]) && sArr[2] == specialString)
                    {
                        string returnStr = "A";
                        byte[] byteArray = System.Text.Encoding.Default.GetBytes(returnStr);
                        sokClient.Send(byteArray);
                    }
                    else
                    {
                        string returnStr = "B";
                        byte[] byteArray = System.Text.Encoding.Default.GetBytes(returnStr);
                        sokClient.Send(byteArray);
                    } 
                }

猜你喜欢

转载自blog.csdn.net/CV2017/article/details/83420328
今日推荐