前言
因为自己需要开发一款自己的游戏,因为设计网络方面,所以我找了很多的资料,再加上考虑到Unity游戏客户端直接连接数据库很容易导致数据库泄露,再加上网上很多的服务端都是用控制台做的,所以我就想做个图形化的服务端,数据一目了然,所以决定用MVC做服务端,实现中转处理数据

设计思路
现在需要做的还是服务端的UI设计,所以先写前端的代码,前端的界面是不开放的,专门给服务端的管理员展示可视化的效果

HTML

<header>
<h1>XXXX数据实时监测 1.0</h1>
<h3 class="ServerStatus">服务器状态<span></span></h3>
<h3 class="ServerAddress">服务器地址:<span>@ViewData["ServerAddress"]</span></h3>
<h3 class="OnlineClientNum">在线客户端:<span>0</span></h3>
</header> <div>
<div class="YContral">
<div class="OAO_YC OAO_YC_On"><span></span><p>服务开关</p></div>
<div class="TXT_YC"><span contenteditable="true" property="输入文本"></span><p>输入文本</p></div>
<div class="BTN_YC"><p>发送消息</p></div>
</div>
</div>
<div class="RealTimeNws">
<table>
<thead>
<tr>
<td>日期</td>
<td>状态码</td>
<td>状态信息</td>
<td>数据</td>
</tr>
</thead>
<tbody></tbody>
</table>
</div>
<div class="OnlineClientList">
<table>
<thead>
<tr>
<td>客户端地址</td>
</tr>
</thead>
<tbody></tbody>
</table>
</div>

CSS

@font-face {
font-family: 'poppin';
src: url('../Font/poppin.ttf') format('truetype');
} ::-webkit-scrollbar {
width: 0px;
height: 0px;
background: rgba(0, 0, 0, 0.00)
} ::-webkit-scrollbar-thumb {
width: 0px;
height: 0px;
background: rgba(0, 0, 0, 0.00)
} header h1, header h3 {
display: inline-block;
} header h3 {
float: right;
padding:0px 10px;
} header .ServerStatus span {
width: 18px;
height: 18px;
border-radius: 50px;
background: #ccc;
display: inline-block;
margin-left: 5px;
transform: translateY(2px);
} * {
font-family: 'poppin';
} body {
margin: 0;
padding: 0;
background: #4e5b75;
color: #fff;
}
/*消息表格*/ .RealTimeNws {
width:80%;
float:left;
} .RealTimeNws table {
width: 100%;
border: 1px solid #ccc;
box-sizing: border-box;
text-align: center;
} .RealTimeNws table thead {
font-size: 20px;
border-bottom: 2px solid #ccc;
box-sizing: border-box;
} .RealTimeNws table thead tr {
display: flex;
} .RealTimeNws table thead tr td {
flex: auto;
} .RealTimeNws table thead tr td:nth-child(1) {
width: 10%;
} .RealTimeNws table thead tr td:nth-child(2) {
width: 5%;
} .RealTimeNws table thead tr td:nth-child(3) {
width: 55%;
} .RealTimeNws table thead tr td:nth-child(4) {
width: 30%;
} .RealTimeNws table tbody {
font-size: 16px;
max-height: 300px;
overflow: auto;
} .RealTimeNws table tbody tr {
border-bottom: 1px solid #ccc;
box-sizing: border-box;
display: flex;
} .RealTimeNws table tbody tr td {
padding: 10px 0px;
letter-spacing: 2px;
flex: auto;
} .RealTimeNws table tbody tr td:nth-child(1) {
width: 10%;
} .RealTimeNws table tbody tr td:nth-child(2) {
width: 5%;
} .RealTimeNws table tbody tr td:nth-child(3) {
width: 55%;
} .RealTimeNws table tbody tr td:nth-child(4) {
width: 30%;
} /*在线客户端列表表格*/ .OnlineClientList {
width:20%;
float:left;
} .OnlineClientList table {
width: 100%;
border: 1px solid #ccc;
box-sizing: border-box;
text-align: center;
} .OnlineClientList table thead {
font-size: 20px;
border-bottom: 2px solid #ccc;
box-sizing: border-box;
} .OnlineClientList table thead tr {
display: flex;
} .OnlineClientList table thead tr td {
flex: auto;
} .OnlineClientList table thead tr td:nth-child(1) {
width: 10%;
} .OnlineClientList table thead tr td:nth-child(2) {
width: 5%;
} .OnlineClientList table thead tr td:nth-child(3) {
width: 55%;
} .OnlineClientList table thead tr td:nth-child(4) {
width: 30%;
} .OnlineClientList table tbody {
font-size: 16px;
max-height: 300px;
overflow: auto;
} .OnlineClientList table tbody tr {
border-bottom: 1px solid #ccc;
box-sizing: border-box;
display: flex;
} .OnlineClientList table tbody tr td {
padding: 10px 0px;
letter-spacing: 2px;
flex: auto;
} .OnlineClientList table tbody tr td:nth-child(1) {
width: 10%;
} .OnlineClientList table tbody tr td:nth-child(2) {
width: 5%;
} .OnlineClientList table tbody tr td:nth-child(3) {
width: 55%;
} .OnlineClientList table tbody tr td:nth-child(4) {
width: 30%;
}
/*控件*/
.YContral {
display: flex;
}
/*开关组*/
.OAO_YC {
width: 65px;
height: 25px;
background: #ccc;
border-radius: 50px;
padding: 5px;
transition: all ease 0.5s;
position: relative;
} .OAO_YC p {
position: absolute;
top: 0px;
left: 0px;
margin: 0;
padding: 0;
font-size: 14px;
height: 100%;
width: 75px;
text-align: center;
line-height: 2.7em;
opacity: 0;
transition: all ease 0.5s;
} .OAO_YC:hover p {
opacity: 1;
} .OAO_YC:hover span {
opacity: 0.3;
} .OAO_YC span {
height: 100%;
background: #fff;
border-radius: 50px;
display: block;
width: 36px;
transition: all ease 0.5s;
} .OAO_YC_On {
background: #0094ff;
transition: all ease 0.5s;
} .OAO_YC_On span {
transform: translateX(30px);
} /*文本组*/
.TXT_YC {
width: 150px;
height: 25px;
background: #0094ff;
color:#fff;
border-radius: 50px;
padding: 5px;
transition: all ease 0.5s;
position: relative;
} .TXT_YC p {
position: absolute;
top: 0px;
left: 0px;
margin: 0;
padding: 0;
font-size: 14px;
height: 100%;
width: 75px;
text-align: center;
line-height: 2.7em;
opacity: 0;
transition: all ease 0.5s;
z-index: 0;
} .TXT_YC:hover p {
opacity: 0.3;
} .TXT_YC:hover span {
opacity: 1;
} .TXT_YC span {
height: 100%;
display: block;
padding: 0px 10px;
width: 88%;
transition: all ease 0.5s;
outline: none;
position: absolute;
left: 0px;
z-index: 1;
overflow-x:auto;
white-space: nowrap;
}
/*按钮组*/
.BTN_YC {
width: 65px;
height: 25px;
background: rgba(0, 148, 255, 1);
border-radius: 50px;
padding: 5px;
transition: all ease 0.5s;
position: relative;
} .BTN_YC:active {
background: rgba(0, 148, 255, 0.45);
} .BTN_YC p {
position: absolute;
top: 0px;
left: 0px;
margin: 0;
padding: 0;
font-size: 14px;
height: 100%;
width: 75px;
text-align: center;
line-height: 2.7em;
transition: all ease 0.5s;
}

