心跳包 WPF Unity 数据库搭建

1.心跳包如何发送:

主要是客户机发送给服务器,服务器接收到后,再回复。

//之前做的项目,WPF与U3D进行通信,WPF端是处于监听端,而U3D属于客户端,不断的发心跳包给WPF

//WPF端代码如下:

//嵌入U3D窗口
void initU3D()
{
//将Exehost 控件添加到 Winformhost控件中
if (UserData.enableEmbU3d)
{
ExeHost exehost = new ExeHost();

//formview.formHost.Child = exehost;
formHost.Child = exehost;
exehost.Hold(Window_Main.mainu3dpath);
}
netparser = new Parser(this);
U3DMgr.SetCallBack(netparser);
}
Parser netparser;
ProgressBar progressbar;
public class Parser : u3dconnect.IParser
{

Page_MakeUp_Main page;
public Parser(Page_MakeUp_Main page)
{
this.page = page;
}

public void OnHttpReq(string req, out u3dconnect.returninfo returndata)
{
throw new NotImplementedException();
}

public void OnUdpRecv(MyJson.JsonNode_Object json)
{

page.onRecvUdp(json);
}
}
bool bU3dInited = false;
bool bLoadScene = false;
bool m_isPicShow = false;

public void onRecvUdp(MyJson.JsonNode_Object json)//接收到unity发来的消息之后,再发命令过去
{

if (json["module"].AsString() == "makeup")//是我要的模块
{

//waitwindow.uiupdate();

//System.Diagnostics.Debug.WriteLine("window_wait: Hide ");
waitwindow.Hide();//切换场景成功,隐藏等待界面
if (bU3dInited == false || json["cmd"].AsString() == "init")
{
bU3dInited = true;
MyJson.JsonNode_Object loadlayout = new MyJson.JsonNode_Object();//load房型
if (UserData.Data["scenetype"].AsInt() == (int)SceneType.scene)
{
//这里已经切好场景了
loadlayout.SetDictValue("module", "makeup");
loadlayout.SetDictValue("cmd", "config_layout");
loadlayout.SetDictValue("userName", UserData.Data.asDict()["userName"].AsString());
loadlayout.SetDictValue("token", UserData.Data.asDict()["token"].AsString());
//loadlayout.SetDictValue("defaultlayer", UserData.Data["defaultlayer"].ToString());
//还要再次出传过去一个字段,表示是创建一个装修还是打开一个已经存在的装修
loadlayout.SetDictValue("editmode", UserData.Data["EditMode"].ToString());

U3DMgr.UdpSend(loadlayout.ToString());
}
else
{
//载入房体
loadlayout.SetDictValue("module", "makeup");
loadlayout.SetDictValue("cmd", "load_layout");//这个也要改,不同的层,发不同的层的名字过去,初始化,发的是第一层
loadlayout.SetDictValue("indexfile", UserData.Data["houseLayoutIndex"]);//进到这里,自然就获取到了这个index
loadlayout.SetDictValue("userName", UserData.Data.asDict()["userName"].AsString());
loadlayout.SetDictValue("token", UserData.Data.asDict()["token"].AsString());
loadlayout.SetDictValue("defaultlayer", UserData.Data["defaultlayer"].ToString());
//还要再次出传过去一个字段,表示是创建一个装修还是打开一个已经存在的装修
loadlayout.SetDictValue("editmode", UserData.Data["EditMode"].ToString());

U3DMgr.UdpSend(loadlayout.ToString());
}

string indexfile = UserData.Data["makeupIndexFile"].ToString();//这个是判断点击的是
if (indexfile != "" && indexfile != "-1")
{
//再次置为空

MyJson.JsonNode_Object load = new MyJson.JsonNode_Object();//load装修
loadlayout.SetDictValue("module", "makeup");
loadlayout.SetDictValue("cmd", "load");
loadlayout.SetDictValue("indexfile", UserData.Data["makeupIndexFile"]);
loadlayout.SetDictValue("userName", UserData.Data.asDict()["userName"].AsString());
loadlayout.SetDictValue("token", UserData.Data.asDict()["token"].AsString());
U3DMgr.UdpSend(loadlayout.ToString());
//看看有没有可载入的装修
}

}
if (json["cmd"].AsString() == "updateindexfile")
{
UserData.Data["makeupIndexFile"] = new MyJson.JsonNode_ValueString(json["indexfile"].AsString());//这个是存的装修的index文件
UserData.Data["makeupPicIndexFile"] = new MyJson.JsonNode_ValueString(json["picIndex"].AsString());//这个是存的装修的picIndex
UserData.Data["isfix"] = new MyJson.JsonNode_ValueNumber(json["isFixed"].AsInt());//这个是存的装修的picIndex
if (needtosave)
{
onNeedSave();
needtosave = false;
}
}

if (json["cmd"].AsString() == "resetindex")
{

if (progressbar != null)
{
progressbar.Visibility = System.Windows.Visibility.Hidden;
progressbar = null;
}
//initLayout(ItemContainer);//重新刷新数据

listpanel.ListBox_Furniture_List.SelectedIndex = -1;

if (windowstate == WindowState.panellist)
{
listpanel.Visibility = System.Windows.Visibility.Visible;
}
if (windowstate == WindowState.panelinfo)
{
panelInfo.Visibility = System.Windows.Visibility.Visible;
}
//Grid_MakeUp.Visibility = System.Windows.Visibility.Visible;
if (houselayoutTemp != null)
{
houselayoutTemp.Image_Download.Visibility = System.Windows.Visibility.Hidden;
houselayoutTemp = null;
}
}

if (json["cmd"].AsString() == "price")//这个用在,获取到装修价格后,在本地显示
{

if (progressbar != null)
{
progressbar.Visibility = System.Windows.Visibility.Hidden;
progressbar = null;
}
//initLayout(ItemContainer);//重新刷新数据

if (windowstate == WindowState.panellist)
{
listpanel.Visibility = System.Windows.Visibility.Visible;
}
if (windowstate == WindowState.panelinfo)
{
panelInfo.Visibility = System.Windows.Visibility.Visible;
}
UserControlMakeUpMenuSecond.Label_AllPrice.Content = json["makeup_price"].ToString();
listpanel.ListBox_Furniture_List.SelectedIndex = -1;

if (houselayoutTemp != null)
{
houselayoutTemp.Image_Download.Visibility = System.Windows.Visibility.Hidden;
houselayoutTemp = null;
}

}
if (json["cmd"].AsString() == "requestprice")//这个用在像u3d端请求装修价格
{
MyJson.JsonNode_Object news = new MyJson.JsonNode_Object();
news.SetDictValue("module", "makeup");
news.SetDictValue("cmd", "getprice");
U3DMgr.UdpSend(news.ToString());
}
if (json["cmd"].AsString() == "progressbar")//进度条增加
{
if (progressbar == null)
return;

if (windowstate == WindowState.panellist)
{
if (listpanel.Visibility == System.Windows.Visibility.Visible)
{
if (progressbar.Value >= 95)
{
progressbar.Value = 95;

if (progressbar != null)
{
progressbar.Visibility = System.Windows.Visibility.Hidden;
//progressbar = null;
}
}
else
{
progressbar.Value += 5;

}
}
}
if (windowstate == WindowState.panelinfo)
{
if (panelInfo.Visibility == System.Windows.Visibility.Visible)
{
if (progressbar.Value >= 95)
{
progressbar.Value = 95;

if (progressbar != null)
{
progressbar.Visibility = System.Windows.Visibility.Hidden;
//progressbar = null;
}

}
else
{
progressbar.Value += 5;
}
}
}

}
if (json["cmd"].AsString() == "progressbarfull")//进度条变满
{
if (progressbar != null)
{
progressbar.Visibility = System.Windows.Visibility.Hidden;
//progressbar = null;
}

if (windowstate == WindowState.panellist)
{
if (listpanel.Visibility == System.Windows.Visibility.Visible)
{
listpanel.Visibility = System.Windows.Visibility.Hidden;

//progressbar.Value = 0;
}

}
if (windowstate == WindowState.panelinfo)
{
if (panelInfo.Visibility == System.Windows.Visibility.Visible)
{

panelInfo.Visibility = System.Windows.Visibility.Hidden;

}
}

}
if (json["cmd"].AsString() == "notneedsave")
{
Uri name1 = new Uri("ui/Page_Main_MakeUp2.xaml", UriKind.Relative);
NavigationService.Navigate(name1);
}
if (json["cmd"].AsString() == "needsave")
{
//弹出对话框
Save_Layout save_makeup = new Save_Layout();
save_makeup.ShowDialog();
if (save_makeup.state == Save_Layout.State.yes)
{
//保存
//这里保存分为两种,一种是需要填名字的,另一种是不需要填名字的
SaveMakeUpQuit();
}
else if (save_makeup.state == Save_Layout.State.no)
{
//不保存
Uri name1 = new Uri("ui/Page_Main_MakeUp2.xaml", UriKind.Relative);
NavigationService.Navigate(name1);
}
}
if (json["cmd"].AsString() == "savequit")
{
UserData.Data["makeupIndexFile"] = new MyJson.JsonNode_ValueString(json["indexfile"].AsString());//这个是存的装修的index文件
UserData.Data["makeupPicIndexFile"] = new MyJson.JsonNode_ValueString(json["picIndex"].AsString());//这个是存的装修的picIndex
UserData.Data["isfix"] = new MyJson.JsonNode_ValueNumber(json["isFixed"].AsInt());//这个是存的装修的picIndex
Console.WriteLine(UserData.Data["isfix"]);
if (needtosave)
{
onNeedSave();
needtosave = false;
}

Uri name1 = new Uri("ui/Page_Main_MakeUp2.xaml", UriKind.Relative);
NavigationService.Navigate(name1);
}

if (json["cmd"].AsString() == "getpanoramadone")
{
UserData.picHash = json["pic"].AsString();//全景图的hash 作为缩略图索引
UserData.picIndex = json["index"].AsInt();//全景图的key
System.Diagnostics.Debug.WriteLine("all pic UserData.picHash : " + UserData.picHash);
if (!m_isPicShow)
{
if (winAnimation != null && winAnimation.IsEnd)
{
this.UpdateAllPicList();
}
}

}
if (json["cmd"].AsString() == "getpanoramatip")
{
PopSure popsure = new PopSure();
popsure.Label_Tip.Content = "此位置已经拍摄过照片,请换个位置再拍。";
popsure.Label_Tip.FontSize = 12;
popsure.ShowDialog();
//MessageBox.Show("此位置已经拍摄过照片,请换个位置再拍。");
}
if (json["cmd"].AsString() == "pricesheet")
{
//MessageBox.Show(json["info"].ToString());
MyJson.JsonNode_Array obj = (MyJson.Parse(json["info"].ToString()) as MyJson.JsonNode_Object)["MakeUpPrice"] as MyJson.JsonNode_Array;
rf.SetGrid(obj);
//rf = new ReportForm(json["info"] as MyJson.JsonNode_Array);
}

if (json["cmd"].AsString() == "getcapturecameradone")
{
UserData.picHash = json["pic"].AsString();
UserData.picIndex = json["index"].AsInt();
System.Diagnostics.Debug.WriteLine("one pic UserData.picHash : " + UserData.picHash);
if (!m_isPicShow)
{
if (winAnimation != null && winAnimation.IsEnd)
{
this.UpdateSinglePicList();

}
}
}
//在这里加个消息事件,那边只要有mousebuttondown过来,就把弹出的框close掉
if (json["cmd"].AsString() == "closeMorePopUp")
{
if (_screenListStore != null)
{
_screenListStore.Close();
}
//MessageBox.Show("关闭");
}
//if (json.ContainsKey("classindex") == false) return; //没有分类号,return
//Console.WriteLine("editmodel udp recv:" + json.ToString());
}
else//不是编辑模块,就改变场景
{
if (bLoadScene) return;//不允许多次发送切换场景命令
MyJson.JsonNode_Object changeto = new MyJson.JsonNode_Object();
if (UserData.Data["scenetype"].AsInt() == (int)SceneType.scene)
{
changeto.SetDictValue("module", "null");
changeto.SetDictValue("cmd", "changescenefix");
changeto.SetDictValue("sceneindex", UserData.Data["houseLayoutIndex"]);
changeto.SetDictValue("scene", "makeup");
}
else
{
changeto.SetDictValue("module", "null");
changeto.SetDictValue("cmd", "changescene");
changeto.SetDictValue("scene", "makeup");
}
bLoadScene = true;
U3DMgr.UdpSend(changeto.ToString());
//Console.WriteLine("editmodel udp recv:" + json.ToString());
}
}

