客户端功能实现课件_第1页
客户端功能实现课件_第2页
客户端功能实现课件_第3页
客户端功能实现课件_第4页
客户端功能实现课件_第5页
已阅读5页,还剩30页未读 继续免费阅读

下载本文档

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

文档简介

1、第六章客户端功能实现第六章客户端功能实现上章回顾服务器主窗体实现业务逻辑层-ServerUtil类实现查看在线用户信息窗体实现DataTable的使用上章回顾服务器主窗体实现本章目标客户端登录实现客户端主窗体实现业务逻辑层-ClientUtil类实现本章目标客户端登录实现客户端登录-1功能介绍读取配置信息连接服务器验证用户输入发送登录请求接收服务器信息客户端登录-1功能介绍客户端登录-2UserLoginFrm_Load()窗体加载 NetworkStream ns;/基于网络访问的数据流TcpClient clientsocket;/TCP网络客户端连接string IP;/存储服务器IP地

2、址int port; /存储服务器侦听端口局部变量定义private void UserLoginFrm_Load(object sender, EventArgs e) string str = ClientUtil.ReadSetting(); /读取配置信息 if (str != ) string temp = str.Split(:); this.ipAddresstxt.Text = temp0; this.porttxt.Text = temp1; 客户端登录-2UserLoginFrm_Load()窗体加载客户端登录-3ClientUtil类ReadSetting()功能:从文件