JS

var OldMsg = { DateTimeS: "", StateCodeI: "", StateTextS: "", DataO: "" };
//实时获取在线人数
var OnlineNumber = new XMLHttpRequest();
var getMsg = new XMLHttpRequest();
var xhr2 = new XMLHttpRequest();
var xhr3 = new XMLHttpRequest();
//获得客户的数据
var ClientXHR = new XMLHttpRequest(); //控件
document.querySelectorAll(".OAO_YC")[0].onclick = function () {
if (this.className.indexOf("OAO_YC_On") == -1) {
//开启
this.classList.add("OAO_YC_On"); } else {
//关闭
this.classList.remove("OAO_YC_On");
xhr2.open("get", "/WebSocket/CloseServer");
xhr2.send();
}
} setInterval(function () {
OnlineNumber.open("get", "/WebSocket/OnlineNumber");
OnlineNumber.send();
OnlineNumber.onreadystatechange = function () {
if (OnlineNumber.readyState == 4 && OnlineNumber.status == 200) {
document.querySelectorAll("header .OnlineClientNum span")[0].innerHTML = OnlineNumber.response;
}
} getMsg.open("get", "/WebSocket/getMsg", true);
getMsg.responseType = "json";
getMsg.send();
getMsg.onreadystatechange = function () {
if (getMsg.readyState == 4 && getMsg.status == 200) {
//console.log(getMsg);
if (getMsg.response.StateCodeI == 10 || getMsg.response.StateCodeI == 200) {
if (OldMsg.DateTimeS != getMsg.response.DateTimeS || OldMsg.StateCodeI != getMsg.response.StateCodeI || OldMsg.StateTextS != getMsg.response.StateTextS || OldMsg.DataO != getMsg.response.DataO) {
OldMsg.DateTimeS = getMsg.response.DateTimeS;
OldMsg.StateCodeI = getMsg.response.StateCodeI;
OldMsg.StateTextS = getMsg.response.StateTextS;
OldMsg.DataO = getMsg.response.DataO;
document.querySelectorAll(".RealTimeNws")[0].querySelectorAll("table tbody")[0].innerHTML += "<tr><td>" + getMsg.response.DateTimeS + "</td><td>" + getMsg.response.StateCodeI + "</td><td style='color:greenyellow'>" + getMsg.response.StateTextS + "</td><td>" + getMsg.response.DataO + "</td></tr>"
}
} else if (getMsg.response.StateCodeI == 100) {
document.querySelectorAll("header .ServerStatus span")[0].style = "background:greenyellow";
document.querySelectorAll("header .ServerAddress span")[0].innerHTML = getMsg.response.DataO; } else if (getMsg.response.StateCodeI == 10) {
document.querySelectorAll("header .ServerStatus span")[0].style = "background:#ccc";
document.querySelectorAll("header .ServerAddress span")[0].innerHTML = ""
} else if (getMsg.response.StateCodeI == 120 || getMsg.response.StateCodeI == 140) {
if (OldMsg.DateTimeS != getMsg.response.DateTimeS || OldMsg.StateCodeI != getMsg.response.StateCodeI || OldMsg.StateTextS != getMsg.response.StateTextS || OldMsg.DataO != getMsg.response.DataO) {
OldMsg.DateTimeS = getMsg.response.DateTimeS;
OldMsg.StateCodeI = getMsg.response.StateCodeI;
OldMsg.StateTextS = getMsg.response.StateTextS;
OldMsg.DataO = getMsg.response.DataO;
document.querySelectorAll(".RealTimeNws")[0].querySelectorAll("table tbody")[0].innerHTML += "<tr><td>" + getMsg.response.DateTimeS + "</td><td>" + getMsg.response.StateCodeI + "</td><td style='color:skyblue'>" + getMsg.response.StateTextS + "</td><td>" + getMsg.response.DataO + "</td></tr>"
}
} else {
if (OldMsg.DateTimeS != getMsg.response.DateTimeS || OldMsg.StateCodeI != getMsg.response.StateCodeI || OldMsg.StateTextS != getMsg.response.StateTextS || OldMsg.DataO != getMsg.response.DataO) {
OldMsg.DateTimeS = getMsg.response.DateTimeS;
OldMsg.StateCodeI = getMsg.response.StateCodeI;
OldMsg.StateTextS = getMsg.response.StateTextS;
OldMsg.DataO = getMsg.response.DataO;
document.querySelectorAll(".RealTimeNws")[0].querySelectorAll("table tbody")[0].innerHTML += "<tr><td>" + getMsg.response.DateTimeS + "</td><td>" + getMsg.response.StateCodeI + "</td><td style='color:red'>" + getMsg.response.StateTextS + "</td><td>" + getMsg.response.DataO + "</td></tr>"
}
} }; } var ClientData ="";
//请求获得客户数据
ClientXHR.open("get", "/WebSocket/ClientInfodata");
getMsg.responseType = "json";
ClientXHR.send();
ClientXHR.onreadystatechange = function () {
if (ClientXHR.readyState == 4 && ClientXHR.status == 200) { if (ClientData != ClientXHR.response) {
ClientData = ClientXHR.response;
document.querySelectorAll(".OnlineClientList table tbody")[0].innerHTML += ClientXHR.response;
} //JSON callback ClientXHR.response; console.log(ClientData,ClientXHR.response);
//callback(ClientXHR.response)
}
} }, 100) document.querySelectorAll(".BTN_YC")[0].onclick = function () {
xhr3.open("get", "/WebSocket/Send?str=" + document.querySelectorAll(".TXT_YC")[0].querySelectorAll("span")[0].innerText);
xhr3.send();
}

