C#应用实训|任务2 客户端功能实现
发布者:唯众
布时间:2020-12-21 13:46:39
点击量:
任务描述
进入系统后要求输入用户名及密码,用户名为“admin”和密码为“123456”,如果用户名或密码输入错误,则输出错误提示信息并累计错误次数,如果错误次数达到三次,系统提示“用户名或密码输入错误已达三次!系统将自动退出!”,系统自动退出,如果用户名及密码输入正确,则显示“欢迎进入联通手机充值系统”。
知识引入
- 建立服务器连接
Socket.Connect( IPEndPoint point)方法:创建与指定服务器IP和端口号的连接。
- 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地址和端口号值。
任务小结
- 客户端要通过IP和端口主动创建与服务端的连接。
- 对可能出现的异常要进行异常处理。
- 服务器与客户端可能是一对一,也可能是一对多的关系。
上一篇:C#应用实训|任务1 服务器端功能实现
下一篇:C#应用实训|项目六 知识拓展