.Netcore webApi 注入socket 与客户端交互
模拟服务端
private string TcpServiceControl(string value)
{
// 1.按照模拟工具上看 先new一个tcp服务
Socket serverSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
//申请端口,绑定ip
IPAddress iPAddress = IPAddress.Parse(_appConfig.ApplictionSettings.ControlTcpIP);
IPEndPoint iPEndPoint = new IPEndPoint(iPAddress, Convert.ToInt32(_appConfig.ApplictionSettings.ControlTcpPort));
//绑定ip和端口
serverSocket.Bind(iPEndPoint);
//开始监听端口 设置50防止服务器崩溃,设置0表示不限制数量
serverSocket.Listen(0);//传递挂起的连接队列的最大长度 //接收客户端信息 程序会暂停 直到由一个客户端连接过来才会继续向下运行
Socket clientSocket = serverSocket.Accept();//接收一个客户端连接,返回一个socket用来和客户端通讯 //向客户端发送一条数据
byte[] data = System.Text.Encoding.UTF8.GetBytes(value);
clientSocket.Send(data); //接收客户端一条消息
byte[] databuffer = new byte[1024];//接收时先定义一个数组
int count = clientSocket.Receive(databuffer);//知道数组中前count个是接收到的数据
String hex = Encoding.ASCII.GetString(databuffer, 0, count); //string msgREceive = System.Text.Encoding.UTF8.GetString(databuffer, 0, count);
//Console.WriteLine(msgREceive); //Console.ReadKey();//程序终止的太快,方便观察输出
//关闭服务器端
clientSocket.Close();//关闭与客户端的连接
serverSocket.Close();//关闭服务器自身的连接
return hex;
}
模拟客户端
private static void NewMethod()
{
// 1.按照模拟工具上看 先new一个tcp服务 //Parse将字符串转换为IP地址类型
IPAddress myIP = IPAddress.Parse("192.168.88.1");
//构造一个TcpClient类对象,TCP客户端
TcpClient client = new TcpClient();
//与TCP服务器连接
client.Connect(myIP, 10067);
Console.WriteLine("服务器已经连接...请输入对话内容..."); //创建网络流,获取数据流
NetworkStream stream = client.GetStream();
//读数据流对象
StreamReader sr = new StreamReader(stream);
//写数据流对象
StreamWriter sw = new StreamWriter(stream); while (true)
{
string msg = Console.ReadLine();
sw.WriteLine(msg);
sw.Flush(); //刷新流
Console.WriteLine("服务器:" + sr.ReadLine());
}
client.Close();
Console.Read();
// 2.输入的数据转化为 16 进制传输
}
将服务注入asp.net core webapi中
public class WebSocketService : IWebSocketService
{ private static AppConfig _appConfig;
private static Socket _serverSocket;
private static Socket _clientSocket;
private static bool _IsClientSendData = false;
private static byte[] buffer = new byte[100];
private readonly IDataCollectionExpandService _dataCollectionExpandService; public WebSocketService(AppConfig appConfig, IDataCollectionExpandService dataCollectionExpandService)
{
_appConfig = appConfig;
_dataCollectionExpandService = dataCollectionExpandService;
} public void SocketServiceOpen()
{
try
{
System.Timers.Timer Read_Timer;
//设置定时间隔(毫秒为单位) 5s
Read_Timer = new System.Timers.Timer(10000);
Read_Timer.AutoReset = true;
Read_Timer.Enabled = true;
Read_Timer.Elapsed += new ElapsedEventHandler((s, e) => TimerOutCallBack(s, e));
Read_Timer.Start();
}
catch (Exception ex)
{
Console.WriteLine("socket启动失败" + ex.Message);
}
} private void TimerOutCallBack(object s, ElapsedEventArgs e)
{
Console.WriteLine("----->>>轮询监测");
if (_serverSocket == null)
{
SocketStartService();
} if (_clientSocket != null && _IsClientSendData == true)
{
IsSocketSend(_clientSocket);
}
} private void IsSocketSend(Socket s)
{
try
{
_clientSocket.Send(HexStringToBytes("11 01 00 00 00 08 3F 5C"));
}
catch (Exception ex)
{
_IsClientSendData = false;
Console.WriteLine(ex.Message);
SocketRestart();
} } // 检查一个Socket是否可连接
//private bool IsSocketConnected(Socket s)
//{
// #region 再舍弃
// //return !((s.Poll(1000, SelectMode.SelectRead) && (s.Available == 0)) || !s.Connected);
// #endregion // #region 先舍弃
// //bool blockingState = client.Blocking;
// //try
// //{
// // byte[] tmp = new byte[1];
// // client.Blocking = false;
// // client.Send(tmp, 0, 0);
// // return true;
// //}
// //catch (SocketException e)
// //{
// // // 产生 10035 == WSAEWOULDBLOCK 错误,说明被阻止了,但是还是连接的
// // if (e.NativeErrorCode.Equals(10035))
// // return false;
// // else
// // return true;
// //}
// //finally
// //{
// // client.Blocking = blockingState; // 恢复状态
// //}
// #endregion
//} /// <summary>
/// socket 服务重启
/// </summary>
private void SocketRestart()
{
//if (_clientSocket.Poll(1000, SelectMode.SelectRead))
//{
// _clientSocket.Close();
// _serverSocket.Close();
// _clientSocket.Dispose();
// _serverSocket.Dispose();
// SocketStartService();
// Console.WriteLine("socket服务重启");
// return;
//} _clientSocket.Close();
_serverSocket.Close();
_clientSocket.Dispose();
_serverSocket.Dispose();
Console.WriteLine("socket服务重启中……待连接");
SocketStartService();
Console.WriteLine("socket服务重启成功");
return;
} private void SocketStartService()
{
Console.WriteLine("进入SocketServiceOpen");
// 1.按照模拟工具上看 先new一个tcp服务
_serverSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
//申请端口,绑定ip
IPAddress iPAddress = IPAddress.Parse(_appConfig.ApplictionSettings.ControlTcpIP);
IPEndPoint iPEndPoint = new IPEndPoint(iPAddress, Convert.ToInt32(_appConfig.ApplictionSettings.ControlTcpPort));
//绑定ip和端口
_serverSocket.Bind(iPEndPoint);
//开始监听端口 设置50防止服务器崩溃,设置0表示不限制数量
_serverSocket.Listen(0);//传递挂起的连接队列的最大长度 ////接收客户端信息 程序会暂停 直到由一个客户端连接过来才会继续向下运行
_clientSocket = _serverSocket.Accept();
//接收一个客户端连接,返回一个socket用来和客户端通讯
_clientSocket.BeginReceive(buffer, 0, buffer.Length, SocketFlags.None, new AsyncCallback(ReceiveCallback), _clientSocket);
_IsClientSendData = true;
} /// <summary>
/// 回调函数的接收
/// </summary>
/// <param name="result"></param>
public void ReceiveCallback(IAsyncResult result)
{
try
{
Socket ts = (Socket)result.AsyncState;
ts.EndReceive(result);
result.AsyncWaitHandle.Close();
Console.WriteLine("收到消息:{0}", Encoding.ASCII.GetString(buffer)); //string data = ByteArrayToHexString(buffer);
string data = ToHexStrFromByte(buffer);
Console.WriteLine(data);
if (!string.IsNullOrEmpty(data))
{
_dataCollectionExpandService.SetTASSocketDataAsync(data);
}
//清空数据,重新开始异步接收
buffer = new byte[buffer.Length];
ts.BeginReceive(buffer, 0, buffer.Length, SocketFlags.None, new AsyncCallback(ReceiveCallback), ts);
}
catch (Exception ex)
{
Console.WriteLine("socket服务异常" + ex.Message);
}
} /// <summary>
/// 是否有客户端连接
/// </summary>
/// <returns></returns>
public bool IsSocketClinet()
{
bool isSocketClinet = true;
if (_clientSocket == null)
{
isSocketClinet = false;
}
return isSocketClinet;
} /// <summary>
/// 发送数据到客户端
/// </summary>
/// <param name="value"></param>
/// <returns></returns>
public async Task SendSocketServiceMessages(byte[] value)
{
//byte[] data = System.Text.Encoding.UTF8.GetBytes(value); //_publicSocket = _clientSocket;
_clientSocket.Send(value); //_clientSocket.BeginAccept(AcceptCallback,null);
//接收客户端一条消息
//byte[] databuffer = new byte[1024];//接收时先定义一个数组
//int count = _clientSocket.Receive(databuffer);//知道数组中前count个是接收到的数据
//return Encoding.ASCII.GetString(databuffer, 0, count);
} public string ByteArrayToHexString(byte[] data)
{
StringBuilder sb = new StringBuilder(data.Length * 3);
foreach (byte b in data)
{
sb.Append(Convert.ToString(b, 16).PadLeft(2, '0').PadRight(3, ' '));
}
return sb.ToString().ToUpper();
} /// <summary>
/// 字节数组转16进制字符串:空格分隔
/// </summary>
/// <param name="byteDatas"></param>
/// <returns></returns>
public string ToHexStrFromByte(byte[] byteDatas)
{
StringBuilder builder = new StringBuilder();
for (int i = 0; i < byteDatas.Length; i++)
{
builder.Append(string.Format("{0:X2} ", byteDatas[i]));
}
return builder.ToString().Trim();
} public static byte[] HexStringToBytes(string hs)
{
string[] strArr = hs.Trim().Split(' ');
byte[] b = new byte[strArr.Length];
//逐个字符变为16进制字节数据
for (int i = 0; i < strArr.Length; i++)
{
b[i] = Convert.ToByte(strArr[i], 16);
}
//按照指定编码将字节数组变为字符串
return b;
} }
注入
services.AddSingleton(typeof(IWebSocketService), typeof(WebSocketService));
WebSocketService webSocketService = new WebSocketService(_appConfig);
Thread thread = new Thread(() => webSocketService.SocketServiceOpen());
thread.Start();
.Netcore webApi 注入socket 与客户端交互的更多相关文章
- 运用socket实现简单的服务器客户端交互
Socket解释: 网络上的两个程序通过一个双向的通信连接实现数据的交换,这个连接的一端称为一个socket. Socket的英文原义是“孔”或“插座”.作为BSD UNIX的进程通信机制,取后一种意 ...
- c++ 网络编程(一)TCP/UDP windows/linux 下入门级socket通信 客户端与服务端交互代码
原文作者:aircraft 原文地址:https://www.cnblogs.com/DOMLX/p/9601511.html c++ 网络编程(一)TCP/UDP 入门级客户端与服务端交互代码 网 ...
- NetCore WebApi使用Jwtbearer实现认证和授权
1. 什么是JWT? JWT是一种用于双方之间传递安全信息的简洁的.URL安全的表述性声明规范.JWT作为一个开放的标准(RFC 7519),定义了一种简洁的,自包含的方法用于通信双方之间以Json对 ...
- .NetCore WebApi——基于JWT的简单身份认证与授权(Swagger)
上接:.NetCore WebApi——Swagger简单配置 任何项目都有权限这一关键部分.比如我们有许多接口.有的接口允许任何人访问,另有一些接口需要认证身份之后才可以访问:以保证重要数据不会泄露 ...
- 通用异步 Windows Socket TCP 客户端组件的设计与实现
编写 Windows Socket TCP 客户端其实并不困难,Windows 提供了6种 I/O 通信模型供大家选择.但本座看过很多客户端程序都把 Socket 通信和业务逻辑混在一起,剪不断理还乱 ...
- .NetCore WebApi结构及前端访问方式
.NetCore WebApi结构及前端访问方式(Ajax方式,fetch方式,axios方式) //访问的地址api/控制器名称/方法名称;action一般会省略 [Route("api/ ...
- JWT With NetCore WebApi
1 什么是JWT? JWT是一种用于双方之间传递安全信息的简洁的.URL安全的表述性声明规范.JWT作为一个开放的标准(RFC 7519),定义了一种简洁的,自包含的方法用于通信双方之间以Json对象 ...
- upd套接字服务器与客户端交互C++代码示范
upd套接字服务器与客户端交互C++代码示范 // vc2_2_4UDPserver_Txwtech.cpp : 定义控制台应用程序的入口点. //服务器端 #include "StdAfx ...
- 彻底解决Asp.netCore WebApi 3.1 跨域时的预检查204 options重复请求的问题
Asp.netCore WebApi 3.1 跨域的预检查options问题 1:我们直接使用core跨域的中间件 ,注入跨域服务, services.AddCors(options => { ...
- 移动端开发(使用webuploader上传图片,客户端交互,修改alert弹窗等)
之前实习做的一个移动端的页面 需要的功能有图片上传 点击客户端的返回按钮 有提示(即与客户端有交互) 遇到不少的坑 总结一下问题 1.图片上传功能 使用工具 百度的webuploader 暂时遇到的 ...
随机推荐
- spring缓存创建
/** * * <b>创建缓存</b> * <p> * 创建缓存,若已存在直接返回. * <p> * @param cacheName * @retur ...
- form 常用
1.input输入数字校验 <el-input class="timeRange" type="number" v-model="value & ...
- Winform使用CefSharp和HttpWebRequest如何保持会话Session
之前我们使用CefSharp,在Winform中,使用ChromiumWebBrowser加载了web项目的页面.并且通过html页面的js调用了本地的窗口.那么下一个问题来了.为了保障系统安全性,项 ...
- HTML多媒体
多媒体(一).插入音频.视频和flash在网页中插入音频.视频和flash都是使用embed标签. 语法: <embed src="多媒体文件地址" width=" ...
- 假设业务需要,在页面一屏中一次性展示大量图片(100张),导致img组件同时发起大量的请求,导致浏览器性能被消耗殆尽,页面卡死。怎么优化?
1.所有图片先提供占位图2.懒加载思想3.使用队列的方式4.通过信号量的机制,结合队列.例如设置可用资源数为10,则保证同一时刻,只有10张图片正在请求,其它图片处于loading状态,任意图片请求完 ...
- LaTex【六】表格排版—表格标题位置
LaTex中表格排版--表格描述位置调整 LaTex模板大多默认将表格描述置于表格下方,可通过修改 \caption 的位置调整. 1. 位于表格下方(默认) \begin{table}[h] \be ...
- Python 获取IP地址
import socket def get_host_ip(): """ 查询本机ip地址 :return: """ try: s=sock ...
- 某个灰产远程调用的script源码
访问一个老域名,可能是释放了被所灰产的的注册了,跳转简单扒下他们的源码. 主要是三段script代码,第一段是百度自动推送代码,第二段是站长统计代码,第三段则是远程调用断码. <html xml ...
- jadx 定位方法
目录 链接参数定位 链接参数定位 通过搜索请求链接中的参数来定位函数位置,如下图所示,请求链接为 https://www.python-spider.com/api/app1,app1为链接标识,可以 ...
- js-模态框的拖动
效果如下: 代码如下: <div class="clickBtn">点击,弹出登录框</div> <div class="login&quo ...