展示效果

下一篇我们写控制器的代码,实现启动Socket服务的启动以及监听与发送数据

C#Socket通讯(1)的更多相关文章

  1. 闲来无事,写个基于TCP协议的Socket通讯Demo

    .Net Socket通讯可以使用Socket类,也可以使用 TcpClient. TcpListener 和 UdpClient类.我这里使用的是Socket类,Tcp协议. 程序很简单,一个命令行 ...

  2. 试解析Tomcat运行原理(一)--- socket通讯

    关于这篇文章也确实筹划了很久,今天决定开篇写第一篇,说起tomcat首先很容易联想到IIS,因为我最开始使用的就是.net技术,我第一次使用asp写学生成绩管理系统后,很茫然如何让别人都能看到或者说使 ...

  3. c# TCP Socket通讯基础

    在做网络通讯方面的程序时,必不可少的是Socket通讯. 那么我们需要有一套既定的,简易的通讯流程. 如下: <pre name="code" class="csh ...

  4. Android笔记:Socket通讯常见问题

    经验证的socket通讯问题 1.如果是模拟器和本机PC直接通讯,需要使用本机IP地址 而不是 10.0.2.2  如本机的静态地址为192.168.1.2 则直接使用该地址 2.接收和连接代码不能在 ...

  5. java socket通讯(二)处理多个客户端连接

    通过java socket通讯(一) 入门示例,就可以实现服务端和客户端的socket通讯,但是上一个例子只能实现一个服务端和一个客户端之间的通讯,如果有多个客户端连接服务端,则需要通过多线程技术来实 ...

  6. java socket通讯(一) 入门示例

    一.入门 要想学习socket通讯,首先得知道tcp/ip和udp连接,具体可参考浅谈TCP/IP 和 UDP的区别 二.示例 首先新建了一个java工程,包括两个部分,客户端SocketClient ...

  7. Socket网络通讯开发总结之:Java 与 C进行Socket通讯 + [备忘] Java和C之间的通讯

    Socket网络通讯开发总结之:Java 与 C进行Socket通讯 http://blog.sina.com.cn/s/blog_55934df80100i55l.html (2010-04-08 ...

  8. 利用BlazeDS的AMF3数据封装与Flash 进行Socket通讯

    前几天看到了Adobe有个开源项目BlazeDS,里面提供了Java封装AMF3格式的方法.这个项目貌似主要是利用Flex来Remoting的,不过我们可以利用他来与Flash中的Socket通讯. ...

  9. .Net中的Socket通讯

    .NetFrameWork为Socket通讯提供了System.Net.Socket命名空间,在这个命名空间里面有以下几个常用的重要类分别是: ·Socket类 这个低层的类用于管理连接,WebReq ...

  10. Linux网络服务器epoll模型的socket通讯的实现(一)

    准备写一个网络游戏的服务器的通讯模块,参考网上看到的一些代码,在linux下面实现一个多线程的epoll模型的socket通讯的代码,以下是第一部分多线程的切换代码: 1 #include <s ...

