.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 暂时遇到的 ...
随机推荐
- JavaScript逗号运算符的用法
var a = 3, b b = (a++, a) 与 var a = 3, b b = a++ 区别
- uniapp 跳转链接
安装 uni-link 超链接 组件在异步里需要 跳转页面 或者 app里打开浏览器,不能自动跳转, 如充值:增加一个弹窗,获取到地址之后,手动点击link,打开app <uni-link :h ...
- leetcode 814. 二叉树剪枝 【时间击败100.00%】【 内存击败84.62%】
1 public TreeNode pruneTree(TreeNode root) { 2 dfs(root,null,-1); 3 return root; 4 } 5 6 public void ...
- VUE学习-基础(基础语法 & 模板语法)
基础语法 引入vue <!-- 开发环境版本,包含了有帮助的命令行警告 --> <script src="https://cdn.jsdelivr.net/npm/vue/ ...
- Windows D3D渲染到纹理
D3D渲染到纹理 1 #include <d3dx9.h> 2 3 //---------------------------------------------------------- ...
- 12. Redis 安装
参考http://www.runoob.com/redis/redis-install.html Window 下安装 下载地址:https://github.com/MSOpenTech/redis ...
- 「DIARY」PKUSC 2021 游记
冬令营没了但是还有夏令营 (完蛋,前两天忘写游记了,完全没想起来--最后一天补一补) 试题分析在另外一篇博客上 # Day 0 早上去机场的时候把手机落在出租车上了 (还好之后找回来了),导致我前两天 ...
- 用java读取Excel并依据模板图生成对应的图片
package test; import java.awt.*; import java.awt.image.BufferedImage; import java.io.*; import java. ...
- 分布式中间件MyCat 使用
MySQL 分布式软件MyCAT介绍 目录 MySQL 分布式软件MyCAT介绍 一.MySQL 分布式软件MyCAT介绍 1.1.1 MySQL 分布式软件MyCAT介绍 1.1.2 MyCat 架 ...
- mysql 获取表信息 表备注等
select table_name, table_comment, create_time, update_time from information_schema.tables-- where ta ...