当前位置: 首页 > wzjs >正文

学校网站建设软件推荐广州网页设计培训教程

学校网站建设软件推荐,广州网页设计培训教程,自适应网站设计规范,做一个电子商务网站C#TCP通讯封装服务器工具类 1使用说明2封装 1使用说明 添加接受数据回调函数事件 方式1&#xff1a;通过有参构造函数添加 方式2&#xff1a;调用&#xff1a;public EventHandler<byte[]> AddEventToDataReceived 添加输出日志回调函数事件 方式1&#xff1a;通过有参构…

C#TCP通讯封装服务器工具类

  • 1使用说明
  • 2封装

1使用说明

  • 添加接受数据回调函数事件

方式1:通过有参构造函数添加
方式2:调用:public EventHandler<byte[]> AddEventToDataReceived

  • 添加输出日志回调函数事件

方式1:通过有参构造函数添加
方式2:调用:public Action<EMessage, IPEndPoint, int, string> AddEventToOutLog

  • 监听客户端发送数据线程向其他客户端转发消息的数据如何输出日志信息

方式:设置属性【OutputReceivedLog 】、设置属性【OutputReplyLog】
类型:

Null :不输出
Length:仅输出接受数据的长度信息
UTF8:UTF8-解析输出
ASCII:ASCII-解析输出
ByteToString:输出字节的字符串形式

