
⑥ 小山束高罩聊董牧树学院 Shandong Institute of Commerce and Technology 第五章 服务器功能实现2
第五章 服务器功能实现2

上章回顾 实现数据访问层 ·实现数据实体层 实现业务逻辑层 实现部门信息维护功能 图U☑ home back first prev next last
home back first prev next last 2 上章回顾 • 实现数据访问层 • 实现数据实体层 • 实现业务逻辑层 • 实现部门信息维护功能

本章目标 主窗体实现 ·业务逻辑层.ServerUtil类实现 ·查看在线用户信息窗体实现 。DataTable的使用 窗U国 home back first prev next last 3
home back first prev next last 3 本章目标 • 主窗体实现 • 业务逻辑层-ServerUtil类实现 • 查看在线用户信息窗体实现 • DataTable的使用

主窗体实现-1 主窗体功能 ©5 Server服务器服务已停止 ▣x 信息维护心系统管理0帮助灿 -启动服务 可■X -停止服务 -查看在线用户信息 -信息处理和信息转发 圖a国 home back first prev next last 4
home back first prev next last 4 主窗体实现-1 • 主窗体功能 – 启动服务 – 停止服务 – 查看在线用户信息 – 信息处理和信息转发

主窗体实现2 主窗体所用到的方法: -StartServer0(:启动服务器服务 -StopServer0(:停止服务器服务并通知客户端 -SetText((string text):线程安全访问信息显示文本框 -ServiceClient0(:接收信息并做出相应的处理 -StartListening0:启动服务器侦听 图U网☑ home back first prev next last5
home back first prev next last 5 主窗体实现-2 • 主窗体所用到的方法: – StartServer():启动服务器服务 – StopServer():停止服务器服务并通知客户端 – SetText(string text): 线程安全访问信息显示文本框 – ServiceClient():接收信息并做出相应的处理 – StartListening():启动服务器侦听

主窗体实现3 全局变量定义 定义客户端集合保存在线用户 Hashtable clients new Hashtable(); 从配置文件中获取端口号 private static int listenport=Convert.Tolnt32(UtilClass.Util.GetPortSetting()); 侦听客户端的连接 TcpListener listener null; 处理客户端请求线程 private Thread clientservice; 侦听客户端请求线程 private Thread threadListen; bool start=false; 图U国✉因 home back first prev next last 6
home back first prev next last 6 主窗体实现-3 • 全局变量定义 //定义客户端集合保存在线用户 Hashtable clients = new Hashtable(); //从配置文件中获取端口号 private static int listenport = Convert.ToInt32(UtilClass.Util.GetPortSetting()); //侦听客户端的连接 TcpListener listener = null; //处理客户端请求线程 private Thread clientservice; //侦听客户端请求线程 private Thread threadListen; bool start = false;

主窗体实现-4 ·StartServer(0实现 private void StartServer() this.Text="Server服务器服务已启动" 设置工具栏状态 this.StartServertool.Enabled=false; this.StopServertool.Enabled =true: 设置菜单栏状态 this.StartServerMenultem.Enabled=false; this.StopServerMenultem.Enabled=true; start=true; threadListen=new Thread(new ThreadStart(StartListening);):∥设置侦听线程 threadListen.Start(;∥启动侦听线程 IPAddress ipHostinfo=Dns.GetHostAddresses(Dns.GetHostName()); IPAddress ipAddress=ipHostlnfo[0]; SetText"(服务已启动-"+ipAddress+":"+listenport); 固☑国■ home back first prev next last 7
home back first prev next last 7 主窗体实现-4 • StartServer()实现 private void StartServer() { this.Text = "Server 服务器 服务已启动"; //设置工具栏状态 this.StartServertool.Enabled = false; this.StopServertool.Enabled = true; //设置菜单栏状态 this.StartServerMenuItem.Enabled = false; this.StopServerMenuItem.Enabled = true; start = true; threadListen = new Thread(new ThreadStart(StartListening)); //设置侦听线程 threadListen.Start(); //启动侦听线程 IPAddress[] ipHostInfo = Dns.GetHostAddresses(Dns.GetHostName()); IPAddress ipAddress = ipHostInfo[0]; SetText("服务已启动-------" + ipAddress + ":" + listenport); }

主窗体实现5 SetText0实现 SetText0(方法的作用:多线程对控件属性的安全访问 delegate void SetTextCallback(string text); private void SetText(string text) 要执行不在同一线程内的控件的方法,必须使用该控件的voke方法 if(this.infoShowtxt.InvokeRequired) SetTextCallbackd=new SetTextCallback(SetText); this.Invoke(d,new object{text)); } else this.infoShowtxt.Text+=text+"Irln"; 段旦 图回国国回■ home back first prev next last 8
home back first prev next last 8 主窗体实现-5 • SetText()实现 – SetText()方法的作用:多线程对控件属性的安全访问 delegate void SetTextCallback(string text); private void SetText(string text) { //要执行不在同一线程内的控件的方法,必须使用该控件的Invoke方法 if (this.infoShowtxt.InvokeRequired) { SetTextCallback d = new SetTextCallback(SetText); this.Invoke(d, new object[] { text }); } else { this.infoShowtxt.Text += text + "\r\n"; } }

主窗体实现-6 ·StopServer()实现 private void StopServer this.Tet="Server服务器服务已停止" this.StartServertool.Enabled=true; this.StartServerMenultem.Enabled =true; this.StopServerMenultem.Enabled=false this.StopServertool.Enabled =false; this..infoShowbxt.Text="服务已停止n foreach(DictionaryEntry alluser in clients) 训循环获取客户端对象 Client cl=(Client)alluser.Value; ServerUtil..SendToClient(cl,"ServerExit")i∥发送服务器停止服务信息 Userlnfo..UpdateUserOnLine("",cd.Onlineuser..UserAccount);∥更改用户在线状态 listener.stop(); listener=null; 川终止线程 start=false; 图U国因 home back first prev next last 9
home back first prev next last 9 主窗体实现-6 • StopServer()实现 private void StopServer() { this.Text = "Server 服务器 服务已停止"; this.StartServertool.Enabled = true; this.StartServerMenuItem.Enabled = true; this.StopServerMenuItem.Enabled = false; this.StopServertool.Enabled = false; this.infoShowtxt.Text = "服务已停止.....\r\n"; foreach (DictionaryEntry alluser in clients) {//循环获取客户端对象 Client cl = (Client)alluser.Value; ServerUtil.SendToClient(cl, "ServerExit|"); //发送服务器停止服务信息 UserInfo.UpdateUserOnLine(" ",cl.Onlineuser.UserAccount); //更改用户在线状态 } listener.stop(); listener = null; //终止线程 start = false; }

主窗体实现-7 ServerUti类 SendToClient0功能:向客户端发送信息 public static void SendToClient(Client cl,string clientCommand) 吃 ∥将字符串消息转换为字节数组 Byte message =Encoding.UTF8.GetBytes(clientCommand); Sockets=cl.Sock∥定义Socket对象 ifs.Connected)∥判断连接状态 s.Send(message,.message..Length,.0%∥发送信息到客户端 catch(Exception err) 川异常处理 叟 return; 世 窗a因☑■ home back first prev next last 10
home back first prev next last 10 主窗体实现-7 • ServerUtil类 – SendToClient()功能:向客户端发送信息 public static void SendToClient(Client cl, string clientCommand) { try { //将字符串消息转换为字节数组 Byte[] message = Encoding.UTF8.GetBytes(clientCommand); Socket s = cl.Sock; //定义Socket对象 if (s.Connected) //判断连接状态 { s.Send(message, message.Length, 0); //发送信息到客户端 } } catch (Exception err) { //异常处理 return; } }