C#Socket通讯(1)
前言
因为自己需要开发一款自己的游戏,因为设计网络方面,所以我找了很多的资料,再加上考虑到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)的更多相关文章
- 闲来无事,写个基于TCP协议的Socket通讯Demo
.Net Socket通讯可以使用Socket类,也可以使用 TcpClient. TcpListener 和 UdpClient类.我这里使用的是Socket类,Tcp协议. 程序很简单,一个命令行 ...
- 试解析Tomcat运行原理(一)--- socket通讯
关于这篇文章也确实筹划了很久,今天决定开篇写第一篇,说起tomcat首先很容易联想到IIS,因为我最开始使用的就是.net技术,我第一次使用asp写学生成绩管理系统后,很茫然如何让别人都能看到或者说使 ...
- c# TCP Socket通讯基础
在做网络通讯方面的程序时,必不可少的是Socket通讯. 那么我们需要有一套既定的,简易的通讯流程. 如下: <pre name="code" class="csh ...
- Android笔记:Socket通讯常见问题
经验证的socket通讯问题 1.如果是模拟器和本机PC直接通讯,需要使用本机IP地址 而不是 10.0.2.2 如本机的静态地址为192.168.1.2 则直接使用该地址 2.接收和连接代码不能在 ...
- java socket通讯(二)处理多个客户端连接
通过java socket通讯(一) 入门示例,就可以实现服务端和客户端的socket通讯,但是上一个例子只能实现一个服务端和一个客户端之间的通讯,如果有多个客户端连接服务端,则需要通过多线程技术来实 ...
- java socket通讯(一) 入门示例
一.入门 要想学习socket通讯,首先得知道tcp/ip和udp连接,具体可参考浅谈TCP/IP 和 UDP的区别 二.示例 首先新建了一个java工程,包括两个部分,客户端SocketClient ...
- Socket网络通讯开发总结之:Java 与 C进行Socket通讯 + [备忘] Java和C之间的通讯
Socket网络通讯开发总结之:Java 与 C进行Socket通讯 http://blog.sina.com.cn/s/blog_55934df80100i55l.html (2010-04-08 ...
- 利用BlazeDS的AMF3数据封装与Flash 进行Socket通讯
前几天看到了Adobe有个开源项目BlazeDS,里面提供了Java封装AMF3格式的方法.这个项目貌似主要是利用Flex来Remoting的,不过我们可以利用他来与Flash中的Socket通讯. ...
- .Net中的Socket通讯
.NetFrameWork为Socket通讯提供了System.Net.Socket命名空间,在这个命名空间里面有以下几个常用的重要类分别是: ·Socket类 这个低层的类用于管理连接,WebReq ...
- Linux网络服务器epoll模型的socket通讯的实现(一)
准备写一个网络游戏的服务器的通讯模块,参考网上看到的一些代码,在linux下面实现一个多线程的epoll模型的socket通讯的代码,以下是第一部分多线程的切换代码: 1 #include <s ...
随机推荐
- day50:django:有名/无名分组&FBV/CBV
目录 1.URL有名分组和无名分组 2.FBV和CBV URL有名分组和无名分组 有名分组 使用简单的正则表达式分组匹配(通过圆括号)来捕获URL中的值并以位置参数形式传递给视图 urls.py fr ...
- Centos6.5 离线 Openssh 升级
目录 OpenSSH 升级 一.基于 Dropbear 设置备用 ssh 服务器 二. Openssh 更新 2.1 ssh配置 备份 2.2 openssh 升级 Openssl 升级(由于Open ...
- openstack核心组件——horizon Web管理界面(10)
一.horizon 介绍: 理解 horizon Horizon 为 Openstack 提供一个 WEB 前端的管理界面 (UI 服务 )通过 Horizone 所提供的 DashBoard 服务 ...
- vue自适应布局的n中方法
在index.html中 head标签中 <script> //通过window.screen.width获取屏幕的宽度 var offWidth = window.screen.widt ...
- JVM学习(六)JVM常见知识问答
文章更新时间:2020/04/21 1.什么是Java虚拟机?为什么Java被称作是"平台无关的编程语言"? Java虚拟机是一个可以执行Java字节码的虚拟机进程. Java源文 ...
- VUE开发(二)nginx配合vue来实现前后端分离部署
一.引言 由于本地是采用vue+spring boot实现的前后端分离项目,本机启动的时候先启动后场服务,再单独启动vue工程,然后可以实现全流程贯穿,但是我们要部署到服务器上的时候,一般都是打一个j ...
- kafk学习笔记(一)
kafka消费模式 1.点对点模式:消费者主动拉取消息,消费之后删除数据. 2.发布/订阅模式:如果生产者推给消费者,可能会有些消费者消费比较慢,直接爆炸.或者有些消费者消费很快,资源浪费:一般是消费 ...
- puTTY远程登录时,连接不上
可能接收远程登录的SSH服务没启动 解决办法,控制台输入,service sshd start
- 逻辑漏洞介绍 & 越权访问攻击 & 修复建议
介绍逻辑漏洞 逻辑漏洞就是指攻击者利用业务的设计缺陷,获取敏感信息或破坏业务的完整性.一般出现在密码修改.越权访问.密码找回.交易支付金额等功能处.其中越权访问又有水平越权和垂直越权两种,如下所示. ...
- DevOps Next-AI / ML虚拟会议
这个中秋国庆,一起进阶反超呀!10月1日星期四,加入DevOps Next,可以参加有关AI和ML的免费活动,内容涉及持续测试,代码质量和DevOps生产力.优秀的你一起来加入! 关于本次活动 Dev ...