之前在网上看到的,关于如何在Winform上实时的更新数据,也看了其他的博客,其中提到了利用Timer去实现,还有就是利用Socket去实现。
关于Socket实现实时更新,他给出的理解是:
有一个Socket服务端,只负责接收多个客户端传过来的讯息,根据讯息内容去判断是否广播。这里每一个winform窗体程序就是一个Socket客户端,如果窗体上对数据库做了更新(例如增,删,改)操作就会调用一个方法,该方法主要是向Socket服务端发送一个字符串"1",当Socket服务端接收到了字符串为"1"时,则广播给所有客户端一个字符串"1",而当客户端接收到服务端传过来一个"1"时,则立即执行数据绑定的方法(重新将界面的DataGridVeiw数据绑定)。这样就实现了一有数据改变就实时刷新的效果。
稍作改善
每个人的方法都是适用于自己的,所以我在这个想法下做了修改。
他的思路用图描述是这样的:
我的思路:
他的作用对象是客户端,而我所显示的功能的作用对象是服务器,以下是实现的代码:(之后会加上动图,更易理解)
客户端
public partial class FrmLogin : Form
{
public FrmLogin()
{
InitializeComponent();
}
/// <summary>
/// 客户端的Socket
/// </summary>
Socket clinet;
private void FrmLogin_Load(object sender, EventArgs e)
{
//创建socket
CreateSocket();
}
private void CreateSocket()
{
//创建socket
clinet = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
//连接
//获得ip和端口(读取配置文件)
var app = System.Configuration.ConfigurationManager.AppSettings;
IPEndPoint point = new IPEndPoint(IPAddress.Parse(app["ip"]), Convert.ToInt32(app["port"]));
//连接服务器
try
{
clinet.Connect(point);
}
catch
{
}
注意引用:
服务器
public partial class FrmNetwork : Form
{
public FrmNetwork()
{
InitializeComponent();
}
//创建数据库对象
Data get = new okCooperation.Data();
//已连接上的客户端集合
List<Socket> clinetSockets;
//服务器
Socket socket;
//设置数据缓冲区
private byte[] result = new byte[1024];
private void FrmNetwork_Load(object sender, EventArgs e)
{
//初始化
clinetSockets = new List<Socket>();
//创建socket对象
socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
//获取ip地址和端口
IPAddress ip = IPAddress.Parse(txtIPAddress.Text.Trim());
int port = Convert.ToInt32(txtPort.Text.Trim());
IPEndPoint point = new IPEndPoint(ip, port);
//绑定ip和端口
socket.Bind(point);
//设置最大连接数
socket.Listen(20);
listBox1.Items.Add("服务器已开启,等待客户端连接中.....");
//开启新线程监听
Thread serverThread = new Thread(ListenClientConnect);
serverThread.IsBackground = true;
serverThread.Start(socket);
}
/// <summary>
/// 监听传入
/// </summary>
/// <param name="ar"></param>
private void ListenClientConnect(object ar)
{
//设置标志
bool flag = true;
//获得服务器的Socket
Socket serverSocket = ar as Socket;
//轮询
while (flag)
{
//获得连入的客户端socket
Socket clientSocket = serverSocket.Accept();
//将新加入的客户端加入列表中
clinetSockets.Add(clientSocket);
//向listBox中写入消息
listBox1.Invoke(new Action(() => { listBox1.Items.Add(string.Format("客户端{0}已成功连接到服务器\r\n", clientSocket.RemoteEndPoint)); }));
//开启新的线程,进行监听客户端消息
var mReveiveThread = new Thread(ReceiveClient);
mReveiveThread.IsBackground = true;
mReveiveThread.Start(clientSocket);
}
}
/// <summary>
/// 接收客户端传来的数据
/// </summary>
/// <param name="obj"></param>
private void ReceiveClient(object obj)
{
//获取当前客户端
//因为客户端不止一个,所有需要使用var实例化新对象
var mClientSocket = (Socket)obj;
//循环标志位
bool flag = true;
while (flag)
{
//try
//{
//获取数据长度
int receiveLength = mClientSocket.Receive(result);
//获取客户端消息
string clientMessage = Encoding.UTF8.GetString(result, 0, receiveLength);
if (clientMessage == "1")
{
//自身进行更新
RefTable();
}
//向listbox中写入信息
listBox1.Invoke(new Action(() => { listBox1.Items.Add(string.Format("客户端{0}发来消息{1}", mClientSocket.RemoteEndPoint, clientMessage)); }));
}
}
注意引用: