服务器功能实现2_第1页
服务器功能实现2_第2页
服务器功能实现2_第3页
服务器功能实现2_第4页
服务器功能实现2_第5页
已阅读5页,还剩27页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、第五章服务器功能实现2上章回顾实现数据访问层实现数据实体层实现业务逻辑层实现部门信息维护功能本章目标主窗体实现业务逻辑层-ServerUtil类实现查看在线用户信息窗体实现DataTable的使用主窗体实现-1主窗体功能启动服务停止服务查看在线用户信息 信息处理和信息转发主窗体实现-2主窗体所用到的方法:StartServer():启动服务器服务StopServer():停止服务器服务并通知客户端SetText(string text): 线程安全访问信息显示文本框ServiceClient():接收信息并做出相应的处理StartListening():启动服务器侦听主窗体实现-3全局变量定义

2、/定义客户端集合保存在线用户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;主窗体实现-4StartServer()实现

3、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

4、); /设置侦听线程 threadListen.Start(); /启动侦听线程 IPAddress ipHostInfo = Dns.GetHostAddresses(Dns.GetHostName(); IPAddress ipAddress = ipHostInfo0; SetText(服务已启动- + ipAddress + : + listenport); 主窗体实现-5SetText()实现SetText()方法的作用:多线程对控件属性的安全访问 delegate void SetTextCallback(string text); private void SetText(str

5、ing text) /要执行不在同一线程内的控件的方法,必须使用该控件的Invoke方法 if (Showtxt.InvokeRequired) SetTextCallback d = new SetTextCallback(SetText); this.Invoke(d, new object text ); else Showtxt.Text += text + rn; 主窗体实现-6StopServer()实现 private void StopServer() this.Text = Server 服务器服务已停止; this.StartServer

6、tool.Enabled = true; this.StartServerMenuItem.Enabled = true; this.StopServerMenuItem.Enabled = false; this.StopServertool.Enabled = false; Showtxt.Text = 服务已停止.rn; foreach (DictionaryEntry alluser in clients) /循环获取客户端对象 Client cl = (Client)alluser.Value; ServerUtil.SendToClient(cl, ServerE

7、xit|); /发送服务器停止服务信息 UserInfo.UpdateUserOnLine( ,cl.Onlineuser.UserAccount); /更改用户在线状态 listener.stop(); listener = null; /终止线程 start = false; 主窗体实现-7ServerUtil类SendToClient()功能:向客户端发送信息 public static void SendToClient(Client cl, string clientCommand) try /将字符串消息转换为字节数组 Byte message = Encoding.UTF8.Ge

8、tBytes(clientCommand); Socket s = cl.Sock; /定义Socket对象 if (s.Connected) /判断连接状态 s.Send(message, message.Length, 0); /发送信息到客户端 catch (Exception err) /异常处理 return; 主窗体实现-8StartListening()实现 private void StartListening() listener = new TcpListener(IPAddress.Parse(Util.GetIPAddress(),listenport);/建立侦听对象

9、,侦听8000端口 listener.Start(); /启动侦听 while (start)/循环侦听 try Socket s = listener.AcceptSocket(); /接收从客户端发送的连接 clientservice = new Thread(new ParameterizedThreadStart(ServiceClient); clientservice.Start(s); /启动多线程 catch (Exceptionerr) /异常处理 listener.Stop(); listener = null; 主窗体实现-9ServiceClient()实现-1循环接收

10、客户端发送的信息 private void ServiceClient(object client) Socket clientSocket = (Socket)client; bool keepAlive = true; /循环接收并处理客户端的请求 while (start & keepAlive) /定义缓冲区 Byte buffer = new Byte1024; int bytes = 0; string clientcommand = null; try /将接收到的信息填充到缓冲区内 bytes = clientSocket.Receive(buffer, 0, buffer.L

11、ength, SocketFlags.None); /将获取到的信息转换为UTF8编码 clientcommand = Encoding.UTF8.GetString(buffer).Substring(0, bytes);主窗体实现-10ServiceClient()实现-2处理接收到的信息 while (bytes 0 & clientSocket.Available 0) bytes = clientSocket.Receive(buffer, 0, buffer.Length, SocketFlags.None); clientcommand += Encoding.UTF8.GetS

12、tring(buffer).Substring(0, bytes); catch (Exception err) /异常处理过程 /判断字符串中是否包含0如果包含则截取。 int sub = clientcommand.IndexOf(0); if (sub 0) clientcommand = clientcommand.Substring(0, sub); 主窗体实现11 ServiceClient()实现-3处理用户请求 /分割字符串 string tokens = clientcommand.Split(new Char | ); Client c = null; string mes

13、sage = null; switch (tokens0) case “Login”: ./处理登录请求 case “show”: ./处理显示信息请求 case “FriendInfo”: ./处理好友资料 case “Modify”: ./处理修改基本资料请求 case “Exit”: ./处理退出请求 case “chat”: ./处理聊天请求 主窗体实现-12ServiceClient()实现-3处理用户登录请求1switch (tokens0) case Login“: EndPoint ep = client.RemoteEndPoint; OnLineUser user = Se

14、rverUtil.CreateOnLineUser(tokens1); /创建在线用户对象 Client c = new Client(user, ep, clientservice, client); /创建客户端对象 string IsLogin = ServerUtil.GetUserLogin(tokens1); /验证用户登录 if ( IsLogin = OK) /验证登录是否成功,验证失败则提示用户登录失败 string username = tokens1.Split(&); if (!clients.Contains(username0) /判断此用户在线状态,如果在线则提示

15、当前用户已经登录 string ip = (IPEndPoint)client.RemoteEndPoint).Address.ToString(); /获得用户登录IP string port = (IPEndPoint)client.RemoteEndPoint).Port.ToString(); /获得用户端口号 SetText( ip + : + port); /记录登录用户信息的IP string message = LIST| + IsLogin; 主窗体实现-13ServiceClient()实现-4处理用户登录请求2 foreach (DictionaryEntry allus

16、er in clients) /遍历在线用户集合,向所有在线用户发送该用户已登录的信息 Client caa = (Client)alluser.Value; message = ServerUtil.GetOnLineMessage(c.Onlineuser); /根据用户返回此用户登录信息。 ServerUtil.SendToClient(caa, message); /发送信息 clients.Add(username0, c); /添加到在线用户列表中 UserInfo.UpdateUserOnLine(ip, username0); /更改此用户 的在线状态 ServerUtil.S

17、endToClient(c, message); /向客户端发送消息 else ServerUtil.SendToClient(c , “LIST|OnLine”); /发送消息已 经在线信息 else ServerUtil.SendToClient(c ,“LIST|” + IsLogin); /发送登录失 败消息 主窗体实现-14ServerUtil类CreateOnLineUser()功能:创建新的在线用户对象public static OnLineUser CreateOnLineUser(string username) string temp = username.Split(&)

18、; /拆分字符串 UserInfo userinfo = UserInfo.SelectUserInfo(temp0); /根据用户帐号返回用户对象 OnLineUser user = new OnLineUser();/创建在线用户对象实例 user.UserAccount = userinfo.UserAccount; /为实例对象赋值 user.UserName = userinfo.UserName; user.Sex = userinfo.Sex; user.Email = userinfo.Email; /根据用户所在部门编号,获得部门名称 user.DeptName = Dept

19、Info.SelectDeptInfo(userinfo.DeptID) .DeptName; return user; /返回对象实例 主窗体实现-15ServerUtil类GetUserLogin()功能:根据用户名和密码验证用户登录 public static string GetUserLogin(string str) string result = ; string user = str.Split(&); /验证客户登录成功返回Ok 失败返回NO result = UserInfo.UserLogin(user0, user1); return result; 主窗体实现-16S

20、erverUtil类GetOnLineMessage()功能:获取上线用户的基本信息 public static string GetOnLineMessage(OnLineUser user) /注意:这里的上线用户信息用|间隔 string message = UserOnLine|用户 + user.UserName + 上线了! + |UserAccount: + user.UserAccount + ,UserName: + user.UserName + ,NickName: + user.NickName + ,PWD: + user.Pwd + ,Region: + user.

21、Region + ,Sex: + user.Sex + ,Phone: + user.Phone + ,Email: + user.Email + ,MyInfo: + user.MyInfo + ,DeptName: + user.DeptName + ,HeadPic: + user.HeadPic; return message; 主窗体实现-17ServiceClient()实现-5向客户端发送基本信息 /显示信息 case Show : /从当前在线用户集合对象中查找其信息。 Client c = (Client)clientstokens1; /将获得的信息形成一个字符串传递到客户

22、端 string message = Info| + ServerUtil.GetCorpInfo() + | + ServerUtil.GetDeptInfo() + | + ServerUtil.GetUserInfo(tokens1) + | + ServerUtil.GetOnlineUser() ; ServerUtil.SendToClient(c, message); /发送到客户端 break;主窗体实现-18ServerUtil类GetCorpInfo()功能:获取公司基本信息参数 :无返回值:公司名称GetDeptInfo()功能:获取部门基本信息参数:无返回值:部门名称和

23、部门编号GetUserInfo()功能:获取当前用户的基本信息参数:当前用户名返回值:当前用户的详细信息GetOnlineUser()功能:获取当前在线用户的详细信息参数:无返回值:所有在线用户的详细信息主窗体实现-19ServerUtil类GetOnLineUser()功能:获取当前在线用户信息public static string GetOnLineUserInfo(string useraccount, Hashtable clients) StringBuilder str = new StringBuilder(); /定义可变字符字符串 foreach (DictionaryEn

24、try clientvalue in clients) if (useraccount != clientvalue.Key.ToString() string account = clientvalue.Key.ToString(); Client client = (Client)clientvalue.Value; OnLineUser user = (OnLineUser)client.Onlineuser; str.Append(| + account + &UserAccount: + user.UserAccount + ,UserName: + user.UserName +

25、,NickName: + user.NickName + ,PWD: + user.Pwd + ,Region: + user.Region + ,Sex: + user.Sex + ,Phone: + user.Phone + ,Email: + user.Email + ,MyInfo: + user.MyInfo + ,DeptName: + user.DeptName + ,HeadPic: + user.HeadPic); return str.ToString(); 主窗体实现-20ServiceClient()实现-6处理聊天请求 /是否是聊天请求case Chat : /分割字

26、符串$ string tempincept = tokens3.Split($); /获取聊天信息接收者对象 Client incept = (Client)clientstempincept0; /处理聊天信息 string message = Chat| + tokens1 + | + tokens2; /将信息转发到接收者 ServerUtil.SendToClient(incept, message); break; 主窗体实现-21ServiceClient()实现-7处理用户下线请求 /下线通知 case Exit : Client c = (Client)clientstoken

27、s1; /循环遍历在线用户集合发送用户下线通知 foreach (DictionaryEntry alluser in clients) /获取下线用户对象 Client caa = (Client)alluser.Value; /获取用户下线信息 string message = ServerUtil.GetExitMessage(c.Onlineuser); ServerUtil.SendToClient(caa, message); /从在线用户集合中移除下线用户 clients.Remove(tokens1); UserInfo.UpdateUserOnLine( , tokens1)

28、; /修改用户在线状态 break; 主窗体实现-22ServerUtil类GetExitMessage()功能:获取下线用户的基本信息参数:OnLineUser对象实例返回值:下线信息 public static string GetExitMessage(OnLineUser user) string message = UserExit|用户 + user.UserName + 下线了! + |UserAccount: + user.UserAccount + ,UserName: + user.UserName; return message; 主窗体实现-23演示主窗体运行效果查看在

29、线用户窗体实现-1功能介绍查看当前在线用户的详细信息使用DataTable对象使用DataGridView控件查看在线用户窗体实现-2DataGridView控件将数据绑定到 DataGridView 控件非常简单和直观,在大多数情况下,只需设置 DataSource 属性即可。在绑定到包含多个列表或表的数据源时,只需将 DataMember 属性设置为指定要绑定的列表或表的字符串即可。 /查看在线用户信息窗体加载事件 private void ShowOnlineUserFrm_Load(object sender, EventArgs e) /为DataGridView控件绑定数据 this.UserInfoview.DataSource = GetData(); 查看在线用户窗体实现-3GetData ()方法实现-1向DataTable中添加列 private DataTable GetData() /定义集合保存在线用户列表 ArrayList list =

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论