学前必读
https://blog.csdn.net/zhanxxiao/article/details/106819756

由于项目需要,公司的后端迟迟无法就位,自己便利用 C# 搭建了一套简单的服务器项目。
整个服务器的框架使用到 MVC 设计思想:
涉及到的系统有:
登录、注册、房间等
废话不多说,上代码了

1、客户端和服务器共享工程
在这里插入图片描述

namespace ShareProject
{/// <summary>/// 服务器与客户端通讯协议/// </summary>public enum ActionCode{None,           //默认为null不处理Login,          //登录Register,       //注册ListRoom,       //房间列表集合CreateRoom,     //创建房间JoinRoom,       //加入房间UpdateRoom,     //更新房间状态QuitRoom,       //退出房间StartGame,      //开始游戏ShowTimer,      //显示倒计时StartPlay,      //进入游戏Move           //移动}
}
/// <summary>
/// 客户端请求
/// </summary>
namespace ShareProject
{/// <summary>/// 客户端请求/// </summary>public enum RequestCode{None,   //默认为nullUser,   //用户请求Room,   //房间请求Game    //游戏进行中请求}
}
using System;
using System.Collections.Generic;
using System.Text;namespace ShareProject
{/// <summary>/// 执行状态/// </summary>public enum ReturnCode{Success,Fail,NotFound}
}
using System;
using System.Collections.Generic;
using System.Text;/// <summary>
/// 角色类型
/// </summary>
namespace ShareProject
{public enum RoleType{Blue,Red}
}

接下来就是我们的服务器核心的代码:如果下图所示,依次共享源码:
在这里插入图片描述