//U3D的代码如下:

//在U3D的入口代码中,Update函数,每三秒钟像WPF发送一次消息

void Update()
{
if(bSleep)
{
System.Threading.Thread.Sleep(100);
}
if (nettools != null)
{
nettools.Update();//检测下载
}
Connect.Instance.checkCallback();//这里需要检查回调 实时更新的检查回调
fcount++;
//定时发送心跳包
timer += Time.deltaTime;
if (timer > 3.0f)
{
timer = 0;
fcount = 0;
MyJson.JsonNode_Object beatheart = new MyJson.JsonNode_Object();
beatheart.SetDictValue("module", modulename);
beatheart.SetDictValue("cmd", "beatheart");
Connect.Instance.udpSend(beatheart);
}
if (curState != null)
{
curState.OnUpdate(Time.deltaTime);
}
}

时间: 2024-10-20 11:22:15

心跳包 WPF Unity 数据库搭建的相关文章

项目管理,REID,矩阵,终端,镜像,Voip,AVB,串口,串口服务器,数据库,数据仓库,码流,心跳包,名词解释

项目管理: 项目管理是管理学的一个分支学科 ,对项目管理的定义是:指在项目活动中运用专门的知识.技能.工具和方法,使项目能够在有限资源限定条件下,实现或超过设定的需求和期望的过程.项目管理是对一些成功地达成一系列目标相关的活动(譬如任务)的整体监测和管控.这包括策划.进度计划和维护组成项目的活动的进展. "项目是在限定的资源及限定的时间内需完成的一次性任务.具体可以是一项工程.服务.研究课题及活动等." "项目管理是运用管理的知识.工具和技术于项目活动上,来达成解决项目的问题