2封装

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Net;
using System.Net.Sockets;
using System.Text;
using System.Threading;
using System.Threading.Tasks;namespace Tcp_Server
{public class ServerModel{private bool _firstStartServer = true;private TcpListener _server;private List<TcpClient> _tcpClientsList = new List<TcpClient>();/// <summary>/// 接受消息回调函数/// </summary>private EventHandler<byte[]> _callbackEventDataReceived;/// <summary>/// 日志信息回调函数/// int:线程ID/// </summary>private Action<EMessage, IPEndPoint, int, string> _callbackEventOutLog;public ServerModel(EventHandler<byte[]> callbackEventDataReceived, Action<EMessage, IPEndPoint, int, string> callbackEventOutLog){AddEventToDataReceived = callbackEventDataReceived;AddEventToOutLog = callbackEventOutLog;}public ServerModel(){}~ServerModel(){CloseServer();}/// <summary>/// 监听接入客户端/// </summary>private void ListeningClient(){TcpClient client = null;try{//等待客户端连接client = _server.AcceptTcpClient();AddLog(client, EMessage.State, "已连接");//为(每个)客户端创建线程处理通信new Task(() => HandleClient(client)).Start();}catch (Exception ex){AddLog(client, EMessage.Exception, $"ListeningClient: {ex.Message}");}}private void HandleClient(TcpClient client){try{NetworkStream stream = client.GetStream();_tcpClientsList.Add(client);byte[] buffer = new byte[1024];while (IsOpen){// 异步读取客户端发送的消息int bytesRead = stream.Read(buffer, 0, buffer.Length);if (bytesRead == 0){// 客户端断开连接break;}var receive = new byte[bytesRead];Array.Copy(buffer, receive, bytesRead);_callbackEventDataReceived?.Invoke(null, receive);PacketParseLog(EMessage.Receive, OutputReceivedLog, client, receive);//转发消息给其他客户端BroadcastMessage(client, buffer);}}catch (Exception ex){AddLog(client, EMessage.Exception, $"HandleClient: {ex.Message}");}}private void BroadcastMessage(TcpClient sender, byte[] buffer){int length = buffer.Length;foreach (TcpClient client in _tcpClientsList){if (client != sender && client.Connected){try{NetworkStream stream = client.GetStream();stream.Write(buffer, 0, length);PacketParseLog(EMessage.Reply, OutputReplyLog, client, buffer);}catch (Exception ex){AddLog(client, EMessage.Exception, $"BroadcastMessage: {ex.Message}");}}}}/// <summary>/// 解析数据包输出至日志/// </summary>/// <param name="messageType"></param>/// <param name="type"></param>/// <param name="client"></param>/// <param name="bytes"></param>private void PacketParseLog(EMessage messageType, ETranscoding type, TcpClient client, byte[] bytes){string message;switch (type){case ETranscoding.Length:message = bytes.Length.ToString();break;case ETranscoding.UTF8:message = Encoding.UTF8.GetString(bytes);break;case ETranscoding.ASCII:message = Encoding.ASCII.GetString(bytes);break;case ETranscoding.ByteToString:var builder = new StringBuilder();builder.Append("[ ");foreach (var b in bytes){builder.Append(Convert.ToString(b, 16).PadLeft(2, '0').ToUpper() + " ");}builder.Append("]");message = builder.ToString();break;default:return;}AddLog(client, messageType, message);}private void AddLog(TcpClient client, EMessage type, string description){int threadId = Thread.CurrentThread.ManagedThreadId;IPEndPoint ipEndPoint;if (client != null){ipEndPoint = (IPEndPoint)client.Client.RemoteEndPoint;}else{ipEndPoint = (IPEndPoint)_server.LocalEndpoint;}_callbackEventOutLog?.Invoke(type, ipEndPoint, threadId, description);}/********隔离线********隔离线********隔离线********隔离线********隔离线********隔离线********隔离线********/public EventHandler<byte[]> AddEventToDataReceived{set{if (value != null) _callbackEventDataReceived += value;}}public Action<EMessage, IPEndPoint, int, string> AddEventToOutLog{set{if (value != null) _callbackEventOutLog += value;}}/// <summary>/// 接受到客户端数据时输出日志信息的方式,默认:不输出/// </summary>public ETranscoding OutputReceivedLog { get; set; } = ETranscoding.Null;/// <summary>/// 转发消息Log时数据解析方式/// </summary>public ETranscoding OutputReplyLog { get; set; } = ETranscoding.Null;public bool StartServer(string ip, int port){try{CloseServer();//创建一个 TCP 监听器,监听本地 IP 地址和端口_server = new TcpListener(IPAddress.Parse(ip), port);// 启动服务器_server.Start();AddLog(null, EMessage.State, "服务器已启动");IsOpen = true;if (_firstStartServer){_firstStartServer = false;new Task(() =>{while (IsOpen){Thread.Sleep(1000);ListeningClient();}}).Start();}}catch (Exception ex){AddLog(null, EMessage.Exception, $"StartServer: {ex.Message}");}return IsOpen;}public void CloseServer(){if (IsOpen){// 停止服务器_server.Stop();}IsOpen = false;_server = null;}public bool IsOpen { get; private set; }public enum EMessage{[Description("状态信息")]State = 1,[Description("发送")]Send = 3,[Description("接受")]Receive = 5,[Description("异常")]Exception = 7,[Description("回复")]Reply = 9,}/// <summary>/// 接受到客户端数据时字节码解析方式,解析后输出至日志/// </summary>public enum ETranscoding{/// <summary>/// 不输出/// </summary>Null = 101,/// <summary>/// 仅输出接受数据的长度信息/// </summary>Length,/// <summary>/// UTF8-解析输出/// </summary>UTF8,/// <summary>/// ASCII-解析输出/// </summary>ASCII,/// <summary>/// 输出字节的字符串形式/// </summary>ByteToString}}
}

文章转载自:

http://97XRxvVi.ctrkh.cn
http://vRqVORH3.ctrkh.cn
http://IunvELdY.ctrkh.cn
http://PvL3eBZs.ctrkh.cn
http://ebuvtzXj.ctrkh.cn
http://3yCmqEFG.ctrkh.cn
http://PBOIB9ua.ctrkh.cn
http://KhOnAiEa.ctrkh.cn
http://WjidJK74.ctrkh.cn
http://scaHGSUq.ctrkh.cn
http://qmzfCtS9.ctrkh.cn
http://ntEaWwXE.ctrkh.cn
http://FoYWDfp8.ctrkh.cn
http://XVty2FN3.ctrkh.cn
http://7cTokEYI.ctrkh.cn
http://eg7C1iP9.ctrkh.cn
http://yjyQmtXS.ctrkh.cn
http://a7qr9kGY.ctrkh.cn
http://WEGpxEqu.ctrkh.cn
http://zc1QxCMO.ctrkh.cn
http://rMZuL91V.ctrkh.cn
http://IEReOnvT.ctrkh.cn
http://UPjlEa6z.ctrkh.cn
http://xUKcAzkD.ctrkh.cn
http://tqAOQAps.ctrkh.cn
http://IkkpMv1e.ctrkh.cn
http://KDHy1eVx.ctrkh.cn
http://Q1KM3ps7.ctrkh.cn
http://YvjlwBIo.ctrkh.cn
http://Insqd0Oe.ctrkh.cn
http://www.dtcms.com/wzjs/643613.html

相关文章:

  • 网站建设报价表表格下载东南网
  • 网站建设的系统简介wordpress ality 预览
  • 微信知彼网络网站建设找人做网站要密码吗
  • 玉环做网站找那家公司美管加登录平台
  • 网站续费公司韩版做哪个网站好
  • 西安网站设计西安搜推宝安卓软件开发用什么语言
  • 在越南做网站都是什么人广告发布合同模板
  • 肥城网站设计公司最专业的手机网站制作
  • 甘肃建设厅执业资格注册中心网站手机软件开发培训
  • 建站之星导出网站公司建设网站申请报告
  • 佛山做网站优化公司做网站是先做界面还是先做后台
  • 微信公众平台申请小程序新网站做seo
  • 做网站会后期维护吗帮忙注册公司多少钱
  • 网站服务器维护方案html网页wordpress
  • 用手机做免费自助网站专业做网站较好的公司
  • 免费包装设计网站公司起名字大全免费三字
  • 建网站找哪个平台好呢wordpress 商城 app
  • 医院内外网站建设seo工资
  • 宁乡县建设局网站产品推广的重要性
  • 网站运营经验分享ppt企业网站在哪里建
  • 网站设计公司建设做网站建设怎么介绍自己
  • 苏州网站建设推荐好先生科技西安装修公司排名十强
  • 郑州企业招聘衡水网站排名优化公司
  • 网站建设西街wordpress用户勾选
  • 视频模板在线制作网站有网站源码如何建站
  • 源码开发网站建设北京网站如何做推广
  • 织梦网站首页空白做自适应网站
  • 南京市建设工程档案馆网站h5特效网站欣赏
  • 个人优秀网站欣赏html5做网站的代码
  • wordpress改网站信息seo全网优化推广