随机推荐

  1. day50:django:有名/无名分组&FBV/CBV

    目录 1.URL有名分组和无名分组 2.FBV和CBV URL有名分组和无名分组 有名分组 使用简单的正则表达式分组匹配(通过圆括号)来捕获URL中的值并以位置参数形式传递给视图 urls.py fr ...

  2. Centos6.5 离线 Openssh 升级

    目录 OpenSSH 升级 一.基于 Dropbear 设置备用 ssh 服务器 二. Openssh 更新 2.1 ssh配置 备份 2.2 openssh 升级 Openssl 升级(由于Open ...

  3. openstack核心组件——horizon Web管理界面(10)

    一.horizon 介绍: 理解 horizon Horizon 为 Openstack 提供一个 WEB 前端的管理界面 (UI 服务 )通过 Horizone 所提供的 DashBoard 服务 ...

  4. vue自适应布局的n中方法

    在index.html中 head标签中 <script> //通过window.screen.width获取屏幕的宽度 var offWidth = window.screen.widt ...

  5. JVM学习(六)JVM常见知识问答

    文章更新时间:2020/04/21 1.什么是Java虚拟机?为什么Java被称作是"平台无关的编程语言"? Java虚拟机是一个可以执行Java字节码的虚拟机进程. Java源文 ...

  6. VUE开发(二)nginx配合vue来实现前后端分离部署

    一.引言 由于本地是采用vue+spring boot实现的前后端分离项目,本机启动的时候先启动后场服务,再单独启动vue工程,然后可以实现全流程贯穿,但是我们要部署到服务器上的时候,一般都是打一个j ...

  7. kafk学习笔记(一)

    kafka消费模式 1.点对点模式:消费者主动拉取消息,消费之后删除数据. 2.发布/订阅模式:如果生产者推给消费者,可能会有些消费者消费比较慢,直接爆炸.或者有些消费者消费很快,资源浪费:一般是消费 ...

  8. puTTY远程登录时,连接不上

    可能接收远程登录的SSH服务没启动 解决办法,控制台输入,service sshd start

  9. 逻辑漏洞介绍 & 越权访问攻击 & 修复建议

    介绍逻辑漏洞 逻辑漏洞就是指攻击者利用业务的设计缺陷,获取敏感信息或破坏业务的完整性.一般出现在密码修改.越权访问.密码找回.交易支付金额等功能处.其中越权访问又有水平越权和垂直越权两种,如下所示. ...

  10. DevOps Next-AI / ML虚拟会议

    这个中秋国庆,一起进阶反超呀!10月1日星期四,加入DevOps Next,可以参加有关AI和ML的免费活动,内容涉及持续测试,代码质量和DevOps生产力.优秀的你一起来加入! 关于本次活动 Dev ...