delphi datasnap 心跳包

为了能让我们的服务程序更加稳定,有些细节问题必须解决.就如上一讲中提到的客户端拔掉网线,造成服务器上TCP变成死连接,如果死连接数量过多,对服务器能长期稳定运行是一个巨大的威胁.另外,经过测试,如果服务器上有TCP死连接,那么服务程序连接数据库,也会产生那个一个死连接.这样的话,给数据库服务器也造成威胁.所以,服务器程序编写的好坏,直接影响系统的稳定性!如何解决TCP死连接的问题,有多种方法,其中最有效的就是心跳包技术.我们在DSServer的OnConnect事件中加入心跳包代码 uses I

服务器数据库搭建流程(centOs+mysql)

前言: 服务器上数据库搭建需要知道Linux系统的版本,以前的Ubuntu14.04直接在终端下输入apt-get install (package)便可方便的下载并安装mysql,但是在centOs上就是行不通的,需要复杂的配置,不过在centOs里可以使用yum install mysql-server mysql-client的命令可以快速安装,不过这是mysql的5.1版本,不支持5.5以上丰富的功能.而且在项目开发中,项目组的生产环境和测试环境对版本控制有着严格的要求,如果不一致非常容

Java 之 MYSQL 数据库搭建

1.首先要去加载java的mysql驱动,将下载的mysql-connect-bin-java.jar包添加到该项目下2.然后通过 Class.forName("com.mysql.jdbc.Driver"); 加载Mysql数据驱动 3. 通过getConnection的URL模式去连接注意,有时候如果报 连接池连接数据库报Communications link failure 错误,将你的localhost换成127.0.0.1试试 1 package chp07; 2 impor