using MySql.Data.MySqlClient;
using ServerFrameworkProject.Model;
using ServerFrameworkProject.Servers;
using ServerFrameworkProject.Tool;
using ShareProject;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net.Sockets;
using System.Text;
using System.Threading.Tasks;/// <summary>
/// 客户端集合
/// </summary>
namespace ServerFrameworkProject
{class Client{public Socket clientSocket;private Server server;private Message msg = new Message();private MySqlConnection mysqlConn;private Room room;//用户private User user;/// <summary>/// 房间/// </summary>public Room Room{get{return room;}set{room = value;}}public MySqlConnection MYSQLConn{get{return mysqlConn;}}//设置数据public void SetUserData(User user){this.user = user;}public int GetUserID(){return user.id;}//获取数据public string GetUserData(){//组拼字符串return user.id + "," + user.userName + "," ;}public Client(){}public Client(Socket clientSocket, Server server){this.clientSocket = clientSocket;this.server = server;mysqlConn = ConnHelper.Connect();}/// <summary>/// 开启监听/// </summary>public void Start(){if (clientSocket == null || clientSocket.Connected == false){Console.WriteLine("客户端连接已断开..." + "当前在线客户端个数:");return;}//开启接收clientSocket.BeginReceive(msg.Data, msg.StartIndex, msg.RemainSize, SocketFlags.None, ReceiveCallBack, null);}/// <summary>/// 回调函数/// </summary>/// <param name="ar"></param>private void ReceiveCallBack(IAsyncResult ar){try{if (clientSocket == null || clientSocket.Connected == false){Console.WriteLine(clientSocket.Connected + "客户端已退出");return;}//接收数据的长度int count = clientSocket.EndReceive(ar);if (count == 0){//断开连接CloseConnect();}//todo 处理接收到的数据、count 为新消息的数量msg.ReadMessage(count, OnProcessMessage);Start();}catch (Exception e){Console.WriteLine("异常信息" + e);CloseConnect();}}/// <summary>/// 回调函数/// </summary>/// <param name="requestCode"></param>/// <param name="actionCode"></param>/// <param name="data"></param>private void OnProcessMessage(RequestCode requestCode, ActionCode actionCode, string data){server.HandleRequest(requestCode, actionCode, data, this);}/// <summary>/// 关闭连接/// </summary>private void CloseConnect(){//关闭跟客户端的连接ConnHelper.CloseConnection(mysqlConn);if (clientSocket != null){Console.WriteLine(clientSocket.Connected + "客户端已断开");//关闭 socketclientSocket.Close();}//如果不在任何房间if (room != null){room.QuitRoom(this);}server.RemoveClient(this);}/// <summary>/// 数据包装/// </summary>/// <param name="actionCode"></param>/// <param name="data"></param>public void Send(ActionCode actionCode, string data){try{//需要传输的数据byte[] bytes = Message.PackData(actionCode, data);clientSocket.Send(bytes);}catch (Exception e){Console.WriteLine("客户端已离去:" + e);}}/// <summary>/// 判断自身是否为房主/// </summary>/// <returns></returns>public bool IsHouseOwner(){return room.IsHouseOwner(this);}}
}
using ServerFrameworkProject.Servers;
using ShareProject;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;namespace ServerFrameworkProject.Controller
{/// <summary>/// 抽象控制基类/// </summary>class BaseController : IBaseController{protected RequestCode requestCode = RequestCode.None;public RequestCode RequestCode{get{return requestCode;}}/// <summary>/// 默认请求、没有指定 ActionCode的时候/// </summary>/// <param name="data"></param>/// <param name="client"></param>/// <param name="server"></param>/// <returns></returns>public virtual string DefaultHandle(string data, Client client, Server server){//不给客户端返回任何东西return null;}}
}
using ServerFrameworkProject.Servers;
using ShareProject;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
using System.Text;
using System.Threading.Tasks;namespace ServerFrameworkProject.Controller
{/// <summary>/// 控制器管理者/// </summary>class ControllerManager{//存储 controllerprivate Dictionary<RequestCode, BaseController> controllerDic = new Dictionary<RequestCode, BaseController>();private Server server;public ControllerManager(Server server){this.server = server;InitController();}/// <summary>/// 初始化所有的控制器/// </summary>private void InitController(){DefaultController defaultController = new DefaultController();controllerDic.Add(defaultController.RequestCode, defaultController);controllerDic.Add(RequestCode.User, new UserController());controllerDic.Add(RequestCode.Room, new RoomController());controllerDic.Add(RequestCode.Game, new GameController());}/// <summary>/// 处理请求/// </summary>/// <param name="requestCode"></param>/// <param name="actionCode"></param>public void HandleRequest(RequestCode requestCode, ActionCode actionCode, string data, Client client){//通过requestCode找到对应的 BaseControllerBaseController controller;bool isGet = controllerDic.TryGetValue(requestCode, out controller);if (isGet == false){Console.WriteLine("无法获取[" + requestCode + "]对应的 Controller,无法处理请求");return;}//处理请求、通过反射调用 Ctrl 得到方法//枚举类型转字符串string methodName = Enum.GetName(typeof(ActionCode), actionCode);//根据方法名得到方法信息MethodInfo mi = controller.GetType().GetMethod(methodName);if (mi == null){Console.WriteLine("[警告]在 Controller[" + controller.GetType() + "] 中没有对应的处理方法:[" + methodName + "]");}object[] parameters = new object[] { data, client, server };//如果 MethodInfo 存在、调用 methodNameobject obj = mi.Invoke(controller, parameters);//obj 为空或者为空字符串if (obj == null || string.IsNullOrEmpty(obj as string)){return;}//向客户端发起响应、obj为返回的数据server.SendResponse(client, actionCode, obj as string);}}
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;namespace ServerFrameworkProject.Controller
{/// <summary>/// 默认处理/// </summary>class DefaultController:BaseController{public DefaultController(){}}
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using ServerFrameworkProject.Servers;
using ShareProject;namespace ServerFrameworkProject.Controller
{/// <summary>/// 游戏逻辑控制者/// </summary>class GameController:BaseController{public GameController(){requestCode = RequestCode.Game;}/// <summary>/// 开始游戏按钮处理/// </summary>/// <param name="data"></param>/// <param name="client"></param>/// <param name="server"></param>/// <returns></returns>public string StartGame(string data, Client client, Server server){Console.WriteLine("等待房主开始游戏...");//是房主的时候if (client.IsHouseOwner()){Console.WriteLine("房主正在开始游戏...");Room room = client.Room;//消息广播room.BroadCastMessage(client, ActionCode.StartGame, ((int)ReturnCode.Success).ToString());//开始计时room.ShowTimer();return ((int)ReturnCode.Success).ToString();}else{Console.WriteLine("您不是房主,无法开始游戏");return ((int)ReturnCode.Fail).ToString();}}/// <summary>/// 同步位置/// </summary>/// <param name="data"></param>/// <param name="client"></param>/// <param name="server"></param>/// <returns></returns>public string Move(string data, Client client, Server server){Console.WriteLine("开始移动");//得到房间给其他人发送消息Room room = client.Room;if (room != null){//发送消息到其他客户端room.BroadCastMessage(client, ActionCode.Move, data);}//当前客户端无需响应return null;}}
}
using ServerFrameworkProject.Servers;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;namespace ServerFrameworkProject.Controller
{/// <summary>/// 默认处理接口方法/// </summary>interface IBaseController{string DefaultHandle(string data, Client client, Server server);}
}
using ServerFrameworkProject.Servers;
using ShareProject;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;namespace ServerFrameworkProject.Controller
{/// <summary>/// 房间处理/// </summary>class RoomController:BaseController{public RoomController(){requestCode = RequestCode.Room;}public string CreateRoom(string data, Client client, Server server){Console.WriteLine("房主创建房间成功");//创建房间server.CreateRoom(client);//返回成功以及角色类型、默认房主为蓝色return ((int)ReturnCode.Success).ToString() + "," + ((int)RoleType.Blue).ToString();//return ((int)ReturnCode.Success).ToString();}/// <summary>/// 房间列表信息/// </summary>/// <param name="data"></param>/// <param name="client"></param>/// <param name="server"></param>/// <returns></returns>public string ListRoom(string data, Client client, Server server){Console.WriteLine("房间当前玩家信息...");//组拼房间信息StringBuilder stringBuilder = new StringBuilder();foreach (Room room in server.GetRommList()){//判断房间状态if (room.IsWaitingJoin()){//房间信息添加stringBuilder.Append(room.GetHouseOwnerDara() + "|");}}//空字符串if (stringBuilder.Length == 0){stringBuilder.Append("0");}else{//有数据stringBuilder.Remove(stringBuilder.Length - 1, 1);}return stringBuilder.ToString();}/// <summary>/// 加入房间/// </summary>/// <param name="data"></param>/// <param name="client"></param>/// <param name="server"></param>/// <returns></returns>public string JoinRoom(string data, Client client, Server server){Console.WriteLine("玩家正在加入房间...");//根据 id 查找房间int id = int.Parse(data);Room room = server.GetRoomByID(id);//没有找到房间、失败if (room == null){Console.WriteLine("房间已经销毁了");return ((int)ReturnCode.NotFound).ToString();}else if (room.IsWaitingJoin() == false){Console.WriteLine("房间已经满员");//是否可以进行加入return ((int)ReturnCode.Fail).ToString();}else{Console.WriteLine("加入成功");//成功room.AddClient(client);//所有信息返回string roomdata = room.GetRoomData();//当前客户端清除、不包含 returncode                                   returnCode,roomType -  id,usernmae,totalCount,winCount|username,totalCount,winCountroom.BroadCastMessage(client, ActionCode.UpdateRoom, roomdata);//return ((int)ReturnCode.Success).ToString() + "-" + roomdata;return ((int)ReturnCode.Success).ToString() + "," + ((int)RoleType.Red).ToString() + "-" + roomdata;}}/// <summary>/// 退出房间/// </summary>/// <param name="data"></param>/// <param name="client"></param>/// <param name="server"></param>/// <returns></returns>public string QuitRoom(string data, Client client, Server server){Console.WriteLine("玩家退出房间...");bool isHouseOwner = client.IsHouseOwner();Room room = client.Room;//是房主if (isHouseOwner){Console.WriteLine("房主退出");//向其他的客户端发出消息room.BroadCastMessage(client, ActionCode.QuitRoom, ((int)ReturnCode.Success).ToString());//退出room.Close();//处理房主退出return ((int)ReturnCode.Success).ToString();//销毁房间}else{Console.WriteLine("用户退出");//不是房主、移除client.Room.RemoveClient(client);room.BroadCastMessage(client, ActionCode.UpdateRoom, room.GetRoomData());//通知其他客户端return ((int)ReturnCode.Success).ToString();}}}
}
using MySqlX.XDevAPI.Common;
using ServerFrameworkProject.DAO;
using ServerFrameworkProject.Model;
using ServerFrameworkProject.Servers;
using ShareProject;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;namespace ServerFrameworkProject.Controller
{/// <summary>/// 用户控制者/// </summary>class UserController:BaseController{private UserDAO userDAO = new UserDAO();public UserController(){requestCode = RequestCode.User;}/// <summary>/// 登录请求/// </summary>/// <param name="data"></param>/// <param name="client"></param>/// <param name="server"></param>/// <returns></returns>public string Login(string data, Client client, Server server){Console.WriteLine("登录中....");string[] strs = data.Split(',');User user = userDAO.VerifyUser(client.MYSQLConn, strs[0], strs[1]);if (user == null){Console.WriteLine("登录失败");Enum.GetName(typeof(ReturnCode), ReturnCode.Fail);return ((int)ReturnCode.Fail).ToString();}else{Console.WriteLine("登录成功");//登录成功处理请求信息//Result result = resultDAO.GetResultByUserID(client.MYSQLConn, user.id);//登录账号保存client.SetUserData(user);return string.Format("{0},{1}", ((int)ReturnCode.Success).ToString(), user.userName);}}/// <summary>/// 注册请求/// </summary>/// <param name="data"></param>/// <param name="client"></param>/// <param name="server"></param>/// <returns></returns>public string Register(string data, Client client, Server server){Console.WriteLine("客户端请求注册");string[] strs = data.Split(',');string username = strs[0];string password = strs[1];bool res = userDAO.GetUserByUserName(client.MYSQLConn, username);//得到了用户名重复if (res){Console.WriteLine("用户名重复");return ((int)ReturnCode.Fail).ToString();}//注册添加userDAO.AddUser(client.MYSQLConn, username, password);return ((int)ReturnCode.Success).ToString();}}
}
using MySql.Data.MySqlClient;
using ServerFrameworkProject.Model;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;namespace ServerFrameworkProject.DAO
{class UserDAO{/// <summary>/// 校验/// </summary>/// <param name="conn"></param>/// <param name="username"></param>/// <param name="password"></param>/// <returns></returns>public User VerifyUser(MySqlConnection conn, string username, string password){MySqlDataReader reader = null;try{MySqlCommand cmd = new MySqlCommand("select * from user where username = @username and password= @password", conn);cmd.Parameters.AddWithValue("username", username);cmd.Parameters.AddWithValue("password", password);reader = cmd.ExecuteReader();if (reader.Read()){int id = reader.GetInt32("id");User user = new User(id, username, password);return user;}else{return null;}}catch (Exception e){Console.WriteLine("在VerifyUser 的时候出现异常");}finally{if (reader != null){reader.Close();}}return null;}/// <summary>/// 根据用户名查找 是否查找到用户数据/// </summary>/// <param name="conn"></param>/// <param name="username"></param>/// <returns></returns>public bool GetUserByUserName(MySqlConnection conn, string username){MySqlDataReader reader = null;try{MySqlCommand cmd = new MySqlCommand("select * from user where username = @username", conn);cmd.Parameters.AddWithValue("username", username);reader = cmd.ExecuteReader();//是否有数据if (reader.HasRows){return true;}else{return false;}}catch (Exception e){Console.WriteLine("在GetUserByUserName 的时候出现异常");}finally{if (reader != null){reader.Close();}}return false;}/// <summary>/// 往数据库添加/// </summary>/// <param name="conn"></param>/// <param name="username"></param>/// <param name="password"></param>public void AddUser(MySqlConnection conn, string username, string password){try{//防止 SQL 注入MySqlCommand cmd = new MySqlCommand("insert into user set username = @username , password = @password", conn);cmd.Parameters.AddWithValue("username", username);cmd.Parameters.AddWithValue("password", password);cmd.ExecuteNonQuery();}catch (Exception e){Console.WriteLine("在AddUser 的时候出现异常");}}}
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;namespace ServerFrameworkProject.Model
{public class Result{public int id { get; set; }public int userId { get; set; }public int totalCount { get; set; }public int winCount { get; set; }public Result(int id, int userId, int totalCount, int wincount){this.id = id;this.userId = userId;this.totalCount = totalCount;this.winCount = wincount;}}
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;namespace ServerFrameworkProject.Model
{class User{public int id { get; set; }public string userName { get; set; }public string passWord { get; set; }public User(int id, string username, string passwod){this.id = id;this.userName = username;this.passWord = passwod;}}
}
using ShareProject;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;namespace ServerFrameworkProject.Servers
{/// <summary>/// 消息处理/// </summary>class Message{private byte[] data = new byte[1024];private int startIndex = 0;//我们存取了多少个字节的数据在数组里面//public void AddCount(int count)//{//    startIndex += count;//}public byte[] Data{get { return data; }}public int StartIndex{get { return startIndex; }}public int RemainSize{get { return data.Length - startIndex; }}/// <summary>/// 解析数据或者叫做读取数据/// </summary>public void ReadMessage(int newDataAmount, Action<RequestCode, ActionCode, string> processDtaCallBack){//更新startIndex += newDataAmount;while (true){if (startIndex <= 4) return;int count = BitConverter.ToInt32(data, 0);if ((startIndex - 4) >= count){//Console.WriteLine(startIndex);//Console.WriteLine(count);//string s = Encoding.UTF8.GetString(data, 4, count);//Console.WriteLine("解析出来一条数据:" + s);//先解析 request RequestCode requestCode = (RequestCode)BitConverter.ToInt32(data, 4);ActionCode actionCode = (ActionCode)BitConverter.ToInt32(data, 8);//解析数据string s = Encoding.UTF8.GetString(data, 12, count - 8); // 剩余数据字节长度//回调函数processDtaCallBack(requestCode, actionCode, s);Array.Copy(data, count + 4, data, 0, startIndex - 4 - count);startIndex -= (count + 4);}else{break;}}}//数据包装public static byte[] PackData(ActionCode actionCode, string data){//枚举、data 转换字节数组byte[] requestCodeBytes = BitConverter.GetBytes((int)actionCode);byte[] dataBytes = Encoding.UTF8.GetBytes(data);//获取数据长度int dataAmount = requestCodeBytes.Length + dataBytes.Length;byte[] dataAmountBytes = BitConverter.GetBytes(dataAmount);//组装byte[] newBytes = dataAmountBytes.Concat(requestCodeBytes).ToArray<byte>();return newBytes.Concat(dataBytes).ToArray<byte>();}//public static byte[] packdata(actioncode actioncode, string data)//{//    byte[] requestcodebytes = bitconverter.getbytes((int)actioncode);//    byte[] databytes = encoding.utf8.getbytes(data);//    int dataamount = requestcodebytes.length + databytes.length;//    byte[] dataamountbytes = bitconverter.getbytes(dataamount);//    byte[] newbytes = dataamountbytes.concat(requestcodebytes).toarray<byte>();//concat(databytes);//    return newbytes.concat(databytes).toarray<byte>();//}}
}
using ShareProject;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;namespace ServerFrameworkProject.Servers
{/// <summary>/// 房间状态/// </summary>public enum RoomState{WaitingJoin,WaitingBattle,Battle,End}class Room{//当前房间所有的客户端private List<Client> clientRoom = new List<Client>();private RoomState roomState = RoomState.WaitingJoin;private Server server;public Room(Server server){this.server = server;}//添加玩家public void AddClient(Client client){//第一个为创建者、管理者clientRoom.Add(client);//访问房间client.Room = this;//大于最大人数if (clientRoom.Count >= 2){//等待战斗roomState = RoomState.WaitingBattle;}}//移除public void RemoveClient(Client client){client.Room = null;clientRoom.Remove(client);//修改房间状态//大于最大人数if (clientRoom.Count >= 2){//等待战斗roomState = RoomState.WaitingBattle;}else{//等待加入roomState = RoomState.WaitingJoin;}}//房间是否在等待public bool IsWaitingJoin(){return roomState == RoomState.WaitingJoin;}//得到房主信息、集合中的第一个public string GetHouseOwnerDara(){return clientRoom[0].GetUserData();}//得到房间 IDpublic int GetID(){//房间是否为空if (clientRoom.Count > 0){//取得房主 IDreturn clientRoom[0].GetUserID();}//不存在的ID   没有房主return -1;}//取得战绩public String GetRoomData(){StringBuilder stringBuilder = new StringBuilder();foreach (Client client in clientRoom){stringBuilder.Append(client.GetUserData() + "|");}//字符串是否大于 0if (stringBuilder.Length > 0){stringBuilder.Remove(stringBuilder.Length - 1, 1);}return stringBuilder.ToString();}/// <summary>/// 广播所有的客户端/// </summary>/// <param name="excludeClient"></param>public void BroadCastMessage(Client excludeClient, ActionCode actionCode, string data){foreach (Client client in clientRoom){if (client != excludeClient){//消息广播server.SendResponse(client, actionCode, data);}}}//是否是房主public bool IsHouseOwner(Client client){return client == clientRoom[0];}/// <summary>/// 关闭房间、客户端要推出/// </summary>/// <param name="client"></param>public void QuitRoom(Client client){//如果是房主if (client == clientRoom[0]){Close();}else{//移除无需销毁clientRoom.Remove(client);}//移除自身//server.RemoveRoom(this);}/// <summary>/// 销毁房间/// </summary>public void Close(){foreach (Client client in clientRoom){client.Room = null;}server.RemoveRoom(this);}/// <summary>/// 开始计时/// </summary>public void ShowTimer(){//使用线程new Thread(RunTimer).Start();}/// <summary>/// 使用线程计时/// </summary>private void RunTimer(){Thread.Sleep(1000);for (int i = 3; i > 0; i--){//向所有的客户端广播消息BroadCastMessage(null, ActionCode.ShowTimer, i.ToString());//暂停1 毫秒Thread.Sleep(1000);}//3 秒之后开始游戏BroadCastMessage(null, ActionCode.StartPlay, "r");}}
}
using ServerFrameworkProject.Controller;
using ServerFrameworkProject.Tool;
using ShareProject;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Net.Sockets;
using System.Text;
using System.Threading;
using System.Threading.Tasks;/// <summary>
/// 启动 TCP ,开启监听
/// </summary>
namespace ServerFrameworkProject.Servers
{class Server{private IPEndPoint iPEndPoint;private Socket serverSocket;private List<Client> clientList = new List<Client>();private ControllerManager controllerManager;//房间管理private List<Room> roomList = new List<Room>();public Server() { }public Server(string ipstr, int port){controllerManager = new ControllerManager(this);SetIPAndPort(ipstr, port);}/// <summary>/// 设置 IP 以及 端口号/// </summary>/// <param name="ipstr"></param>/// <param name="port"></param>public void SetIPAndPort(string ipstr, int port){this.iPEndPoint = new IPEndPoint(IPAddress.Parse(ipstr), port);}/// <summary>/// 启动监听/// </summary>public void Start(){//创建一个连接serverSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);//绑定IPserverSocket.Bind(iPEndPoint);//监听、队列长度为无限serverSocket.Listen(0);Console.WriteLine("\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t服务器启动成功...");Console.WriteLine("\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tIP\t:" + Helpr.AutoIP().ToString());Console.WriteLine("\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tPort\t:" + 6688);//异步接收serverSocket.BeginAccept(AcceptCallBack, null);}/// <summary>/// 处理连接回调/// </summary>/// <param name="ar"></param>private void AcceptCallBack(IAsyncResult ar){//得到与客户端的连接Socket clientSocket = serverSocket.EndAccept(ar);//创建一个 client、将自身传递过去Client client = new Client(clientSocket, this);//启动clientclient.Start();//所有的客户端关联clientList.Add(client);//循环接收serverSocket.BeginAccept(AcceptCallBack, null);}/// <summary>/// 移除 Client的方法/// </summary>/// <param name="client"></param>public void RemoveClient(Client client){//防止对象访问出现异常、多个客户端可能去访问lock (clientList){Console.WriteLine("移除一个客户端" + client.ToString());//移除一个客户端clientList.Remove(client);}}/// <summary>/// 给客户端发出响应/// </summary>/// <param name="client"></param>/// <param name="actionCode"></param>/// <param name="data"></param>public void SendResponse(Client client, ActionCode actionCode, string data){//给客户端响应client.Send(actionCode, data);}/// <summary>/// 处理消息/// </summary>/// <param name="requestCode"></param>/// <param name="actionCode"></param>/// <param name="data"></param>/// <param name="client"></param>public void HandleRequest(RequestCode requestCode, ActionCode actionCode, string data, Client client){controllerManager.HandleRequest(requestCode, actionCode, data, client);}/// <summary>/// 创建房间/// </summary>/// <param name="client"></param>public void CreateRoom(Client client){Room room = new Room(this);//创建房间room.AddClient(client);//管理房间roomList.Add(room);}/// <summary>/// 移除房间/// </summary>/// <param name="room"></param>public void RemoveRoom(Room room){if (roomList != null && room != null){roomList.Remove(room);}}/// <summary>/// 得到房间集合/// </summary>/// <returns></returns>public List<Room> GetRommList(){return roomList;}/// <summary>/// 根据 房间id 得到 id/// </summary>/// <param name="id"></param>/// <returns></returns>public Room GetRoomByID(int id){foreach (Room room in roomList){if (room.GetID() == id){return room;}}//找不到房间return null;}}
}
using MySql.Data.MySqlClient;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;namespace ServerFrameworkProject.Tool
{class ConnHelper{/// <summary>/// 建立连接/// </summary>/// <returns></returns>public static MySqlConnection Connect(){MySqlConnection conn = new MySqlConnection(StringManager.CONNECTITONSTRING);try{//打开连接conn.Open();return conn;}catch (Exception e){Console.WriteLine("连接数据库异常" + e);return null;}}/// <summary>/// 关闭连接/// </summary>/// <param name="mySqlConnection"></param>public static void CloseConnection(MySqlConnection mySqlConnection){if (mySqlConnection != null){mySqlConnection.Close();}else{Console.WriteLine(mySqlConnection + "不能为null");}}}
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Text;
using System.Threading.Tasks;namespace ServerFrameworkProject.Tool
{class Helpr{/// <summary>/// 自动获取 IP/// </summary>public static string AutoIP(){string IP = string.Empty;foreach (IPAddress _IPAddress in Dns.GetHostEntry(Dns.GetHostName()).AddressList){if (_IPAddress.AddressFamily.ToString() == "InterNetwork"){IP = _IPAddress.ToString();}}return IP;}}
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;/// <summary>
/// 字符管理者
/// </summary>
namespace ServerFrameworkProject.Tool
{public static class StringManager{//SQL定义连接字符串connectionStringpublic const string CONNECTITONSTRING = "Database=serverframepro;DataSource=localhost;port=3306;user id=root;password=123456";}
}
using ServerFrameworkProject.Servers;
using ServerFrameworkProject.Tool;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Text;
using System.Threading.Tasks;namespace ServerFrameworkProject
{class Program{static void Main(string[] args){//程序入口StartServer();}static void StartServer(){int Port = 6688;//获取本机IP地址Server server = new Server(Helpr.AutoIP().ToString(), Port);server.Start();Console.ReadLine();}}
}

2、数据库表结构设计
在这里插入图片描述
在这里插入图片描述

查看全文
如若内容造成侵权/违法违规/事实不符,请联系编程学习网邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!

相关文章

  1. 最近写的行人重识别(person re-id) 程序错误反思记录

    文章目录一、 Loss 问题二、 分层学习率问题三、多GPU 处理程序 一、 Loss 问题 首先,loss 用的是 三元组损失,标签平滑交叉熵损失,调试的过程中出了两个错误 (1) float,list dtype不一样的问题,问题出在了 下边的 len(),忘了写了,导致class_names是一个列表,不是…...

    2024/4/28 17:56:54
  2. 智能感光声控灯

    智能感光声控灯---STM32原理光照传感器结构特性作用与应用光敏电阻器主要参数定义程序声音传感器原理结构定义程序LED驱动原理定义程序主函数 原理 光照传感器 结构 通常由光敏层、玻璃基片(或树枝防潮膜)和电极等组成的。 特性 光敏电阻器是利用半导体光电导效应制成的一种特…...

    2024/4/28 13:31:23
  3. 理论+实验:深入理解Linux文件系统与日志分析

    目录一 inode与block1.1 inode和block概述1.2 inode的内容1.3 inode的号码1.4 文件存储小结1.5 inode的大小1.6 inode的特殊作用二 硬链接与软链接2.1 链接文件三 恢复误删除的文件3.1 编译安装extundelete3.2 模拟删除并执行恢复操作3.3 模拟误操作并恢复3.4 xfs类型文件备份和…...

    2024/4/28 4:55:47
  4. echarts 自定义 markPoint 的 symbol 样式(五)

    两种自定义标记在 echarts 中 markPoint 的样式内置了 ‘circle’, ‘rect’, ‘roundRect’, ‘triangle’, ‘diamond’, ‘pin’, ‘arrow’ 几种,如果这些都不太符合需要就必须自定义我们需要的样式。自定义标记的图形有两种方式: 1. 通过 ‘image://url’ 设置为图片,其…...

    2024/4/28 7:52:17
  5. postgresql时间戳转字符串(费了老大劲)

    何为时间戳,就是一个毫秒数,例如13位0123456789123,那么你该如何转换成对应格式化内容呢,如某年某月某日,某时某分某秒,你可以使用to_timestamp和to_char完成转换。 啥也不说,上代码: SELECT to_char(to_timestamp(1582872525000 / 1000), YYYY-MM-DD HH24:MI:SS)喜欢钻…...

    2024/4/28 2:00:32
  6. HDU6755.Fibonacci Sum

    HDU6755.Fibonacci Sum(二次剩余) 思路:fibnaccifibnaccifibnacci二次剩余转等比数列求和。 由fibonaccifibonaccifibonacci公式:Fn=15[(5+12)n−(5−12)n]F_n=\dfrac{1}{\sqrt{5}}\times [(\dfrac{\sqrt{5}+1}{2})^n-(\dfrac{\sqrt{5}-1}{2})^n]Fn​=5​1​[(25​+1​)n−(2…...

    2024/4/28 22:56:23
  7. 【抽象代数】环论与域论

    环论与域论 群是有一个代数运算的代数系统,但我们在数学中,如高等代数中讨论的很多对象比如:数、多项式、函数以及矩阵和线性变换等,都是有两个代数运算的代数系统,两个代数运算的代数系统不仅有非常重要的现实意义,而且相比于一个代数运算的系统会有一些有趣的性质。而在…...

    2024/4/28 8:28:38
  8. phpcms文章发布时间莫名变成1970-01-01问题的解决

    目前测试把日期标签换成 {date(Y-m-d,strtotime($inputtime))}就可以了...

    2024/4/28 4:58:15
  9. 网络编程学习2:select模型

    选择(select)模型 select模型是一个广泛在Winsock中使用的I/O模型。称它为select模型,是因为它主要是使用select函数来管理I/O的。 1 接口 // select函数可以确定一个或者多个套接字的状态。如果套接字上没有网络事件发生,便进入等待状态,以便执行同步I/O。 int select(int …...

    2024/4/27 0:28:42
  10. LINUX下DEBUG宏

    linux下DEBUG宏使用方法: #define DEBUG#ifdef DEBUG #define debug(...){fprintf(stderr,"[debug][%s:%s:%d] ",)\__FILE__,__FUNCTION__,__LINE__); \fprintf(stderr,__VA_ARGS__);} #else #define debug(...)写下来备用...

    2024/4/9 2:03:47
  11. 帆软填报界面首页黑色

    解决方法:左上角--> 模板 -->模板web属性 -->填报的话 选填报界面 --> 为该模板单独设置 --> 左上角“填报当前行背景颜色” --> 改成 白色 或其他...

    2024/4/19 9:19:31
  12. DenseNet网络解析

    DenseNet网络解析简介网络特点网络结构代码实现DenseNet和ResNet 简介 DenseNet: 全称Dense Convolutional Network,稠密卷积网络。 传统的网络L层有L个连接,DenseNet却有L(L+1)/2个连接。 DenseNet使用更少的计算量就可以获得更好的性能。 网络特点 1.有利于特征传播; 2.鼓…...

    2024/4/9 2:03:45
  13. 阿里的Java岗面试到底有多难?这些常问技术原理你能答出多少!

    阿里面试喜欢问哪些?阿里的面试特别喜欢面试技术原理,特别是数据结构多线程并发NIO异步消息框架分布式相关的缓存算法等JVM的加裁过程和原理垃圾回收算法以及具体使用过的框架,会问部分参数检验你是否熟用 第一面能通过,后续被录用的可能性就比较高了,第一轮非常垂要,建议…...

    2024/4/9 2:03:44
  14. JAVA基础编程练习题-1

    古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一 对兔子,假如兔子都不死,问每个月的兔子总数为多少? public class example1 {public static void main(String[] args) {Vector<Integer> v=new Vector<Integer>(…...

    2024/4/9 2:03:43
  15. Day1 变量和数据类型

    1.1 变量 变量的概念 变量:常量是固定不变的数据,那么在程序中可以变化的量称为变量。 变量的定义 数据类型 变量名 = 变量值 标识符1,包含数字、字母、_、$组成,但不能以数字开头 2,不能是关键字 3,见名知意,不要用中文和拼音1.2 数据类型 Java的数据类型分为两大…...

    2024/4/9 2:03:42
  16. [CF818F]Level Generation

    题目 传送门 to luogu 思路 显然桥不会出现在环上。显然无向图无环则为树。环可以缩点,剩下的连成树。 设其余的环均已缩点,点数为 nnn 。剩下两个环,大小分别为 aaa 和 bbb ,则可随意选择的边数量为 a(a−1)+b(b−1)2=a2+b2−a−b2\frac{a(a-1)+b(b-1)}{2}=\frac{a^2+b^2-…...

    2024/4/24 1:51:50
  17. 9.封装

    1、为何要使用封装: 1、保护属性;2、开一个出口以供使用 2、什么是封装:将类的某些信息隐藏在类内部,不允许外部程序直接访问,而是通过该类提供的方法来实现对隐藏信息的操作和访问。 封装的两个大致原则: ①把所有的属性藏起来; ②把尽可能多的东西藏起来,对外提供便捷…...

    2024/4/9 2:03:40
  18. demo1-点击item切换

    parent.vue <template><div>parent<child :data="[新闻,公告,活动]"></child></div> </template><script> import Child from @/views/Child.vue export default {components: {Child,},} </script>child.vue <t…...

    2024/4/9 2:03:39
  19. 软件测试轻松玩转-LoadRunner性能测试(四) Controller 控制器(干货干货绝对干货!)

    我们在 VuGen 里编辑并编译好脚本,就可以加载到 Controller 里进行运行场景设计,设计完,就可以执行场景了。两种方式可以启动 Controller:“开始” -> “所有程序” -> “HP LoadRunner” -> “Applications” -> “Controller”;VuGen -> Tools -> Cre…...

    2024/4/8 21:54:55
  20. 习题4-10 猴子吃桃问题 (15分)

    一只猴子第一天摘下若干个桃子,当即吃了一半,还不过瘾,又多吃了一个;第二天早上又将剩下的桃子吃掉一半,又多吃了一个。以后每天早上都吃了前一天剩下的一半加一个。到第N天早上想再吃时,见只剩下一个桃子了。问:第一天共摘了多少个桃子?输入格式: 输入在一行中给出正整…...

    2024/4/8 21:54:54

最新文章

  1. 程序员缓解工作压力的技巧

    程序员在紧张的工作之余&#xff0c;放松自己是非常重要的。我了解到有几种方法可以帮助他们缓解压力、恢复精力。 首先&#xff0c;运动是个不错的选择。无论是去健身房锻炼身体&#xff0c;还是进行户外跑步、散步&#xff0c;都可以让程序员暂时忘记工作&#xff0c;释放压力…...

    2024/4/29 2:09:57
  2. 梯度消失和梯度爆炸的一些处理方法

    在这里是记录一下梯度消失或梯度爆炸的一些处理技巧。全当学习总结了如有错误还请留言&#xff0c;在此感激不尽。 权重和梯度的更新公式如下&#xff1a; w w − η ⋅ ∇ w w w - \eta \cdot \nabla w ww−η⋅∇w 个人通俗的理解梯度消失就是网络模型在反向求导的时候出…...

    2024/3/20 10:50:27
  3. Verilog基础【二】

    3.1 Verilog 连续赋值 关键词&#xff1a;assign&#xff0c; 全加器 连续赋值语句是 Verilog 数据流建模的基本语句&#xff0c;用于对 wire 型变量进行赋值。&#xff1a; assign LHS_target RHS_expression &#xff1b;LHS&#xff08;left hand side&#xff09;…...

    2024/4/24 20:09:29
  4. Spring集成MyBatis

    基本准备 创建Dynamic Web Project 引入相关jar包 Spring框架相关jar包 MyBatis连接Spring相关jar包 连接MySQL驱动包 JSTL标签库包 添加db.properties文件&#xff0c;该属性文件配置连接数据库相关信息 drivercom.mysql.jdbc.Driver urljdbc:mysql://localhost:3306/myba…...

    2024/4/23 6:22:22
  5. 416. 分割等和子集问题(动态规划)

    题目 题解 class Solution:def canPartition(self, nums: List[int]) -> bool:# badcaseif not nums:return True# 不能被2整除if sum(nums) % 2 ! 0:return False# 状态定义&#xff1a;dp[i][j]表示当背包容量为j&#xff0c;用前i个物品是否正好可以将背包填满&#xff…...

    2024/4/28 4:04:40
  6. 【Java】ExcelWriter自适应宽度工具类(支持中文)

    工具类 import org.apache.poi.ss.usermodel.Cell; import org.apache.poi.ss.usermodel.CellType; import org.apache.poi.ss.usermodel.Row; import org.apache.poi.ss.usermodel.Sheet;/*** Excel工具类** author xiaoming* date 2023/11/17 10:40*/ public class ExcelUti…...

    2024/4/28 12:01:04
  7. Spring cloud负载均衡@LoadBalanced LoadBalancerClient

    LoadBalance vs Ribbon 由于Spring cloud2020之后移除了Ribbon&#xff0c;直接使用Spring Cloud LoadBalancer作为客户端负载均衡组件&#xff0c;我们讨论Spring负载均衡以Spring Cloud2020之后版本为主&#xff0c;学习Spring Cloud LoadBalance&#xff0c;暂不讨论Ribbon…...

    2024/4/28 16:34:55
  8. TSINGSEE青犀AI智能分析+视频监控工业园区周界安全防范方案

    一、背景需求分析 在工业产业园、化工园或生产制造园区中&#xff0c;周界防范意义重大&#xff0c;对园区的安全起到重要的作用。常规的安防方式是采用人员巡查&#xff0c;人力投入成本大而且效率低。周界一旦被破坏或入侵&#xff0c;会影响园区人员和资产安全&#xff0c;…...

    2024/4/28 18:31:47
  9. VB.net WebBrowser网页元素抓取分析方法

    在用WebBrowser编程实现网页操作自动化时&#xff0c;常要分析网页Html&#xff0c;例如网页在加载数据时&#xff0c;常会显示“系统处理中&#xff0c;请稍候..”&#xff0c;我们需要在数据加载完成后才能继续下一步操作&#xff0c;如何抓取这个信息的网页html元素变化&…...

    2024/4/28 12:01:03
  10. 【Objective-C】Objective-C汇总

    方法定义 参考&#xff1a;https://www.yiibai.com/objective_c/objective_c_functions.html Objective-C编程语言中方法定义的一般形式如下 - (return_type) method_name:( argumentType1 )argumentName1 joiningArgument2:( argumentType2 )argumentName2 ... joiningArgu…...

    2024/4/28 12:01:03
  11. 【洛谷算法题】P5713-洛谷团队系统【入门2分支结构】

    &#x1f468;‍&#x1f4bb;博客主页&#xff1a;花无缺 欢迎 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! 本文由 花无缺 原创 收录于专栏 【洛谷算法题】 文章目录 【洛谷算法题】P5713-洛谷团队系统【入门2分支结构】&#x1f30f;题目描述&#x1f30f;输入格…...

    2024/4/28 12:01:03
  12. 【ES6.0】- 扩展运算符(...)

    【ES6.0】- 扩展运算符... 文章目录 【ES6.0】- 扩展运算符...一、概述二、拷贝数组对象三、合并操作四、参数传递五、数组去重六、字符串转字符数组七、NodeList转数组八、解构变量九、打印日志十、总结 一、概述 **扩展运算符(...)**允许一个表达式在期望多个参数&#xff0…...

    2024/4/28 16:07:14
  13. 摩根看好的前智能硬件头部品牌双11交易数据极度异常!——是模式创新还是饮鸩止渴?

    文 | 螳螂观察 作者 | 李燃 双11狂欢已落下帷幕&#xff0c;各大品牌纷纷晒出优异的成绩单&#xff0c;摩根士丹利投资的智能硬件头部品牌凯迪仕也不例外。然而有爆料称&#xff0c;在自媒体平台发布霸榜各大榜单喜讯的凯迪仕智能锁&#xff0c;多个平台数据都表现出极度异常…...

    2024/4/28 23:42:05
  14. Go语言常用命令详解(二)

    文章目录 前言常用命令go bug示例参数说明 go doc示例参数说明 go env示例 go fix示例 go fmt示例 go generate示例 总结写在最后 前言 接着上一篇继续介绍Go语言的常用命令 常用命令 以下是一些常用的Go命令&#xff0c;这些命令可以帮助您在Go开发中进行编译、测试、运行和…...

    2024/4/28 9:00:42
  15. 用欧拉路径判断图同构推出reverse合法性:1116T4

    http://cplusoj.com/d/senior/p/SS231116D 假设我们要把 a a a 变成 b b b&#xff0c;我们在 a i a_i ai​ 和 a i 1 a_{i1} ai1​ 之间连边&#xff0c; b b b 同理&#xff0c;则 a a a 能变成 b b b 的充要条件是两图 A , B A,B A,B 同构。 必要性显然&#xff0…...

    2024/4/27 18:40:35
  16. 【NGINX--1】基础知识

    1、在 Debian/Ubuntu 上安装 NGINX 在 Debian 或 Ubuntu 机器上安装 NGINX 开源版。 更新已配置源的软件包信息&#xff0c;并安装一些有助于配置官方 NGINX 软件包仓库的软件包&#xff1a; apt-get update apt install -y curl gnupg2 ca-certificates lsb-release debian-…...

    2024/4/28 4:14:21
  17. Hive默认分割符、存储格式与数据压缩

    目录 1、Hive默认分割符2、Hive存储格式3、Hive数据压缩 1、Hive默认分割符 Hive创建表时指定的行受限&#xff08;ROW FORMAT&#xff09;配置标准HQL为&#xff1a; ... ROW FORMAT DELIMITED FIELDS TERMINATED BY \u0001 COLLECTION ITEMS TERMINATED BY , MAP KEYS TERMI…...

    2024/4/27 13:52:15
  18. 【论文阅读】MAG:一种用于航天器遥测数据中有效异常检测的新方法

    文章目录 摘要1 引言2 问题描述3 拟议框架4 所提出方法的细节A.数据预处理B.变量相关分析C.MAG模型D.异常分数 5 实验A.数据集和性能指标B.实验设置与平台C.结果和比较 6 结论 摘要 异常检测是保证航天器稳定性的关键。在航天器运行过程中&#xff0c;传感器和控制器产生大量周…...

    2024/4/27 13:38:13
  19. --max-old-space-size=8192报错

    vue项目运行时&#xff0c;如果经常运行慢&#xff0c;崩溃停止服务&#xff0c;报如下错误 FATAL ERROR: CALL_AND_RETRY_LAST Allocation failed - JavaScript heap out of memory 因为在 Node 中&#xff0c;通过JavaScript使用内存时只能使用部分内存&#xff08;64位系统&…...

    2024/4/28 12:00:58
  20. 基于深度学习的恶意软件检测

    恶意软件是指恶意软件犯罪者用来感染个人计算机或整个组织的网络的软件。 它利用目标系统漏洞&#xff0c;例如可以被劫持的合法软件&#xff08;例如浏览器或 Web 应用程序插件&#xff09;中的错误。 恶意软件渗透可能会造成灾难性的后果&#xff0c;包括数据被盗、勒索或网…...

    2024/4/28 12:00:58
  21. JS原型对象prototype

    让我简单的为大家介绍一下原型对象prototype吧&#xff01; 使用原型实现方法共享 1.构造函数通过原型分配的函数是所有对象所 共享的。 2.JavaScript 规定&#xff0c;每一个构造函数都有一个 prototype 属性&#xff0c;指向另一个对象&#xff0c;所以我们也称为原型对象…...

    2024/4/27 22:51:49
  22. C++中只能有一个实例的单例类

    C中只能有一个实例的单例类 前面讨论的 President 类很不错&#xff0c;但存在一个缺陷&#xff1a;无法禁止通过实例化多个对象来创建多名总统&#xff1a; President One, Two, Three; 由于复制构造函数是私有的&#xff0c;其中每个对象都是不可复制的&#xff0c;但您的目…...

    2024/4/28 7:31:46
  23. python django 小程序图书借阅源码

    开发工具&#xff1a; PyCharm&#xff0c;mysql5.7&#xff0c;微信开发者工具 技术说明&#xff1a; python django html 小程序 功能介绍&#xff1a; 用户端&#xff1a; 登录注册&#xff08;含授权登录&#xff09; 首页显示搜索图书&#xff0c;轮播图&#xff0…...

    2024/4/28 8:32:05
  24. 电子学会C/C++编程等级考试2022年03月(一级)真题解析

    C/C++等级考试(1~8级)全部真题・点这里 第1题:双精度浮点数的输入输出 输入一个双精度浮点数,保留8位小数,输出这个浮点数。 时间限制:1000 内存限制:65536输入 只有一行,一个双精度浮点数。输出 一行,保留8位小数的浮点数。样例输入 3.1415926535798932样例输出 3.1…...

    2024/4/27 20:28:35
  25. 配置失败还原请勿关闭计算机,电脑开机屏幕上面显示,配置失败还原更改 请勿关闭计算机 开不了机 这个问题怎么办...

    解析如下&#xff1a;1、长按电脑电源键直至关机&#xff0c;然后再按一次电源健重启电脑&#xff0c;按F8健进入安全模式2、安全模式下进入Windows系统桌面后&#xff0c;按住“winR”打开运行窗口&#xff0c;输入“services.msc”打开服务设置3、在服务界面&#xff0c;选中…...

    2022/11/19 21:17:18
  26. 错误使用 reshape要执行 RESHAPE,请勿更改元素数目。

    %读入6幅图像&#xff08;每一幅图像的大小是564*564&#xff09; f1 imread(WashingtonDC_Band1_564.tif); subplot(3,2,1),imshow(f1); f2 imread(WashingtonDC_Band2_564.tif); subplot(3,2,2),imshow(f2); f3 imread(WashingtonDC_Band3_564.tif); subplot(3,2,3),imsho…...

    2022/11/19 21:17:16
  27. 配置 已完成 请勿关闭计算机,win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机...

    win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机”问题的解决方法在win7系统关机时如果有升级系统的或者其他需要会直接进入一个 等待界面&#xff0c;在等待界面中我们需要等待操作结束才能关机&#xff0c;虽然这比较麻烦&#xff0c;但是对系统进行配置和升级…...

    2022/11/19 21:17:15
  28. 台式电脑显示配置100%请勿关闭计算机,“准备配置windows 请勿关闭计算机”的解决方法...

    有不少用户在重装Win7系统或更新系统后会遇到“准备配置windows&#xff0c;请勿关闭计算机”的提示&#xff0c;要过很久才能进入系统&#xff0c;有的用户甚至几个小时也无法进入&#xff0c;下面就教大家这个问题的解决方法。第一种方法&#xff1a;我们首先在左下角的“开始…...

    2022/11/19 21:17:14
  29. win7 正在配置 请勿关闭计算机,怎么办Win7开机显示正在配置Windows Update请勿关机...

    置信有很多用户都跟小编一样遇到过这样的问题&#xff0c;电脑时发现开机屏幕显现“正在配置Windows Update&#xff0c;请勿关机”(如下图所示)&#xff0c;而且还需求等大约5分钟才干进入系统。这是怎样回事呢&#xff1f;一切都是正常操作的&#xff0c;为什么开时机呈现“正…...

    2022/11/19 21:17:13
  30. 准备配置windows 请勿关闭计算机 蓝屏,Win7开机总是出现提示“配置Windows请勿关机”...

    Win7系统开机启动时总是出现“配置Windows请勿关机”的提示&#xff0c;没过几秒后电脑自动重启&#xff0c;每次开机都这样无法进入系统&#xff0c;此时碰到这种现象的用户就可以使用以下5种方法解决问题。方法一&#xff1a;开机按下F8&#xff0c;在出现的Windows高级启动选…...

    2022/11/19 21:17:12
  31. 准备windows请勿关闭计算机要多久,windows10系统提示正在准备windows请勿关闭计算机怎么办...

    有不少windows10系统用户反映说碰到这样一个情况&#xff0c;就是电脑提示正在准备windows请勿关闭计算机&#xff0c;碰到这样的问题该怎么解决呢&#xff0c;现在小编就给大家分享一下windows10系统提示正在准备windows请勿关闭计算机的具体第一种方法&#xff1a;1、2、依次…...

    2022/11/19 21:17:11
  32. 配置 已完成 请勿关闭计算机,win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机”的解决方法...

    今天和大家分享一下win7系统重装了Win7旗舰版系统后&#xff0c;每次关机的时候桌面上都会显示一个“配置Windows Update的界面&#xff0c;提示请勿关闭计算机”&#xff0c;每次停留好几分钟才能正常关机&#xff0c;导致什么情况引起的呢&#xff1f;出现配置Windows Update…...

    2022/11/19 21:17:10
  33. 电脑桌面一直是清理请关闭计算机,windows7一直卡在清理 请勿关闭计算机-win7清理请勿关机,win7配置更新35%不动...

    只能是等着&#xff0c;别无他法。说是卡着如果你看硬盘灯应该在读写。如果从 Win 10 无法正常回滚&#xff0c;只能是考虑备份数据后重装系统了。解决来方案一&#xff1a;管理员运行cmd&#xff1a;net stop WuAuServcd %windir%ren SoftwareDistribution SDoldnet start WuA…...

    2022/11/19 21:17:09
  34. 计算机配置更新不起,电脑提示“配置Windows Update请勿关闭计算机”怎么办?

    原标题&#xff1a;电脑提示“配置Windows Update请勿关闭计算机”怎么办&#xff1f;win7系统中在开机与关闭的时候总是显示“配置windows update请勿关闭计算机”相信有不少朋友都曾遇到过一次两次还能忍但经常遇到就叫人感到心烦了遇到这种问题怎么办呢&#xff1f;一般的方…...

    2022/11/19 21:17:08
  35. 计算机正在配置无法关机,关机提示 windows7 正在配置windows 请勿关闭计算机 ,然后等了一晚上也没有关掉。现在电脑无法正常关机...

    关机提示 windows7 正在配置windows 请勿关闭计算机 &#xff0c;然后等了一晚上也没有关掉。现在电脑无法正常关机以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容&#xff0c;让我们赶快一起来看一下吧&#xff01;关机提示 windows7 正在配…...

    2022/11/19 21:17:05
  36. 钉钉提示请勿通过开发者调试模式_钉钉请勿通过开发者调试模式是真的吗好不好用...

    钉钉请勿通过开发者调试模式是真的吗好不好用 更新时间:2020-04-20 22:24:19 浏览次数:729次 区域: 南阳 > 卧龙 列举网提醒您:为保障您的权益,请不要提前支付任何费用! 虚拟位置外设器!!轨迹模拟&虚拟位置外设神器 专业用于:钉钉,外勤365,红圈通,企业微信和…...

    2022/11/19 21:17:05
  37. 配置失败还原请勿关闭计算机怎么办,win7系统出现“配置windows update失败 还原更改 请勿关闭计算机”,长时间没反应,无法进入系统的解决方案...

    前几天班里有位学生电脑(windows 7系统)出问题了&#xff0c;具体表现是开机时一直停留在“配置windows update失败 还原更改 请勿关闭计算机”这个界面&#xff0c;长时间没反应&#xff0c;无法进入系统。这个问题原来帮其他同学也解决过&#xff0c;网上搜了不少资料&#x…...

    2022/11/19 21:17:04
  38. 一个电脑无法关闭计算机你应该怎么办,电脑显示“清理请勿关闭计算机”怎么办?...

    本文为你提供了3个有效解决电脑显示“清理请勿关闭计算机”问题的方法&#xff0c;并在最后教给你1种保护系统安全的好方法&#xff0c;一起来看看&#xff01;电脑出现“清理请勿关闭计算机”在Windows 7(SP1)和Windows Server 2008 R2 SP1中&#xff0c;添加了1个新功能在“磁…...

    2022/11/19 21:17:03
  39. 请勿关闭计算机还原更改要多久,电脑显示:配置windows更新失败,正在还原更改,请勿关闭计算机怎么办...

    许多用户在长期不使用电脑的时候&#xff0c;开启电脑发现电脑显示&#xff1a;配置windows更新失败&#xff0c;正在还原更改&#xff0c;请勿关闭计算机。。.这要怎么办呢&#xff1f;下面小编就带着大家一起看看吧&#xff01;如果能够正常进入系统&#xff0c;建议您暂时移…...

    2022/11/19 21:17:02
  40. 还原更改请勿关闭计算机 要多久,配置windows update失败 还原更改 请勿关闭计算机,电脑开机后一直显示以...

    配置windows update失败 还原更改 请勿关闭计算机&#xff0c;电脑开机后一直显示以以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容&#xff0c;让我们赶快一起来看一下吧&#xff01;配置windows update失败 还原更改 请勿关闭计算机&#x…...

    2022/11/19 21:17:01
  41. 电脑配置中请勿关闭计算机怎么办,准备配置windows请勿关闭计算机一直显示怎么办【图解】...

    不知道大家有没有遇到过这样的一个问题&#xff0c;就是我们的win7系统在关机的时候&#xff0c;总是喜欢显示“准备配置windows&#xff0c;请勿关机”这样的一个页面&#xff0c;没有什么大碍&#xff0c;但是如果一直等着的话就要两个小时甚至更久都关不了机&#xff0c;非常…...

    2022/11/19 21:17:00
  42. 正在准备配置请勿关闭计算机,正在准备配置windows请勿关闭计算机时间长了解决教程...

    当电脑出现正在准备配置windows请勿关闭计算机时&#xff0c;一般是您正对windows进行升级&#xff0c;但是这个要是长时间没有反应&#xff0c;我们不能再傻等下去了。可能是电脑出了别的问题了&#xff0c;来看看教程的说法。正在准备配置windows请勿关闭计算机时间长了方法一…...

    2022/11/19 21:16:59
  43. 配置失败还原请勿关闭计算机,配置Windows Update失败,还原更改请勿关闭计算机...

    我们使用电脑的过程中有时会遇到这种情况&#xff0c;当我们打开电脑之后&#xff0c;发现一直停留在一个界面&#xff1a;“配置Windows Update失败&#xff0c;还原更改请勿关闭计算机”&#xff0c;等了许久还是无法进入系统。如果我们遇到此类问题应该如何解决呢&#xff0…...

    2022/11/19 21:16:58
  44. 如何在iPhone上关闭“请勿打扰”

    Apple’s “Do Not Disturb While Driving” is a potentially lifesaving iPhone feature, but it doesn’t always turn on automatically at the appropriate time. For example, you might be a passenger in a moving car, but your iPhone may think you’re the one dri…...

    2022/11/19 21:16:57