http://www.cnblogs.com/yangfengwu/p/8780182.html
自己都是现做现写,如果想知道最终实现的功能,请看最后
先把源码和资料链接放到这里
链接:https://pan.baidu.com/s/10MxI8-Q33-M_R2WEHqEi1A密码:j1sz
先说一下哈,不要嫌界面不好看,自己是为了程序尽量的简单,可以通过调整颜色或者通过重绘来使使界面好看,,,,,,,,咱先学会走.....
因为咱们会用到图片所以先把图片资源加载上来,为了
调整的好看一点
现在设置,切换图片
其实呢导入图片应该先建一个资源文件更合理,后期再说
现在是让按钮状态改变了
也修改一下灯的
privatevoidpictureBox2_Click(object sender, EventArgs e)
{
if(LedFlage ==false)
{
LedFlage =true;
pictureBox2.BackgroundImage = Properties.Resources.switchon;
pictureBox3.BackgroundImage = Properties.Resources.ledon;
}
else {
LedFlage =false;
pictureBox2.BackgroundImage = Properties.Resources.switchoff;
pictureBox3.BackgroundImage = Properties.Resources.ledoff;
}
}
现在做连接服务器
先说一下很多初学者会遇到的问题
这种情况是你添加了控件的事件函数,然后你又删除了,,,因为我也是经常删.................
我刚才在考虑要不要用委托和回调.....后来想了想这篇就不用了,
大家记得自己试一下这个(反正给大家说了,下次自己肯定用委托和回调写,记住不要偷懒,如果你偷懒了,后期的文章你就会无从下手,因为你连基础的都不知道)
http://www.cnblogs.com/yangfengwu/p/5761841.html
因为和android 一样只有主线程才允许操作控件,咱们就
现在做连接服务器和断开连接
先在电脑上测试
先给现在的程序
using System;using System.Collections.Generic;using System.ComponentModel;using System.Data;using System.Drawing;using System.Linq;using System.Net;using System.Net.Sockets;using System.Text;using System.Threading;using System.Threading.Tasks;using System.Windows.Forms;namespace TCPClient
{
publicpartialclass Form1 : Form
{
boolLedFlage =false;
boolConncetFlage =false;
privateThread ThreadConnectService;//连接服务器线程privateIPAddress ipAddress;//ip地址intPort =0;//端口号privateTcpClient myTcpClient =null;// TcpClientprivateNetworkStream networkstrem =null;//网络数据流public Form1()
{
InitializeComponent();
}
privatevoidForm1_Load(object sender, EventArgs e)
{
System.Windows.Forms.Control.CheckForIllegalCrossThreadCalls =false;//加了这一句
}
/*连接按钮点击事件*/privatevoidbutton1_Click(object sender, EventArgs e)
{
if(ConncetFlage ==false)
{
try{ThreadConnectService.Abort();}//先清除一下以前的catch (Exception){}
ThreadConnectService =newThread(ConncetService);//把连接服务器的函数加入任务ThreadConnectService.Start();//启动任务 }
else {
ConncetFlage =false;
button1.Text ="连接";
pictureBox1.BackgroundImage = Properties.Resources.lightoff;
try{ myTcpClient.Close(); }catch(Exception){}//关闭通道 }
}
/*LED灯控制按钮(图片)*/privatevoidpictureBox2_Click(object sender, EventArgs e)
{
if(LedFlage ==false)
{
LedFlage =true;
pictureBox2.BackgroundImage = Properties.Resources.switchon;
pictureBox3.BackgroundImage = Properties.Resources.ledon;
}
else {
LedFlage =false;
pictureBox2.BackgroundImage = Properties.Resources.switchoff;
pictureBox3.BackgroundImage = Properties.Resources.ledoff;
}
}
/*连接服务器函数*/privatevoid ConncetService()
{
ipAddress = IPAddress.Parse(textBox1.Text);//获取IP地址Port = Convert.ToInt32(textBox2.Text);//获取端口号try {
myTcpClient =newTcpClient();//实例化myTcpClientmyTcpClient.Connect(ipAddress, Port);//连接服务器ConncetFlage =true;
button1.Text ="断开";
pictureBox1.BackgroundImage = Properties.Resources.lighton;
}
catch (Exception)
{
ConncetFlage =false;
button1.Text ="连接";
pictureBox1.BackgroundImage = Properties.Resources.lightoff;
try { myTcpClient.Close(); }
catch (Exception) { }
}
}
}
}
断开
忘了加一个功能,,,判断服务器是不是断开了
using System;using System.Collections.Generic;using System.ComponentModel;using System.Data;using System.Drawing;using System.Linq;using System.Net;using System.Net.Sockets;using System.Text;using System.Threading;using System.Threading.Tasks;using System.Windows.Forms;namespace TCPClient
{
publicpartialclass Form1 : Form
{
boolLedFlage =false;
boolConncetFlage =false;
privateThread ThreadConnectService;//连接服务器线程privateIPAddress ipAddress;//ip地址intPort =0;//端口号privateTcpClient myTcpClient =null;// TcpClientprivateNetworkStream networkstrem =null;//网络数据流privateThread ThreadReadData;//接收消息线程privateboolThreadReadDataFlage =false;//接收数据任务循环用byte[] ReadBuffer =newbyte[1024];//设置缓冲区1024个字节intReadCnt =0;//获取接收到了几个字节public Form1()
{
InitializeComponent();
}
privatevoidForm1_Load(object sender, EventArgs e)
{
System.Windows.Forms.Control.CheckForIllegalCrossThreadCalls =false;//加了这一句
}
/*连接按钮点击事件*/privatevoidbutton1_Click(object sender, EventArgs e)
{
if(ConncetFlage ==false)
{
try{ThreadConnectService.Abort();}//先清除一下以前的catch (Exception){}
ThreadConnectService =newThread(ConncetService);//把连接服务器的函数加入任务ThreadConnectService.Start();//启动任务 }
else {
ConncetFlage =false;
ThreadReadDataFlage =false;
button1.Text ="连接";
pictureBox1.BackgroundImage = Properties.Resources.lightoff;
try{ myTcpClient.Close(); }catch(Exception){}//关闭通道 }
}
/*LED灯控制按钮(图片)*/privatevoidpictureBox2_Click(object sender, EventArgs e)
{
if(LedFlage ==false)
{
LedFlage =true;
pictureBox2.BackgroundImage = Properties.Resources.switchon;
pictureBox3.BackgroundImage = Properties.Resources.ledon;
}
else {
LedFlage =false;
pictureBox2.BackgroundImage = Properties.Resources.switchoff;
pictureBox3.BackgroundImage = Properties.Resources.ledoff;
}
}
/*连接服务器函数*/privatevoid ConncetService()
{
ipAddress = IPAddress.Parse(textBox1.Text);//获取IP地址Port = Convert.ToInt32(textBox2.Text);//获取端口号try {
myTcpClient =newTcpClient();//实例化myTcpClientmyTcpClient.Connect(ipAddress, Port);//连接服务器ConncetFlage =true;
button1.Text ="断开";
pictureBox1.BackgroundImage = Properties.Resources.lighton;
networkstrem = myTcpClient.GetStream();//获取数据流 ThreadReadDataFlage =true;
try{ ThreadReadData.Abort(); }//先清除一下以前的catch (Exception) { }
ThreadReadData =newThread(ReadData);//把接收数据的函数加入任务 ThreadReadData.Start();
}
catch (Exception)
{
ConncetFlage =false;
ThreadReadDataFlage =false;
button1.Text ="连接";
pictureBox1.BackgroundImage = Properties.Resources.lightoff;
try { myTcpClient.Close(); }
catch (Exception) { }
}
}
/*接收消息函数*/privatevoid ReadData()
{
while (ThreadReadDataFlage)
{
try {
ReadCnt = networkstrem.Read(ReadBuffer,0, ReadBuffer.Length);//读取数据if(ReadCnt !=0)//有数据 {
}
else//异常断开 {
ConncetFlage =false;
ThreadReadDataFlage =false;
button1.Text ="连接";
pictureBox1.BackgroundImage = Properties.Resources.lightoff;
try { myTcpClient.Close(); }
catch (Exception) { }
}
}
catch (Exception)
{
ThreadReadDataFlage =false;
}
}
}
}
}
现在做数据发送部分,和APP那块几乎是一个模子刻出来的
using System;using System.Collections.Generic;using System.ComponentModel;using System.Data;using System.Drawing;using System.Linq;using System.Net;using System.Net.Sockets;using System.Text;using System.Threading;using System.Threading.Tasks;using System.Windows.Forms;namespace TCPClient
{
publicpartialclass Form1 : Form
{
boolLedFlage =false;
boolConncetFlage =false;
privateThread ThreadConnectService;//连接服务器线程privateIPAddress ipAddress;//ip地址intPort =0;//端口号privateTcpClient myTcpClient =null;// TcpClientprivateNetworkStream networkstrem =null;//网络数据流privateThread ThreadReadData;//接收消息线程privateboolThreadReadDataFlage =false;//接收数据任务循环用privateThread ThreadSendData;//发送消息线程privateboolThreadSendDataFlage =false;//发送数据任务循环用byte[] ReadBuffer =newbyte[1024];//设置缓冲区1024个字节intReadCnt =0;//获取接收到了几个字节byte[] SendBuffer =newbyte[1024];//设置发送缓冲区1024个字节intSendCnt =0;//发送的个数public Form1()
{
InitializeComponent();
}
privatevoidForm1_Load(object sender, EventArgs e)
{
System.Windows.Forms.Control.CheckForIllegalCrossThreadCalls =false;//加了这一句
}
/*连接按钮点击事件*/privatevoidbutton1_Click(object sender, EventArgs e)
{
if(ConncetFlage ==false)
{
try{ThreadConnectService.Abort();}//先清除一下以前的catch (Exception){}
ThreadConnectService =newThread(ConncetService);//把连接服务器的函数加入任务ThreadConnectService.Start();//启动任务 }
else {
ConncetFlage =false;
ThreadReadDataFlage =false;
ThreadSendDataFlage =false;
button1.Text ="连接";
pictureBox1.BackgroundImage = Properties.Resources.lightoff;
try{ myTcpClient.Close(); }catch(Exception){}//关闭通道 }
}
/*LED灯控制按钮(图片)*/privatevoidpictureBox2_Click(object sender, EventArgs e)
{
if(LedFlage ==false)
{
SendBuffer[0] =0xaa;
SendBuffer[1] =0x55;
SendBuffer[2] =0x02;
SendBuffer[3] =0xff;
SendCnt =4;
LedFlage =true;
pictureBox2.BackgroundImage = Properties.Resources.switchon;
pictureBox3.BackgroundImage = Properties.Resources.ledon;
}
else {
SendBuffer[0] =0xaa;
SendBuffer[1] =0x55;
SendBuffer[2] =0x02;
SendBuffer[3] =0x00;
SendCnt =4;
LedFlage =false;
pictureBox2.BackgroundImage = Properties.Resources.switchoff;
pictureBox3.BackgroundImage = Properties.Resources.ledoff;
}
}
/*连接服务器函数*/privatevoid ConncetService()
{
ipAddress = IPAddress.Parse(textBox1.Text);//获取IP地址Port = Convert.ToInt32(textBox2.Text);//获取端口号try {
myTcpClient =newTcpClient();//实例化myTcpClientmyTcpClient.Connect(ipAddress, Port);//连接服务器ConncetFlage =true;
button1.Text ="断开";
pictureBox1.BackgroundImage = Properties.Resources.lighton;
networkstrem = myTcpClient.GetStream();//获取数据流/*接收消息任务*/ ThreadReadDataFlage =true;
try{ ThreadReadData.Abort(); }//先清除一下以前的catch (Exception) { }
ThreadReadData =newThread(ReadData);//把接收数据的函数加入任务 ThreadReadData.Start();
/*发送消息任务*/ ThreadSendDataFlage =true;
try{ ThreadSendData.Abort(); }//先清除一下以前的catch (Exception) { }
ThreadSendData =new Thread(SendData);
ThreadSendData.Start();
}
catch (Exception)
{
ConncetFlage =false;
ThreadReadDataFlage =false;
ThreadSendDataFlage =false;
button1.Text ="连接";
pictureBox1.BackgroundImage = Properties.Resources.lightoff;
try { myTcpClient.Close(); }
catch (Exception) { }
}
}
/*接收消息函数*/privatevoid ReadData()
{
while (ThreadReadDataFlage)
{
try {
ReadCnt = networkstrem.Read(ReadBuffer,0, ReadBuffer.Length);//读取数据if(ReadCnt !=0)//有数据 {
}
else//异常断开 {
ConncetFlage =false;
ThreadReadDataFlage =false;
ThreadSendDataFlage =false;
button1.Text ="连接";
pictureBox1.BackgroundImage = Properties.Resources.lightoff;
try { myTcpClient.Close(); }
catch (Exception) { }
}
}
catch (Exception)
{
ThreadReadDataFlage =false;
}
}
}
/*发送消息函数*/privatevoid SendData()
{
while (ThreadSendDataFlage)
{
try {
if(SendCnt>0)
{
networkstrem.Write(SendBuffer, 0, SendCnt);
SendCnt =0;
}
}
catch (Exception)
{
ConncetFlage =false;
ThreadReadDataFlage =false;
ThreadSendDataFlage =false;
button1.Text ="连接";
pictureBox1.BackgroundImage = Properties.Resources.lightoff;
try { myTcpClient.Close(); }
catch (Exception) { }
}
}
}
}
}
现在用调试助手试一下
好了咱现在用8266试一试
C#的源码
好了.....但是刚才我在软件连接的时候复位了一下芯片发现软件没有检测出来断开..现在如果服务器主动断开
可以检测的到,异常好像不可以,后期再看看....今天太晚了写的匆忙,不知道软件还有没有其它的Bug,慢慢的去发现吧...
突然有想起来单片机程序有个BUG