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); }