体验.net core 3.1 socket
2023-09-11 14:16:54 时间
最近好像比较闲了,每天也没加班经常不到半天就把活干完。7点半到公司,5点下班。这样的日子,好像也没意思。
想起把以前windows平台下的socket server程序试试在.net core下改造一下跑在linux服务器上。
services.AddSingleton(MiddlewareContext.GetInstance());
using DingTalk_Middleware.dto; using System; using System.Collections.Generic; using System.Linq; using System.Net; using System.Net.Sockets; using System.Text; using System.Threading; using System.Threading.Tasks; namespace DingTalk_Middleware { public class MiddlewareContext { private static MiddlewareContext _ServiceContext = null; private readonly static object lockObj = new object(); public Dictionary<string, EmployeeDTO> UserCache = new Dictionary<string, EmployeeDTO>(); protected Dictionary<string, Socket> clientDict = new Dictionary<string, Socket>(); Action updateCacheTask; Socket serverSocket; Thread socketThread; private MiddlewareContext() { updateCacheTask = () => { while (true) { Console.WriteLine(DateTime.Now + ":->updateCacheTask is running!Cache Count:" + UserCache.Count + "。"); System.Threading.Thread.Sleep(10000); if (UserCache.Count > 1000) { UserCache.Clear(); Console.WriteLine(DateTime.Now + ":->Cache is cleared。"); } } }; Task.Factory.StartNew(updateCacheTask); serverSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); byte[] inValue = new byte[] { 1, 0, 0, 0, 0x88, 0x13, 0, 0, 0xd0, 0x07, 0, 0 }; serverSocket.IOControl(IOControlCode.KeepAliveValues, inValue, null); IPEndPoint ipEndPoint = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 5990); serverSocket.Bind(ipEndPoint); serverSocket.Listen(1024); socketThread = new Thread(() => { if (serverSocket != null) { while (true) { try { Socket clientSocket = serverSocket.Accept(); if (clientSocket != null) { string ip = clientSocket.RemoteEndPoint.ToString(); Console.WriteLine(DateTime.Now + "->:" + ip); if (!clientDict.ContainsKey(ip)) { clientDict.Add(ip, clientSocket); } else { clientDict[ip] = clientSocket; } Thread receiveThread = new Thread(ReceiveMessage); receiveThread.Start(clientSocket); } } catch { } finally { Thread.Sleep(1); } } } }); socketThread.Start(); } private void ReceiveMessage(object clientSocket) { byte[] buffer = new byte[4096]; Socket myClientSocket = (Socket)clientSocket; while (myClientSocket != null) { try { if (myClientSocket != null && myClientSocket.Connected) { try { int receiveNumber = myClientSocket.Receive(buffer); if (receiveNumber > 0) { string msg = Encoding.UTF8.GetString(buffer).Trim(); Console.WriteLine(DateTime.Now + "Recevice Data:->" + msg); } } catch (Exception exx) { Console.WriteLine(Environment.NewLine + exx.Message); if (myClientSocket != null) myClientSocket.Close(); } } } catch (Exception ex) { Console.WriteLine(Environment.NewLine + ex.Message); } finally { Thread.Sleep(10); } } } public static MiddlewareContext GetInstance() { if (_ServiceContext == null) { lock (lockObj) { if (_ServiceContext == null) { _ServiceContext = new MiddlewareContext(); } } } return _ServiceContext; } } }
不是控制台程序。就用的asp.net core webapi。这样api 和 socket server在一起,比较符合原来的场景。
相关文章
- .NET Core Web APi大文件分片上传研究
- ASP.NET Core实现强类型Configuration读取配置数据
- 学习ASP.NET Core Blazor编程系列三——实体
- Why would one use a third-party DI Container over the built-in ASP.NET Core DI Container?
- WebAPI调用笔记 ASP.NET CORE 学习之自定义异常处理 MySQL数据库查询优化建议 .NET操作XML文件之泛型集合的序列化与反序列化 Asp.Net Core 轻松学-多线程之Task快速上手 Asp.Net Core 轻松学-多线程之Task(补充)
- SQL 横转竖 、竖专横 (转载) 使用Dapper.Contrib 开发.net core程序,兼容多种数据库 C# 读取PDF多级书签 Json.net日期格式化设置 ASPNET 下载共享文件 ASPNET 文件批量下载 递归,循环,尾递归 利用IDisposable接口构建包含非托管资源对象 《.NET 进阶指南》读书笔记2------定义不可改变类型
- C#设计模式总结 C#设计模式(22)——访问者模式(Vistor Pattern) C#设计模式总结 .NET Core launch.json 简介 利用Bootstrap Paginator插件和knockout.js完成分页功能 图片在线裁剪和图片上传总结 循序渐进学.Net Core Web Api开发系列【2】:利用Swagger调试WebApi
- IT咨询顾问:一次吐血的项目救火 java或判断优化小技巧 asp.net core Session的测试使用心得 【.NET架构】BIM软件架构02:Web管控平台后台架构 NetCore入门篇:(十一)NetCore项目读取配置文件appsettings.json 使用LINQ生成Where的SQL语句 js_jquery_创建cookie有效期问题_时区问题
- C#字符串数组排序 C#排序算法大全 C#字符串比较方法 一个.NET通用JSON解析/构建类的实现(c#) C#处理Json文件 asp.net使用Jquery+iframe传值问题
- 【23种设计模式】工厂方法模式(Factory Method Pattern) .Net Core实现
- 【.Net Core】使用SignalR实现实时通信
- IIS上部署Net.Core
- [WPF]是时候将WPF控件库从.Net Framework升级到.NET Core 3.1
- Asp.net Core 3.1 之NLog使用扩展
- 二、Core授权-2 之.net core 基于Jwt实现Token令牌(策略)
- 一、Core授权-2 之.net core 基于Jwt实现Token令牌
- HttpClientFactory in ASP.NET Core 2.1 Part 1 介绍