1、客户端功能实现 服务器主窗体实现服务器主窗体实现 业务逻辑层业务逻辑层-ServerUtil类实现类实现 查看在线用户信息窗体实现查看在线用户信息窗体实现 DataTable的使用的使用 客户端登录实现客户端登录实现 客户端主窗体实现客户端主窗体实现 业务逻辑层业务逻辑层-ClientUtil类实现类实现 功能介绍功能介绍 读取配置信息 连接服务器 验证用户输入 发送登录请求 接收服务器信息UserLoginFrm_Load()窗体加载窗体加载 NetworkStream ns;/基于网络访问的数据流基于网络访问的数据流TcpClient clientsocket;/TCP网络客户端连接网络客
2、户端连接string IP;/存储服务器存储服务器IP地址地址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;ClientUtil类类 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;/文件内容(文件内容(192.168.1.101:8000)loginbtn_Click()功能:登录按钮事件功能:登录按钮事件private void loginbtn_Click(o
4、bject sender,EventArgs e)/验证拥护输入验证拥护输入 if(ClientConnection()/判断连接是否成功判断连接是否成功 switch(ReceiveWithServer()/获取从服务器端返回的信息并进行相应处理获取从服务器端返回的信息并进行相应处理 case 1:/构造一个构造一个ClientMainFrm窗体的实例窗体的实例 ClientMainFrm mainfrm=new ClientMainFrm(this.userAccounttxt.Text.Trim(),clientsocket);mainfrm.Show();/显示主窗体显示主窗体 Cli
5、entUtil.SaveSetting(IP+:+port);/保存配置信息保存配置信息 this.Visible=false;break;case 2:default:验证用户输入验证用户输入 用户名非空、必须为有效字符非空、必须为有效字符 密码非空、长度限制非空、长度限制 服务器IP地址必须为有效的必须为有效的IP地址地址 服务器端口号必须为整数必须为整数ClientConnection()功能:连接服务器功能:连接服务器private bool ClientConnection()bool flag=false;try /以用户输入的以用户输入的IP地址和端口号建立地址和端口号建立Tcp
6、Client连接连接 clientsocket=new TcpClient(IP,port);/创建用于发送接收数据的创建用于发送接收数据的NetworkStream ns=clientsocket.GetStream();flag=true;catch(Exception err)/添加异常处理过程添加异常处理过程 flag=false;return flag;ReceiveWithServer()-1private int ReceiveWithServer()bool keepalive=true;string serverresponse=;/定义登录请求字符串定义登录请求字符串 st
7、ring 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;ReceiveWithServer()-2 /将接收到的信息反编码成字符串将接收到的信息反编码成字符串 serverresponse=Encoding.UTF8.Get
9、String(buffer).Substring(0,bufLen);int sub=serverresponse.IndexOf(0);if(sub 0)serverresponse=serverresponse.Substring(0,sub);/截取字符串截取字符串 if(serverresponse!=)keepalive=false;return Dispose(serverresponse);/返回处理后的结果值返回处理后的结果值 ClientUtil类类-SaveSetting()实现实现 public static void SaveSetting(string str)if(
10、!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();演示客户端登录功能演示客户端登录功能 主窗体功能主窗体功能 显示用户头像 显示用户昵称
11、 显示在线用户集合 处理用户上下线信息 提供功能操作集合 接收服务器转发的信息局部变量局部变量static TcpClient chatclient;/静态连接对象静态连接对象string username;/接收由接收由UserLoginFrm传递的用户名传递的用户名NetworkStream ns;/向服务器写信息向服务器写信息Thread receive;/侦听线程侦听线程string CorpName=;/保存公司名称保存公司名称Hashtable DeptName=new Hashtable();/保存部门信息保存部门信息Hashtable MyInfo=new Hashtable(
12、);/保存当前用户信息保存当前用户信息Hashtable FriendInfo=new Hashtable();/保存好友信息保存好友信息 Hashtable onlineuser=new Hashtable();/保存当前在线用户的详细信息保存当前在线用户的详细信息Hashtable ChatFrms=new Hashtable();/保存聊天窗体信息保存聊天窗体信息构造函数构造函数public ClientMainFrm(string user,TcpClient tcpsocket)this.username=user;chatclient=tcpsocket;ns=chatclient
13、.GetStream();InitializeComponent();主窗体加载事件主窗体加载事件private void ClientMainFrm_Load(object sender,EventArgs e)/向服务器发送向服务器发送“Show”请求命令,并接收信息请求命令,并接收信息 this.LoadData(Show|+this.username);/为控件属性赋值为控件属性赋值 this.nikeNamelbl.Text=MyInfoUserName.ToString();/加载用户头像图片加载用户头像图片 this.headPic.Image=Image.FromFile(Ap
14、plication.StartupPath +HeadPic+MyInfoHeadPic.ToString();/向服务器发送向服务器发送“FriendInfo”请求命令,并接收所有在线用户详细信息请求命令,并接收所有在线用户详细信息 this.LoadData(FriendInfo|+this.username);TreeViewToLoad();/初始化树型列表初始化树型列表 /生成线程实例生成线程实例 receive=new Thread(new ThreadStart(ReceiveChat);receive.Start();/启动线程启动线程 LoadData()向服务器发送请求命令
15、向服务器发送请求命令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).Substring(0,bufLen);serverresponse=CheckChar(serverresponse);
16、/截取字符截取字符 if(serverresponse!=)keepalive=false;/处理接收到的信息处理接收到的信息 LoadData()处理服务器返回的信息处理服务器返回的信息string tokens=serverresponse.Split(|);if(tokens0=Info)CorpName=ClientUtil.GetCorpName(tokens1);/获取公司信息获取公司信息 /获取部门信息获取部门信息 DeptName=ClientUtil.GetDeptName(tokens2);/获取个人信息获取个人信息 MyInfo=ClientUtil.GetMyInfo(
17、tokens3);/获取在线用户基本信息获取在线用户基本信息 FriendInfo=ClientUtil.GetUserInfo(tokens4);if(tokens0=FriendInfo)/获取好友详细信息获取好友详细信息 onlineuser=ClientUtil.GetFriendInfo(tokens);ClientUtil类类 GetCorpName()功能:获取公司信息 参数:string 返回值:string GetDeptName()功能:获取部门信息 参数:string 返回值:Hashtable GetMyInfo()功能:获取当前用户的详细信息 参数:string 返回
18、值:Hashtable GetUserInfo()功能:获取在线用户的基本信息 参数:string 返回值:Hashtable GetFriendInfo()功能:获取在线用户的详细信息 参数:string 返回值:HashtableTreeViewToLoad()-1初始化树型控件初始化树型控件private void TreeViewToLoad()this.MainTView.ImageList=this.ImgList;/为为TreeView控件的控件的ImageList属性赋值属性赋值 TreeNode Fnode=new TreeNode(CorpName);/定义定义TreeVi
19、ew 对象的对象的TreeNode 节点节点 Fnode.ImageIndex=0;/定义定义 TreeNode对象的图片索引对象的图片索引 try foreach(DictionaryEntry dept in DeptName)/循环遍历部门信息集合循环遍历部门信息集合 TreeNode ChildNode=new TreeNode(dept.Value.ToString();定义部门节点定义部门节点 ChildNode.ImageIndex=0;ChildNode.Name=dept.Value.ToString();/定义接点名称定义接点名称 foreach(DictionaryEnt
20、ry friend in FriendInfo)/循环遍历用户信息集合循环遍历用户信息集合 string temp=friend.Key.ToString().Split(*);if(temp0!=this.username)/判断用户集合对象中是否包含自己判断用户集合对象中是否包含自己 TreeViewToLoad()-2初始化树型控件初始化树型控件 if(dept.Key.Equals(friend.Value)/判断用户所在部门是否和部门信息一致判断用户所在部门是否和部门信息一致 TreeNode node=new TreeNode(temp1);/定义用户子节点定义用户子节点 node
21、.Name=temp0;/设置节点的名称设置节点的名称 node.ContextMenuStrip=this.RightMenu;/为树型节点添加右键菜单为树型节点添加右键菜单 node.ImageIndex=1;node.SelectedImageIndex=1;设置选中时图片设置选中时图片 ChildNode.Nodes.Add(node);/如果一致添加到此部门节点下如果一致添加到此部门节点下 Fnode.Nodes.Add(ChildNode);/添加部门子节点添加部门子节点 this.MainTView.Nodes.Add(Fnode);/向向TreeView控件中添加根节点控件中添
22、加根节点 this.MainTView.ExpandAll();/展开全部树节点展开全部树节点 举例演示举例演示TreeView控件的使用控件的使用ReceiveChat()-1接收信息接收信息private void ReceiveChat()bool keep=true;while(keep)try string serverresponse=;Socket sc=chatclient.Client;Byte buffer=new Byte1024;int bufLen=sc.Available;sc.Receive(buffer,0,sc.Available,SocketFlags.No
23、ne);/接收信息接收信息 if(bufLen=0)continue;serverresponse=Encoding.UTF8.GetString(buffer).Substring(0,bufLen);serverresponse=CheckChar(serverresponse);/截取字符截取字符ReceiveChat()-2接收用户上线信息接收用户上线信息string tokens=serverresponse.Split(|);switch(tokens0)case UserOnLine:/判断是否是上线信息判断是否是上线信息 MessageBox.Show(tokens1);OnL
24、ineUser user=ClientUtil.GetOnLineUser(tokens2);onlineuser.Add(user.UserAccount,user);SetTreeView(user,Add);break;ClientUtil类类 GetOnLineUser()-获取上线用户的信息返回在线对象public static OnLineUser GetOnLineUser(string str)OnLineUser user=new OnLineUser();string info=str.Split(,);Hashtable OneFriend=new Hashtable()
25、;for(int j=0;j info.Length;j+)string temp=infoj.Split(:);OneFriend.Add(temp0,temp1);user.UserAccount=OneFriendUserAccount.ToString();user.DeptName=OneFriendDeptName.ToString();return user;SetTreeView()-1动态改变动态改变TreeView控件属性控件属性delegate void AddNodeDelegate(OnLineUser user,string str);/定义委托定义委托 priva
26、te void SetTreeView(OnLineUser user,string 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
27、.RightMenu;SetTreeView()-2动态改变动态改变TreeView控件属性控件属性 child.ImageIndex=1;child.SelectedImageIndex=1;/根据用户所在部门查找其父节点根据用户所在部门查找其父节点 TreeNode fnode=this.MainTView.Nodes0.Nodesuser.DeptName;/向父类节点中添加节点向父类节点中添加节点 fnode.Nodes.Add(child);else/如果不是添加则删除此节点如果不是添加则删除此节点 /根据用户部门名称查找其所在父节点根据用户部门名称查找其所在父节点 TreeNode
28、 fnode=this.MainTView.Nodes0.Nodesuser.DeptName;/删除下线用户节点删除下线用户节点 fnode.Nodes.Remove(fnode.Nodesuser.UserAccount);ReceiveChat()-3处理用户下线信息处理用户下线信息case UserExit:/判断是否是下线信息判断是否是下线信息 string temp=tokens2.Split(,);string info=temp0.Split(:);if(info1!=username)MessageBox.Show(tokens1);OnLineUser userinfo=(
29、OnLineUser)onlineuserinfo1;SetTreeView(userinfo,Remove);onlineuser.Remove(info1);break;ReceiveChat()-4处理聊天信息处理聊天信息case Chat:/判断是否是聊天信息判断是否是聊天信息 string tempsender=tokens1.Split($);/获取好友信息获取好友信息 OnLineUser onuser=(OnLineUser)onlineusertempsender0;/根据好友名称生成聊天记录文件名根据好友名称生成聊天记录文件名 string filename=usernam
30、e+_+onuser.UserAccount+.txt;/保存聊天记录保存聊天记录 ClientUtil.SaveChatLog(filename,tokens2);/得到聊天窗体,显示聊天记录得到聊天窗体,显示聊天记录 ChatFrm chatfrm=GetChatFrm(onuser.UserAccount,tokens2);SetFrmVisible(chatfrm,false);new Thread(new ThreadStart(chatfrm.ShowFrm).Start();break;ClientUtil类类-SaveChatLog()保存聊天信息保存聊天信息public st
31、atic 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(filename)/存在就追加到文件
32、末尾存在就追加到文件末尾 GetChatFrm()-从聊天窗体集合中找到某个聊天窗体从聊天窗体集合中找到某个聊天窗体private ChatFrm GetChatFrm(string str,string message)Socket socket=chatclient.Client;/定义定义Socket对象的实例,用于构造新的对象的实例,用于构造新的ChatFrm实例实例 ChatFrm chatfrm=null;/定义定义ChatFrm的引用的引用 if(ChatFrmsstr!=null)/根据传递的用户名,从根据传递的用户名,从ChatFrms集合中查找是否存在该窗口集合中查找是否存
33、在该窗口 chatfrm=(ChatFrm)ChatFrmsstr;/如果存在就提取出来如果存在就提取出来 SetText(chatfrm.GetChatLogtxt,message);/设置设置chatLogtxt的的Text属性属性 else OnLineUser user=(OnLineUser)onlineuserstr;chatfrm=new ChatFrm(user,MyInfo,socket);/如果不存在就重新构造新的如果不存在就重新构造新的ChatFrm窗体窗体 SetText(chatfrm.GetChatLogtxt,message);/设置设置chatLogtxt 的的
34、Text属性属性 ChatFrms.Add(str,chatfrm);/将打开的新窗体添加到将打开的新窗体添加到ChatFrms聊天窗体集合对象中聊天窗体集合对象中 return chatfrm;/返回聊天窗体返回聊天窗体 SetText()-动态设置动态设置TextBox控件的控件的Text属性属性delegate void SetTextCallback(TextBox txtbox,string text);/定义委托定义委托private void SetText(TextBox txtbox,string text)if(txtbox.InvokeRequired)SetTextCa
35、llback d=new SetTextCallback(SetText);txtbox.Invoke(d,new object txtbox,text);else txtbox.AppendText(text+rn);SetFrmVisible()-动态设置窗体的动态设置窗体的Visible属性属性delegate void FrmShowDelegate(ChatFrm chatfrm,bool show);/定义委托定义委托private void SetFrmVisible(ChatFrm chatfrm,bool show)if(chatfrm.InvokeRequired)FrmShowDelegate d=new FrmShowDelegate(SetFrmVisible);chatfrm.Invoke(d,new object chatfrm,show);else if(show)/判断显示状态判断显示状态 chatfrm.Visible=true;else chatfrm.Visible=false;演示主窗体运行结果演示主窗体运行结果 客户端登录实现客户端登录实现 客户端主窗体实现客户端主窗体实现 业务逻辑层业务逻辑层-ClientUtil类实现类实现
侵权处理QQ:3464097650--上传资料QQ:3464097650
【声明】本站为“文档C2C交易模式”,即用户上传的文档直接卖给(下载)用户,本站只是网络空间服务平台,本站所有原创文档下载所得归上传人所有,如您发现上传作品侵犯了您的版权,请立刻联系我们并提供证据,我们将在3个工作日内予以改正。