
小山束高業瞅董教树学院 Shandong Institute of Commerce and Technology 第六章 客户端功能实现
第六章 客户端功能实现

上章回顾 ·服务器主窗体实现 ·业务逻辑层-ServerUtil类实现 ·查看在线用户信息窗体实现 ·DataTable的使用 图a■ home back first prev next last
home back first prev next last 2 上章回顾 • 服务器主窗体实现 • 业务逻辑层-ServerUtil类实现 • 查看在线用户信息窗体实现 • DataTable的使用

本章目标 客户端登录实现 ·客户端主窗体实现 ·业务逻辑层-ClientUtil类实现 图U☑ home back first prev next last 3
home back first prev next last 3 本章目标 • 客户端登录实现 • 客户端主窗体实现 • 业务逻辑层-ClientUtil类实现

客户端登录1 功能介绍 读取配置信息 ©用户登录 .回x 用户名: 连接服务器 密码: - 验证用户输入 IP地址: 端口号: -发送登录请求 登录口 退出 -接收服务器信息 图U国因 home back first prev next last 4
home back first prev next last 4 客户端登录-1 • 功能介绍 – 读取配置信息 – 连接服务器 – 验证用户输入 – 发送登录请求 – 接收服务器信息

客户端登录2 ·局部变量定文 NetworkStream ns;,基于网络访问的数据流 TcpClientclientsocket;:ITCP网络客户端连接 string IP;存储服务器P地址 int port;:存储服务器侦听端口 UserLoginFrm_Load(0窗体加载 private void UserLoginFrm_Load(object sender,EventArgs e) stringstr=ClientUtil..ReadSetting0;读取配置信息 if (str!="") stringtemp=str.Split(:); this.ipAddresstxt.Text=temp[]; this.porttxt.Text=temp[1]; 周UN✉ home back first prev next last
home back first prev next last 5 客户端登录-2 • UserLoginFrm_Load()窗体加载 NetworkStream ns;//基于网络访问的数据流 TcpClient clientsocket; //TCP网络客户端连接 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 = temp[0]; this.porttxt.Text = temp[1]; } }

客户端登录3 ·ClientUtil类 ReadSetting)功能:从文件中读取配置信息 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) 图U☑ home back first prev next last G
home back first prev next last 6 客户端登录-3 • ClientUtil类 – ReadSetting()功能:从文件中读取配置信息 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) }

客户端登录4 ·1 oginbtn_Clicl0功能:登录按钮事裤 private void loginbtn_Click(object sender,EventArgs e) 验证拥护输入.… if(ClientConnection()∥判断连接是否成功 switch (ReceiveWithServer(获取从U服务器端返回的信息并进行相应处理 case 1: I∥构造一个ClientMainFrm窗体的实例 ClientMainFrm mainfrm=new ClientMainFrm(this.userAccountbtText.Trim(),clientsocket): mainfrm.Show0;∥显示主窗体 ClientUtil.SaveSetting(IP+":"+port#I保存配置信息 this.Visible=false; break; case2:… default:.… 图a国国 home back first prev next last 7
home back first prev next last 7 客户端登录-4 • loginbtn_Click() 功能:登录按钮事件 private 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.SaveSetting(IP + ":" + port); //保存配置信息 this.Visible = false; break; case 2: … … default: … … } } }

客户端登录5 验证用户输入 用户名 >非空、必须为有效字符 -密码 >非空、长度限制 -服务器P地址 >必须为有效的P地址 -服务器端口号 >必须为整数 窗a国■ home back first prev next last 8
home back first prev next last 8 客户端登录-5 • 验证用户输入 – 用户名 ➢非空、必须为有效字符 – 密码 ➢非空、长度限制 – 服务器IP地址 ➢必须为有效的IP地址 – 服务器端口号 ➢必须为整数

客户端登录-6 ·℃lientConnection0j能:连接服务器 private bool ClientConnection() boolflag=false; try I以用户输入的IP地址和端口号建立TcpClient连接 clientsocket=new TcpClient(IP,port); 创建用于发送接收数据的NetworkStream ns=clientsocket.GetStream(); flag=true; catch(Exception err) {添加异常处理过程 flag=false; return flag; 图回国回■ home back first prev next last g
home back first prev next last 9 客户端登录-6 • ClientConnection()功能:连接服务器 private bool ClientConnection() { bool flag = false; try { //以用户输入的IP地址和端口号建立TcpClient连接 clientsocket = new TcpClient(IP, port); //创建用于发送接收数据的 NetworkStream ns = clientsocket.GetStream(); flag = true; } catch (Exception err) { //添加异常处理过程 flag = false; } return flag; }

客户端登录7 ReceiveWithServer()-1 private int ReceiveWithServer() bool keepalive=true; string serverresponse="; ∥定义登录请求字符串 string command="Login]"+this.userAccounttxt.Text.Trim()+"&"+this.pwdtxt.Text.Trim(); 将消息转换为UTF8编码格式的字节数组 Byteoutbytes=System.Text.Encoding.UTF8.GetBytes(command.ToCharArray(): ns.Write(outbytes,0,outbytes..Length;:I向服务器发送消息 Socketsc=clientsocket..Client;:∥定义Socket用于接收服务器返回的信息 while(keepalive) Byten buffer=new Bytel[1024;I定义缓冲区 int bufLen=sc.Available;I从网络接收的、可供读取的数据的字节数。 sc.Receive(buffer,,O,bufLen,.SocketFlags.None;将接收到的信息填充到缓冲区 if(bufLen==0) continue; 图a国☑I home back first prev next last 10
home back first prev next last 10 客户端登录-7 • ReceiveWithServer()-1 private int ReceiveWithServer() { bool keepalive = true; string serverresponse = ""; //定义登录请求字符串 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用于接收服务器返回的信息 while (keepalive) { Byte[] buffer = new Byte[1024]; //定义缓冲区 int bufLen = sc.Available; //从网络接收的、可供读取的数据的字节数。 sc.Receive(buffer, 0, bufLen, SocketFlags.None); //将接收到的信息填充到缓冲区 if (bufLen == 0) continue;