.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 暂时遇到的 ...
随机推荐
- vscode 开发Vue项目
写在开头 Vue作为前端项目,本身不依赖IDE,完全可以使用任何文本编辑器进行开发.我使用vscode仅是因为比较习惯,vscode几乎可以作为任何项目的开发IDE. 环境安装 安装nodejs,去官 ...
- HTML+CSS+JS制作一个黑灰色简约时钟
HTML+CSS+JS制作一个黑灰色简约时钟 1. 效果图: 2. 特点:这次借鉴了网络上的代码,利用JS动态创建元素,减少html语句的数量,也便于与vue.react等语言进行结合. 3. 代码实 ...
- Kubernetes之Pod详解
1.Pod生命周期 pod创建 1. API Server 在接收到创建pod的请求之后,会根据用户提交的参数值来创建一个运行时的pod对象. 2. 根据 API Server 请求的上下文的元数据来 ...
- go中的Itoa、Atoi和iota
1. strcov包中的 Itoa 和Atoi Itoa (用于将整数转换为字符串) 来源:早期c语言中没有string类型而是用字符数组array表示字符串,所以 Itoa 是缩写于Int to A ...
- python读取、写入txt文本
1. 读取txt文本 1.1 read() 一次性读全部内容 一次性读取文本中全部的内容,以字符串的形式返回结果 with open("text.txt", "r& ...
- 暑假学习6 hdfs shell命令
命令行操作:cli Hadoop的命令shell : Hadoop fs -ls file: 操作 本地的文件系统 hadoop fs -ls hdfs://nod ...
- Liunx 日志检索 grep -v -a awk
grep -5 'parttern' inputfile.log //打印匹配行的前后5行 grep -C 5 'parttern' inputfile.log //打印匹配行的前后5行 gr ...
- 048_Search Lookup
The Problematic Situation:When you add any lookup in Salesforce on a layout from one object to anoth ...
- Python冰墩墩(非原创,搬运工)
import turtle turtle.title('2022北京冬奥会冰墩墩') turtle.speed(10000) # 速度 # 左手 turtle.penup() turtle.goto( ...
- 学习lua-01,遍历集合,多入参循环处理,类型判断,数字运算
--function maxnum(tab1) -- local b = 1 -- local a = tab1[b] -- for i, v in ipairs(tab1) do -- if v & ...