socket接受数据并实时绘图
需要的功能:将客户端接受的数据实时送入chart控件显示动态波形
遇到的问题:
cahrt控件实时显示用的是timer_tick事件,由于是form的计时器是单线程的,只要开启了timer_tick,socket就自动断开连接
,没法实时传数据了。
我的大致思路:
1 开启socket,客户端每隔一秒会接收到一个数据,把它加入到点的list
2 Timer_tick读到上述list实时显示
大致代码如下:
客户端接收数据部分代码:
public void socketConnetion()
{
string stringData = "";
Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
try
{
byte[] byteMessage;
if (!socket.Connected)
{
string ipAndPort = "192.168.1.129:8080";
IPAddress serverIp = IPAddress.Parse(ipAndPort.Split(':')[0]);
int serverPort = Convert.ToInt32(ipAndPort.Split(':')[1]);
IPEndPoint iep = new IPEndPoint(serverIp, serverPort);
socket.Connect(iep);
}
//string clo = textBox3.Text;
for (int i = 0; i <= 40; i++)//总共接受40个数据,每秒接受一个
{
List<byte> byteSource = new List<byte>();
double kk1 = 200;
double kk2 = 60;
byte[] by1 = BitConverter.GetBytes(kk1);
byteSource.AddRange(by1);
byte[] inputData = byteSource.ToArray();
socket.Send(inputData);
byteMessage = new byte[16];
int resv = socket.Receive(byteMessage);
//接受到的数据
double outputdata1 = BitConverter.ToDouble(splite1, 0);
//实时更新点的LIst
common.Var1 = outputdata1.ToString();
var argument = DateTime.Now;
SeriesPoint pp = new SeriesPoint(argument.ToString(), outputdata1.ToString());
common.Oo.Add(pp);
}
}
catch
{
}
finally
{
socket.Shutdown(SocketShutdown.Both);
socket.Close();
}
Timer事件:
private void timer1_Tick(object sender, EventArgs e)
{
//将实时更新的list数组动态显示
var argument = DateTime.Now;
chartControl1.Series[0].Points.AddRange(new SeriesPoint(argument.ToString(), common.Oo.Array));
}
全局变量:
public static class common
{
private static List<SeriesPoint> oo;
public static List<SeriesPoint> Oo
{
get { return oo; }
set { oo = value; }
}
}