二进制包安装MySQL数据库

1.1二进制包安装MySQL数据库 1.1.1 安装前准备(规范) [[email protected]_server ~]# mkdir -p /home/shangbao_zhangdc/tools  ##创建指定工具包存放路径[[email protected]_server ~]# wget http://ftp.ntu.edu.tw/pub/MySQL/Downloads/MySQL-5.5/mysql-5.5.32-linux2.6-x86_64.tar.gz  ##下二进制包,这个

TCP连接探测中的Keepalive 和心跳包

采用TCP连接的C/S模式软件,连接的双方在连接空闲状态时,如果任意一方意外崩溃.当机.网线断开或路由器故障,另一方无法得知TCP连接已经失效,除非继续在此连接上发送数据导致错误返回.很多时候,这不是我们需要的.我们希望服务器端和客户端都能及时有效地检测到连接失效,然后优雅地完成一些清理工作并把错误报告给用户. 如何及时有效地检测到一方的非正常断开,一直有两种技术可以运用.一种是由TCP协议层实现的Keepalive,另一种是由应用层自己实现的心跳包. TCP默认并不开启Keepalive功能,

Signalr 实现心跳包

项目分析: 一个实时的IM坐席系统,客户端和坐席使用IM通信,客户端使用android和ios的app,坐席使用web. web端可以保留自己的登录状态,但为防止意外情况的发生(如浏览器异常关闭,断网,断电),对坐席的实时在线状态造成影响,我们在后台跑一个服务,实时向每个坐席发送一个心跳包,当坐席的状态是在线,但是又不能接收到服务端的心跳包的时候,认为该坐席已经被异常下线. 实时通信Signalr 使用中发现signalr的服务端必须需要 .net frameword4.5及以上版本,对sign

[转] Socket心跳包异常检测的C语言实现,服务器与客户端代码案例

转载自:zxh2075的专栏 在Socket心跳机制中,心跳包可以由服务器发送给客户端,也可以由客户端发送给服务器,不过比较起来,前者开销可能较大.本文实现的是由客户端给服务器发送心跳包,服务器不必返回应答包,而是通过判断客户在线会话记录中的计数标志值来实现心跳异常的检测,以此决定客户端是否已经断开连接以及删除其在线会话记录. 基本思路: ①客户端定时给服务器发送心跳包(案例中定时时间为3秒): ②服务器创建一个心跳检测的线程,线程中每隔3秒对用户在线会话记录中的计数器进行加1操作(初始值为0)

Netty5.0 实现心跳包

这是一个netty自带的echo案例,添加了心跳包的设置而已,关键代码如下: /* * Copyright 2012 The Netty Project * * The Netty Project licenses this file to you under the Apache License, * version 2.0 (the "License"); you may not use this file except in compliance * with the Licen