3、中读取配置信息public static string ReadSetting() string str = ; if (File.Exists(Setting.txt) /构造一个文件流用来读取配置信息 using (StreamReader sr = File.OpenText(Setting.txt) /读取信息 str = sr.ReadLine(); sr.Close(); return str; /文件内容(01:8000) 客户端登录-3ClientUtil类public stati客户端登录-4loginbtn_Click() 功能:登录按钮事件priva

4、te void loginbtn_Click(object sender, EventArgs e) /验证拥护输入 if (ClientConnection() /判断连接是否成功 switch (ReceiveWithServer() /获取从服务器端返回的信息并进行相应处理 case 1: /构造一个ClientMainFrm窗体的实例 ClientMainFrm mainfrm = new ClientMainFrm(this.userAccounttxt.Text.Trim(),clientsocket); mainfrm.Show(); /显示主窗体 ClientUtil.Save

5、Setting(IP + : + port); /保存配置信息 this.Visible = false; break; case 2: default: 客户端登录-4loginbtn_Click() 功能:登录按客户端登录-5验证用户输入用户名非空、必须为有效字符密码非空、长度限制服务器IP地址必须为有效的IP地址服务器端口号必须为整数客户端登录-5验证用户输入客户端登录-6ClientConnection()功能:连接服务器private bool ClientConnection() bool flag = false; try /以用户输入的IP地址和端口号建立TcpClient连接

6、 clientsocket = new TcpClient(IP, port); /创建用于发送接收数据的NetworkStream ns = clientsocket.GetStream(); flag = true; catch (Exception err) /添加异常处理过程 flag = false; return flag; 客户端登录-6ClientConnection()功能:连接客户端登录-7ReceiveWithServer()-1private int ReceiveWithServer() bool keepalive = true; string serverresp

7、onse = ; /定义登录请求字符串 string command = Login| + this.userAccounttxt.Text.Trim() + & + this.pwdtxt.Text.Trim(); /将消息转换为UTF8编码格式的字节数组 Byte outbytes = System.Text.Encoding.UTF8.GetBytes(command.ToCharArray(); ns.Write(outbytes, 0, outbytes.Length); /向服务器发送消息 Socket sc = clientsocket .Client; /定义Socket用于接

8、收服务器返回的信息 while (keepalive) Byte buffer = new Byte1024; /定义缓冲区 int bufLen = sc.Available; /从网络接收的、可供读取的数据的字节数。 sc.Receive(buffer, 0, bufLen, SocketFlags.None); /将接收到的信息填充到缓冲区 if (bufLen = 0) continue;客户端登录-7ReceiveWithServer()-1pr客户端登录-8ReceiveWithServer()-2 /将接收到的信息反编码成字符串 serverresponse = Encoding

9、.UTF8.GetString(buffer).Substring(0, bufLen); int sub = serverresponse.IndexOf(0); if (sub 0) serverresponse = serverresponse.Substring(0, sub); /截取字符串 if (serverresponse != ) keepalive = false; return Dispose(serverresponse); /返回处理后的结果值 客户端登录-8ReceiveWithServer()-2 客户端登录-9ClientUtil类-SaveSetting()实

10、现 public static void SaveSetting(string str) if (!File.Exists(Setting.txt)/判断文件是否存在 using (StreamWriter sw = File.CreateText(Setting.txt) /不存在就创建文件并写记录 sw.WriteLine(str); sw.Close(); else using (StreamWriter sw = File.OpenWrite(Setting.txt) /存在就打开文件,写入信息 sw.WriteLine(str); sw.Close(); 客户端登录-9ClientU

11、til类-SaveSetting客户端登录-10演示客户端登录功能客户端登录-10演示客户端登录功能客户端主窗体-1主窗体功能显示用户头像显示用户昵称显示在线用户集合处理用户上下线信息提供功能操作集合接收服务器转发的信息客户端主窗体-1主窗体功能客户端主窗体-2局部变量static TcpClient chatclient; /静态连接对象string username; /接收由UserLoginFrm传递的用户名NetworkStream ns; /向服务器写信息Thread receive; /侦听线程string CorpName = ;/保存公司名称Hashtable DeptNam

12、e = new Hashtable();/保存部门信息Hashtable MyInfo = new Hashtable();/保存当前用户信息Hashtable FriendInfo = new Hashtable(); /保存好友信息 Hashtable onlineuser = new Hashtable();/保存当前在线用户的详细信息Hashtable ChatFrms = new Hashtable();/保存聊天窗体信息构造函数public ClientMainFrm(string user, TcpClient tcpsocket) this.username = user; c

13、hatclient = tcpsocket; ns = chatclient.GetStream(); InitializeComponent(); 客户端主窗体-2局部变量static TcpClient c客户端主窗体-3主窗体加载事件private void ClientMainFrm_Load(object sender, EventArgs e) /向服务器发送“Show”请求命令,并接收信息 this.LoadData(Show| + this.username); /为控件属性赋值 this.nikeNamelbl.Text = MyInfoUserName.ToString()

14、; /加载用户头像图片 this.headPic.Image = Image.FromFile(Application.StartupPath + HeadPic + MyInfoHeadPic.ToString(); /向服务器发送“FriendInfo”请求命令,并接收所有在线用户详细信息 this.LoadData(FriendInfo| + this.username) ; TreeViewToLoad(); /初始化树型列表 /生成线程实例 receive = new Thread(new ThreadStart(ReceiveChat); receive.Start(); /启动线

15、程 客户端主窗体-3主窗体加载事件private void Cl客户端主窗体-4LoadData()向服务器发送请求命令private void LoadData(string str) /向服务器发送请求 try Socket sc = chatclient.Client; while (keepalive) Byte buffer = new Byte1024; bufLen = sc.Receive(buffer, 0, sc.Available, SocketFlags.None); serverresponse = Encoding.UTF8.GetString(buffer).Su

16、bstring(0, bufLen); serverresponse = CheckChar(serverresponse); /截取字符 if (serverresponse != ) keepalive = false; /处理接收到的信息客户端主窗体-4LoadData()向服务器发送请求命令pr客户端主窗体-5LoadData()处理服务器返回的信息string tokens = serverresponse.Split(|); if (tokens0 = Info) CorpName = ClientUtil.GetCorpName(tokens1); /获取公司信息 /获取部门信息

17、 DeptName = ClientUtil.GetDeptName(tokens2); /获取个人信息 MyInfo = ClientUtil.GetMyInfo(tokens3); /获取在线用户基本信息 FriendInfo = ClientUtil.GetUserInfo(tokens4); if (tokens0 = FriendInfo) /获取好友详细信息 onlineuser = ClientUtil.GetFriendInfo(tokens); 客户端主窗体-5LoadData()处理服务器返回的信息st客户端主窗体-6ClientUtil类GetCorpName()功能:获

18、取公司信息参数:string 返回值:stringGetDeptName()功能:获取部门信息参数:string返回值:HashtableGetMyInfo()功能:获取当前用户的详细信息参数:string返回值:HashtableGetUserInfo()功能:获取在线用户的基本信息参数:string返回值:HashtableGetFriendInfo()功能:获取在线用户的详细信息参数:string返回值:Hashtable客户端主窗体-6ClientUtil类客户端主窗体-7TreeViewToLoad()-1初始化树型控件private void TreeViewToLoad() th

19、is.MainTView.ImageList = this.ImgList; /为TreeView控件的ImageList属性赋值 TreeNode Fnode = new TreeNode(CorpName); /定义TreeView 对象的TreeNode 节点 Fnode.ImageIndex = 0; /定义 TreeNode对象的图片索引 try foreach (DictionaryEntry dept in DeptName) /循环遍历部门信息集合 TreeNode ChildNode = new TreeNode(dept.Value.ToString(); 定义部门节点 C

20、hildNode.ImageIndex = 0; ChildNode.Name = dept.Value.ToString() ; /定义接点名称 foreach (DictionaryEntry friend in FriendInfo) /循环遍历用户信息集合 string temp = friend.Key.ToString().Split(*); if (temp0 != this.username) /判断用户集合对象中是否包含自己 客户端主窗体-7TreeViewToLoad()-1初始化树客户端主窗体-8TreeViewToLoad()-2初始化树型控件 if (dept.Key

21、.Equals(friend.Value) /判断用户所在部门是否和部门信息一致 TreeNode node = new TreeNode(temp1); /定义用户子节点 node.Name = temp0; /设置节点的名称 node.ContextMenuStrip = this.RightMenu; /为树型节点添加右键菜单 node.ImageIndex = 1; node.SelectedImageIndex = 1; 设置选中时图片 ChildNode.Nodes.Add(node); /如果一致添加到此部门节点下 Fnode.Nodes.Add(ChildNode); /添加部

22、门子节点 this.MainTView.Nodes.Add(Fnode); /向TreeView控件中添加根节点 this.MainTView.ExpandAll(); /展开全部树节点 客户端主窗体-8TreeViewToLoad()-2初始化树客户端主窗体-9举例演示TreeView控件的使用客户端主窗体-9举例演示TreeView控件的使用客户端主窗体-10ReceiveChat()-1接收信息private void ReceiveChat() bool keep = true; while (keep) try string serverresponse = ; Socket sc

23、= chatclient.Client; Byte buffer = new Byte1024; int bufLen = sc.Available; sc.Receive(buffer, 0, sc.Available, SocketFlags.None); /接收信息 if (bufLen = 0) continue; serverresponse = Encoding.UTF8.GetString(buffer).Substring(0, bufLen); serverresponse = CheckChar(serverresponse); /截取字符客户端主窗体-10ReceiveC

24、hat()-1接收信息pr客户端主窗体-11ReceiveChat()-2接收用户上线信息string tokens = serverresponse.Split(|); switch (tokens0) case UserOnLine:/判断是否是上线信息 MessageBox.Show(tokens1); OnLineUser user = ClientUtil.GetOnLineUser(tokens2); onlineuser.Add(user.UserAccount, user); SetTreeView(user,Add); break; 客户端主窗体-11ReceiveChat(

25、)-2接收用户上线客户端主窗体-12ClientUtil类GetOnLineUser()-获取上线用户的信息返回在线对象public static OnLineUser GetOnLineUser(string str) OnLineUser user = new OnLineUser(); string info = str.Split(,); Hashtable OneFriend = new Hashtable(); for (int j = 0; j info.Length; j+) string temp = infoj.Split(:); OneFriend.Add(temp0,

26、temp1); user.UserAccount = OneFriendUserAccount.ToString(); user.DeptName = OneFriendDeptName.ToString(); return user; 客户端主窗体-12ClientUtil类public sta客户端主窗体-13SetTreeView()-1动态改变TreeView控件属性delegate void AddNodeDelegate(OnLineUser user,string str); /定义委托 private void SetTreeView(OnLineUser user,strin

27、g str) if (this.MainTView.InvokeRequired) AddNodeDelegate d = new AddNodeDelegate(SetTreeView); this.Invoke(d, new object user,str ); else if (str = Add)/判断是否是添加节点 TreeNode child = new TreeNode(user.UserName); child.Name = user.UserAccount; child.ContextMenuStrip = this.RightMenu; 客户端主窗体-13SetTreeVi

28、ew()-1动态改变Tr客户端主窗体-14SetTreeView()-2动态改变TreeView控件属性 child.ImageIndex = 1; child.SelectedImageIndex = 1; /根据用户所在部门查找其父节点 TreeNode fnode = this.MainTView.Nodes0.Nodesuser.DeptName; /向父类节点中添加节点 fnode.Nodes.Add(child); else /如果不是添加则删除此节点 /根据用户部门名称查找其所在父节点 TreeNode fnode = this.MainTView.Nodes0.Nodesuse

29、r.DeptName; /删除下线用户节点 fnode.Nodes.Remove(fnode.Nodesuser.UserAccount); 客户端主窗体-14SetTreeView()-2动态改变Tr客户端主窗体-15ReceiveChat()-3处理用户下线信息case UserExit:/判断是否是下线信息 string temp = tokens2.Split(,); string info = temp0.Split(:); if(info1 != username) MessageBox.Show(tokens1); OnLineUser userinfo = (OnLineUse

30、r)onlineuserinfo1; SetTreeView(userinfo, Remove); onlineuser.Remove(info1); break;客户端主窗体-15ReceiveChat()-3处理用户下线客户端主窗体-16ReceiveChat()-4处理聊天信息case Chat:/判断是否是聊天信息 string tempsender = tokens1.Split($); /获取好友信息 OnLineUser onuser = (OnLineUser)onlineusertempsender0; /根据好友名称生成聊天记录文件名 string filename = u

31、sername + _ + onuser.UserAccount + .txt; /保存聊天记录 ClientUtil.SaveChatLog(filename, tokens2); /得到聊天窗体,显示聊天记录 ChatFrm chatfrm = GetChatFrm(onuser.UserAccount,tokens2); SetFrmVisible(chatfrm, false); new Thread(new ThreadStart(chatfrm.ShowFrm).Start(); break;客户端主窗体-16ReceiveChat()-4处理聊天信息客户端主窗体-17Client

32、Util类-SaveChatLog()保存聊天信息public static void SaveChatLog(string filename, string chatlog) if (!File.Exists(filename) /判断文件是否存在,不存在就创建文件并写记录 using (StreamWriter sw = File.CreateText(filename) /构造写入流 sw.WriteLine(chatlog); /向文件中写入信息 sw.Close(); /关闭流 else using (StreamWriter sw = File.AppendText(filenam

33、e) /存在就追加到文件末尾 客户端主窗体-17ClientUtil类-SaveChatL客户端主窗体-18GetChatFrm()-从聊天窗体集合中找到某个聊天窗体private ChatFrm GetChatFrm(string str,string message) Socket socket = chatclient.Client; /定义Socket对象的实例,用于构造新的ChatFrm实例 ChatFrm chatfrm = null; /定义ChatFrm的引用 if (ChatFrmsstr!=null) /根据传递的用户名,从ChatFrms集合中查找是否存在该窗口 chatfrm = (ChatFrm)ChatFrmsstr; /如果存在就提取出来 SetText(chatfrm.GetChatLogtxt,message); /设置chatLogtxt的Text

温馨提示

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

最新文档

评论

0/150

提交评论