辜渝傧

13037102709

027-87870986

教学实训

您当前的位置:首页 > 教学资源 > 实训方案 >

C#应用实训|任务2 客户端功能实现

发布者:唯众    布时间:2020-12-21 13:46:39    点击量:

任务描述

        进入系统后要求输入用户名及密码,用户名为“admin”和密码为“123456”,如果用户名或密码输入错误,则输出错误提示信息并累计错误次数,如果错误次数达到三次,系统提示“用户名或密码输入错误已达三次!系统将自动退出!”,系统自动退出,如果用户名及密码输入正确,则显示“欢迎进入联通手机充值系统”。

知识引入

  1. 建立服务器连接
Socket.Connect( IPEndPoint point)方法:创建与指定服务器IP和端口号的连接。
  1. Socket网络编程客户端编程步骤
(1) 创建用于连接的Socket对象
(2) 用指定的端口号和服务器的ip建立一个EndPoint对象
(3) 用socket对象的Connect()方法向服务器发出连接请求
(4) 如果连接成功,就用socket对象的Send()方法向服务器发送信息
(5) 用socket对象的Receive()方法接受服务器发来的信息
(6) 通信结束关闭socket。
6-3
编写客户端程序,与服务器建立指定端口的连接,与服务器端实现信息的发送的接收。程序主界面如图6-13所示:
图6-13  客户端主界面图
新建windows窗体应用程序,添加控件并设置属性如表6-3所示:
表6-3 控件及属性设置表
控件 属性
Form1 Text 客户端
Form1 Size 600,400
Lable1 Text 服务器端口
TextBox1 Name txtServer
TextBox2 Text 5678
TextBox2 Name txtPort
Button1 Text 连接服务器
Button1 Name btnConnect
TextBox3 Name txtLog
TextBox3 Multiline true
TextBox4 Name txtMsg
TextBox4 Multiline true
Button2 Text 发送
Button2 Name btnSend
 
编写窗口事件代码如下:
  Socket socketSend;
       private void btnConnect_Click(object sender, EventArgs e)
        {
            try
            {
              socketSend = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
                IPAddress ip = IPAddress.Parse(txtServer.Text);
                IPEndPoint point = new IPEndPoint(ip, Convert.ToInt32(txtPort.Text));
                //获得要连接的远程服务器应用程序的IP地址和端口号
                socketSend.Connect(point);
                 ShowMsg(socketSend.RemoteEndPoint+"--- "+"连接成功!:"+GetCurrentTime());
                Thread th = new Thread(Recive);
                th.IsBackground = true;
                th.Start();
            }
            catch (Exception)
            {
                ShowMsg("远程服务器为打开或网络未连接!");
                ShowMsg("连接失败!");
            }
        }
        void  Recive()
        {
            try
            {
                while (true)
                {
                    byte[] buffer = new byte[1024 * 1024 * 2];
                    //实际接收到的有效字符串
                    int r = socketSend.Receive(buffer);
                    string str = Encoding.UTF8.GetString(buffer, 0, r);
                    if (r == 0)
                    {
                        break;
                    }
ShowMsg(socketSend.RemoteEndPoint + "--- \r\n" + str+":"+GetCurrentTime());
                }
            }
            catch (Exception)
            {
MessageBox.Show("连接失败!");
            }
        }
        void ShowMsg(string str)
        {
            txtLog.AppendText(str+"\r\n");
        }
        private void btnSend_Click(object sender, EventArgs e)
        {
            try
            {
                string str = txtMsg.Text.Trim();
                byte[] buffer = System.Text.Encoding.UTF8.GetBytes(str);
                socketSend.Send(buffer);
            }
            catch (Exception)
            {
                ShowMsg("远程服务器为打开或网络未连接!");
                ShowMsg("发送失败!");
            }         
        }
        private void SocketUser_Load(object sender, EventArgs e)
        {
            Control.CheckForIllegalCrossThreadCalls = false;
        }
  // 获取当前系统时间的方法       
        static DateTime GetCurrentTime()
        {
            DateTime currentTime = new DateTime();
            currentTime = DateTime.Now;
            return currentTime;
        }
提示:本例可与【6-2】服务器端代码结合使用完成与服务器端数据通信。

任务实现

