C#Winform利用Scoket实现实时更新
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了C#Winform利用Scoket实现实时更新,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含3611字,纯文字阅读大概需要6分钟。
内容图文
之前在网上看到的,关于如何在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)); }));
}
}
注意引用:
内容总结
以上是互联网集市为您收集整理的C#Winform利用Scoket实现实时更新全部内容,希望文章能够帮你解决C#Winform利用Scoket实现实时更新所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。