Esempio n. 1
0
        public static void ReadCallback(IAsyncResult ar)
        {
            String content = String.Empty;

            //取回处理连接的Socket
            StateObject state         = (StateObject)ar.AsyncState;
            Socket      HandlerSocket = state.workSocket;

            //读取数据
            int bytesRead = HandlerSocket.EndReceive(ar);

            if (bytesRead > 0)
            {
                //如果读到了数据,可能因为缓存大小不足而未接收全部数据,应保存现有数据,然后递归调用继续读取
                state.stringBuilder.Append(Encoding.BigEndianUnicode.GetString(
                                               state.buffer, 0, bytesRead));

                //检查结束符位置
                content = state.stringBuilder.ToString();
                if (content.IndexOf(".") > -1)
                {
                    //读到了结束符,证明数据读取结束
                    //把结束符删去,新建一个线程,处理客户端输入的指令
                    content = content.Remove(content.Length - 1);
                    ClientThreadObject ClientConnection = new ClientThreadObject();
                    ClientConnection.socket = HandlerSocket;
                    ClientConnection.data   = content;
                    new Thread(DealClientInput).Start(ClientConnection);
                }
                else
                {
                    //未读到结束符,需要继续读取数据
                    HandlerSocket.BeginReceive(state.buffer, 0, StateObject.BufferSize, 0,
                                               new AsyncCallback(ReadCallback), state);
                }
            }
        }
        private static void DealClientInput(object ob)//处理客户端输入,需要在switch里加上各种命令的处理办法
        {
            ClientThreadObject ClientConnection = (ClientThreadObject)ob;
            Socket             ClientSocket     = ClientConnection.socket;
            String             ClientMessage    = ClientConnection.data;
            String             result           = String.Empty;

            string[] ClientMessages = ClientMessage.Split('@');
            //@为分隔符,判断第一个字符串

            /*为login时:登录。由孙博文于2020年6月9日19点29分完成
             * 为sql时:让服务器直接调用。由孙博文于2020年6月9日19点39分完成
             * 为teach时:教授选择课程。由孙博文于2020年6月10日13点06分开始挖坑
             * 为close时,关闭注册。
             * 为end时:选课结束。
             * 为start时:选课开始。
             * 为bill时:取得账单。
             *
             *
             */
            switch (ClientMessages[0])
            {
            case "login":
                result = CaseLogin(ClientMessages[1]);
                break;

            case "sql":
                result = CaseSQL(ClientMessages[1]);
                break;

            case "teach":
                result = CaseTeach(ClientMessages[1]);
                break;

            case "close":
                result = CaseClose();
                break;

            case "end":
                result = CaseEnd();
                break;

            case "start":
                result = CaseStart();
                break;

            case "bill":
                result = CaseBill(ClientMessages[1]);
                break;
            //在这里添加想要处理的命令,将结果赋值给result即可


            default:
                result = "Fail@无效命令";
                break;
            }

            //编码为字节
            byte[] byteData = Encoding.BigEndianUnicode.GetBytes(result);
            //发回客户端
            ClientSocket.BeginSend(byteData, 0, byteData.Length, 0,
                                   new AsyncCallback(SendCallback), ClientSocket);
        }