新建windows窗体应用程序,主界面如图程序主界面如图6-14所示:
图6-14  ATM监控客户端主界面图
添加控件并设置属性如表6-4所示:
表6-4 控件及属性设置表
控件 属性
Form1 Text ATM监控客户端
Form1 Size 500,480
Lable1 BackColor Silver
Lable1 Name lblStatus
Button1 Text 报警
Button1 Name btnCall
Button2 Text 销警
Button2 Name btnEsc
TextBox1 Name txtMsg
TextBox1 Multiline true
TextBox1 Size 450,340
 
编写窗口事件代码如下:
public Form1()
        {
            InitializeComponent();
            Control.CheckForIllegalCrossThreadCalls = false;
        }
        Socket socketSend=null;
        string  serverIp="192.168.8.10";
        int port=9110;
        private void Form1_Load(object sender, EventArgs e)
        {
        try
            {
                //创建一个负责通讯的socket
                socketSend = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
                IPAddress ip = IPAddress.Parse(serverIp);
                IPEndPoint point = new IPEndPoint(ip, port);
                socketSend.Connect(point);
                msgAppend( "服务器连接成功!---" + GetCurrentTime());
                lblConn.Text = "服务器监控中";
                Thread th = new Thread(Recive);
                th.IsBackground = true;
                th.Start();
            }
            catch (Exception)
            {
                msgAppend("远程服务器未打开或网络未连接!---" + GetCurrentTime());
                
            }
        }
        void  Recive()
        {
            try
            {
                while (true)
                {
                    byte[] buffer = new byte[1024 * 1024 * 2];
                    int r = socketSend.Receive(buffer);
                    string str = Encoding.UTF8.GetString(buffer, 0, r);
                    if (r == 0)
                    {
                        break;
                    }
                    else if(str.Substring(0,1).Equals("B"))
                    {
                        msgAppend("出警中...---" + GetCurrentTime());
                        lblStatus.BackColor = Color.Blue;
                    }
                    else if (str.Substring(0, 1).Equals("C"))
                    {
                        msgAppend("已撤销警告...---" + GetCurrentTime());
                        lblStatus.BackColor = Color.Silver;
                        btnEsc.Enabled = false;
                    }
                     }
            }
            catch (Exception)
            {
            }
        }
        void msgAppend(string  msg)
        {
            txtMsg.AppendText(msg + "\r\n");
        }
        private void btnCall_Click(object sender, EventArgs e)
        {
            try
            {
                string str = "A1";
                byte[] buffer = System.Text.Encoding.UTF8.GetBytes(str);
                socketSend.Send(buffer);
                lblStatus.BackColor = Color.Red;
                btnEsc.Enabled = true;
                msgAppend("已报警...---" + GetCurrentTime());
            }
            catch (Exception)
            {
         msgAppend("远程服务器未打开或网络未连接!---" + GetCurrentTime());
            }       
        }
        // 获取当前系统时间       
        static DateTime GetCurrentTime()
        {
            DateTime currentTime = new DateTime();
            currentTime = DateTime.Now;
            return currentTime;
        }
        private void btnEsc_Click(object sender, EventArgs e)
        {
            try
            {
                string str = "C1";
                byte[] buffer = System.Text.Encoding.UTF8.GetBytes(str);
                socketSend.Send(buffer);
                msgAppend("请求撤销警告...---" + GetCurrentTime());
            }
            catch (Exception)
            {
               msgAppend("远程服务器未打开或网络未连接!---" + GetCurrentTime());
            }      
        }
提示:本代码为“步行街”客户端代码,如果要安装“胜利街”或“考棚街”客户端代码需要把“报警”发送信息由“A1”改为“A2”、“A3”,把“销警”发送信息改为“C2”、“C3”;因为客户端默认启动后自动连接服务器,如果服务器IP地址和监控端口号不为“192.168.8.10”和“9110”,需要在代码中修改对应IP地址和端口号值。

任务小结

  1. 客户端要通过IP和端口主动创建与服务端的连接。
  2. 对可能出现的异常要进行异常处理。
  3. 服务器与客户端可能是一对一,也可能是一对多的关系。


上一篇:C#应用实训|任务1 服务器端功能实现

下一篇:C#应用实训|项目六 知识拓展