C#使用Socket实现TCP服务器端
1、TCP服务器实现代码
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 PtLib.TcpServer
{public delegate void TcpReceivedEventHandler(TcpStateEventArgs args);public class TcpServer{#region 变量//接收委托public event TcpReceivedEventHandler TcpReceived;//服务器IPprivate string _ip = "127.0.0.1";//服务器端口号private int _port = 8080;//当前SocketSocket currentSocket = null;//当前线程Thread currentThread = null;//Socket字典public Dictionary<string,Socket> dictSocket = new Dictionary<string,Socket>();//线程字典public Dictionary<string,Thread> dictThread = new Dictionary<string,Thread>();//运行标志public bool isRun =false;//public bool isClientChanged = false;#endregion/// <summary>/// 构造函数/// </summary>/// <param name="ip"></param>/// <param name="port"></param>public TcpServer(string ip,int port){_ip = ip;_port = port;}/// <summary>/// 打开/// </summary>public void Open(){currentSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);IPEndPoint endPoint = new IPEndPoint(IPAddress.Parse(_ip), _port);currentSocket.Bind(endPoint);currentSocket.Listen(10);isRun = true;currentThread = new Thread(WatchConnect);currentThread.IsBackground = true;currentThread.Start();}/// <summary>/// 连接处理/// </summary>private void WatchConnect(){while (isRun){Socket connectSocket=currentSocket.Accept();dictSocket.Add(connectSocket.RemoteEndPoint.ToString(), connectSocket);isClientChanged = true;ParameterizedThreadStart pts = new ParameterizedThreadStart(Receiver);Thread thread = new Thread(pts);thread.IsBackground = true;thread.Start(connectSocket);dictThread.Add(connectSocket.RemoteEndPoint.ToString(), thread);}}/// <summary>/// 接收处理/// </summary>/// <param name="socketClientPara"></param>private void Receiver(object socketClientPara){Socket receiveSocket = socketClientPara as Socket;while(true){byte[] buffer = new byte[1024 * 1024];int length = -1;try{length = receiveSocket.Receive(buffer);}catch(SocketException ex){dictSocket.Remove(receiveSocket.RemoteEndPoint.ToString());dictThread.Remove(receiveSocket.RemoteEndPoint.ToString());isClientChanged = true;Console.WriteLine(ex.Message);break;}catch(Exception ex){Console.WriteLine(ex.Message);break;}if (length > 0){byte[] b = new byte[length];Buffer.BlockCopy(buffer, 0, b, 0, length);TcpStateEventArgs args = new TcpStateEventArgs();args.ip = receiveSocket.RemoteEndPoint.ToString();args.buffer = b;TcpReceived?.Invoke(args);}}}/// <summary>/// 发送/// </summary>/// <param name="ip"></param>/// <param name="data"></param>public void Send(string ip, byte[] data){dictSocket[ip].Send(data);}/// <summary>/// 关闭/// </summary>public void Close(){isRun = false;Thread.Sleep(1000);dictSocket.Clear();dictThread.Clear();if (currentSocket != null){currentSocket.Close();currentSocket = null;}if (currentThread.IsAlive){currentThread.Abort();}currentThread = null;}}/// <summary>/// Tcp状态事件参数类/// </summary>public class TcpStateEventArgs : EventArgs{public string ip;public byte[] buffer = null;}
}
2、应用程序
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;namespace TcpServer
{public partial class Form1 : Form{PtLib.TcpServer.TcpServer tcpServer= null;Timer timer=new Timer();/// <summary>/// 构造函数/// </summary>public Form1(){InitializeComponent();}private void Form1_Load(object sender, EventArgs e){timer.Interval = 1000;timer.Tick += Timer_Tick;timer.Start();}private void Timer_Tick(object sender, EventArgs e){if (tcpServer!=null && tcpServer.isClientChanged){List<string> list = new List<string>();foreach(var item in tcpServer.dictSocket.Keys){list.Add(item);}this.Invoke(new Action(() =>{cbbClientIps.DataSource = list;cbbClientIps.SelectedIndex = 0;}));tcpServer.isClientChanged = false;}}/// <summary>/// TCP服务器端打开或关闭/// </summary>/// <param name="sender"></param>/// <param name="e"></param>private void btServerSwitch_Click(object sender, EventArgs e){if(btServerSwitch.Text.Equals("打 开")){btServerSwitch.Text = "关 闭";string ip = tbServerIp.Text.Trim();int port = int.Parse(tbServerPort.Text.Trim());tcpServer = new PtLib.TcpServer.TcpServer(ip, port);tcpServer.Open();tcpServer.TcpReceived += TcpServer_TcpReceived;}else{btServerSwitch.Text = "打 开";tcpServer.TcpReceived -= TcpServer_TcpReceived;tcpServer.Close();}}private void TcpServer_TcpReceived(PtLib.TcpServer.TcpStateEventArgs args){string str = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss:fff")+":"+args.ip+",";str += Encoding.UTF8.GetString(args.buffer);this.Invoke(new Action(() =>{lbxReceive.Items.Add(str);}));}/// <summary>/// 数据发送/// </summary>/// <param name="sender"></param>/// <param name="e"></param>private void btnSend_Click(object sender, EventArgs e){string ip= cbbClientIps.SelectedItem.ToString();string str=tbSend.Text.Trim();byte[] sendBytes = Encoding.UTF8.GetBytes(str);tcpServer.Send(ip, sendBytes);}}
}
3、运行效果

相关文章:
C#使用Socket实现TCP服务器端
1、TCP服务器实现代码 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 PtLib.TcpServer {public delegate void Tcp…...
MTK联发科MT8766/MT8166安卓核心板性能参数对
MT8766核心板 采用联发科四核2G主频芯片方案,国内4G全网通。12nm先进工艺,支持 Android9.0系统。 GPU 采用超强 IMG GE8300 ,主频600MHz。支持高速LPDDR4/X,主频高达1600MHz。支持EMMC5.1。标配 WIFI 802.11 ac/abgn,BT 5.0。 支持…...
ps绘制动图
ps绘制动图教程(简易版)-直播gif动态效果图 第一步 打开ps绘制几个简单的长方形 第二步 将图层转化为智能图层 第三部 在窗口找到时间轴创建时间轴 第五步 通过变换来鼠标控制图像的变化并打下结束点 第六部 通过图像中的图像大小控制gif的大小 第七部 …...
AI学习指南机器学习篇-强化学习和深度学习简介
AI学习指南机器学习篇-强化学习和深度学习简介 强化学习和深度学习基本概念回顾 强化学习是一种机器学习方法,其目标是让智能体通过与环境的交互来学习最优的行为策略。在强化学习中,智能体不需要标记的训练数据,而是通过试错来提升自己的表…...
yolov8 bytetrack onnx模型推理
原文:yolov8 bytetrack onnx模型推理 - 知乎 (zhihu.com) 一、pt模型转onnx from ultralytics import YOLO# Load a model model YOLO(weights/yolov8s.pt) # load an official model # model YOLO(path/to/best.pt) # load a custom trained# Export the mod…...
ImageNet数据集和CIFAR-10数据集
一、为什么需要大量数据集 人工智能其实就是大数据的时代,无论是目标检测、图像分类、还是现在植入我们生活的推荐系统,“喂入”神经网络的数据越多,则识别效果越好、分类越准确。因此开源大型数据集的研究团队为人工智能的发展做了大量贡献…...
Go语言编程大全,web微服务数据库十大专题精讲
本课程主要从数据结构、Go Module 依赖管理、IO编程、数据库编程、消息队列、加密技术与网络安全、爬虫与反爬虫、web开发、微服务通用技术、Kitex框架等方面讲解~ 链接:https://pan.quark.cn/s/d65337a0e60d...
【LabVIEW学习篇 - 13】:队列
文章目录 队列 队列 队列通常情况下是一种先入先出(FIFO:First in First out)的数据结构,常用作数据缓存,通过队列结构可以保证数据有序的传递,避免竞争和冲突。 案例:利用队列,模…...
大语言模型综述泛读之Large Language Models: A Survey
摘要 这篇文章主要回顾了一些最突出的LLMs(GPT, LLaMA, PaLM)并讨论了它们的特点、贡献和局限性,就如何构建增强LLMs做了一个技术概述,然后调研了为LLM训练、微调和评估而准备的N多种流行数据集,审查了使用的LLM评价指标,在一组有代表性的基准上比较了几个流行的LLMs;最…...
奇偶函数的性质及运算
目录 定义 注意 特征 运算 拓展 定义 设函数f(x)的定义域D; 如果对于函数定义域D内的任意一个x,都有f(-x)-f(x),那么函数f(x)就叫做奇函数。如果对于函数定义域D内的任意一个x…...
代码随想录 day 32 动态规划
第九章 动态规划part01 今天正式开始动态规划! 理论基础 无论大家之前对动态规划学到什么程度,一定要先看 我讲的 动态规划理论基础。 如果没做过动态规划的题目,看我讲的理论基础,会有感觉 是不是简单题想复杂了? …...
支持目标检测的框架有哪些
目标检测是计算机视觉领域的一个重要任务,许多深度学习框架都提供了对目标检测的支持。以下是一些广泛使用的支持目标检测的深度学习框架: 1. TensorFlow TensorFlow 是一个广泛使用的开源深度学习框架,由Google开发。它提供了TensorFlow O…...
原神自定义倒计时
<!DOCTYPE html> <html lang"zh-CN"><head><meta charset"UTF-8"><title>原神倒计时</title><style>* {margin: 0;padding: 0;box-sizing: border-box;user-select: none;body {background: #0b1b2c;}}header {…...
top命令实时监测Linux进程
top命令可以动态实时显示Linux进程信息,方便观察频繁换进换出的内存的进程变化。 top命令执行示例如下: 其中,第一行表示系统当前时间、系统的运行时间、登录的用户数目、系统的平均负载(最近1分钟,最近5分钟ÿ…...
Rust 所有权
所有权 Rust的核心特性就是所有权所有程序在运行时都必须管理他们使用计算机内存的方式 有些语言有垃圾收集机制,在程序运行时,他们会不断地寻找不再使用的内存在其他语言中,程序员必须显式的分配和释放内存 Rust采用了第三种方式࿱…...
Python面试题:结合Python技术,如何使用PyTorch进行动态计算图构建
PyTorch 是一个流行的深度学习框架,它通过动态计算图(Dynamic Computation Graphs)来支持自动微分(Autograd)。动态计算图的特点是每次前向传播时都会构建新的计算图,这使得它非常灵活,适合处理…...
基于RHEL7的服务器批量安装
目录 一、项目要求 二、实验环境 三、生成kickstart自动化安装脚本 四、搭建dhcp服务并测试kickstart脚本 五、搭建pxe网络安装环境实现服务器自动部署 编辑 六、测试 一、项目要求 1.使用kickstart编写自动化安装脚本 2.搭建dhcp服务并测试kickstart脚本 3.搭建px…...
C. Light Switches
文章目录 C. Light Switches题意:解题思路:解题代码: C. Light Switches 原题链接 题意: 房间的灯最初均为关闭状态,安装芯片后,它会每隔k分钟改变一次房间的灯光状态,即会打开灯光k分钟&…...
LabVIEW机器人神经网络运动控制系统
LabVIEW机器人神经网络运动控制系统 介绍了如何使用LabVIEW软件和中枢模式发生器(CPG)神经网络实现对舵机驱动爬壁机器人的精准运动控制。通过结合仿生控制理念与高级程序设计,本项目旨在开发一种能自动完成复杂墙面移动任务的机器人。 项目背景 现代机器人技术中…...
Qt WebEngine播放DRM音视频
Qt WebEngine播放DRM受保护视频,前提是Qt WebEngine开启音视频编码器,能够支持网页上普通视频的播放。开启音视频编码器需要自己编译源码,这里不做介绍。 什么是DRM音视频 DRM视频是指数字版权管理(Digital Rights Management&a…...
PA100K数据集实战:从下载到结构化解析全流程
1. PA100K数据集初探:为什么选择它?如果你正在研究行人属性识别,PA100K绝对是个绕不开的宝藏数据集。这个数据集包含了10万张真实监控场景下的行人图像,每张图都标注了26种常见属性——从衣着风格(比如是否穿T恤、裙子…...
Vue3 图片标框功能实现方案
基于 Vue3 组合式 API 的图片标框(画框、标注、选框)完整实现,核心逻辑封装在 GetBoxes 组件里,复制就能用 一、功能说明 ✅ 在图片上鼠标拖拽画矩形框 ✅ 实时显示框坐标(x, y, width, height) ✅ 支持多…...
随机森林算法在儿童出行方式预测中的实战应用与优化
1. 项目概述:用随机森林预测孩子怎么上学做城市交通规划或者做家长接送方案的时候,你肯定想过一个问题:孩子们到底是怎么上学的?是走路、骑车、坐公交还是家长开车送?这个问题看似简单,背后却牵扯到城市规划…...
武汉国电华美16875kVA串联谐振试验装置,这手活儿细
在超高压变电站和长距离电缆的现场,交流耐压试验是检验设备绝缘的“最后一关”。这位老师傅经手过不少大工程,他说,面对GIS、大型变压器这些“大块头”电容性试品,能不能顺利“过关”,往往就看串联谐振装置顶不顶得住。…...
收藏干货|2026 版企业 AI 落地实操指南,程序员小白入门避坑必备
如今人工智能早已脱离概念炒作阶段,全面扎根企业实际业务场景,成为技术从业者与企业管理者无法回避的发展课题。各行各业都加速布局AI赛道,行业心态也从初期观望试探,彻底转变为实打实的落地攻坚。 不少企业高层主动牵头统筹AI规划…...
Jupyter Notebook里跑argparse脚本总报错?一个空列表参数搞定ipykernel_launcher.py error
Jupyter Notebook中argparse报错的终极解决方案:空列表参数实战解析在数据科学和机器学习的工作流中,Jupyter Notebook因其交互式特性成为众多研究者的首选工具。然而,当我们尝试在Notebook中运行那些原本为命令行设计的Python脚本时…...
别再只比参数了!从插件生态到中文优化,聊聊ChatGPT和文心一言的“隐形”差异
超越参数之争:ChatGPT与文心一言的生态与本土化实战解析 当技术评测文章还在反复比较模型参数量与发布时间时,真正影响日常工作效率的往往是那些未被量化的"软实力"。本文将从插件生态构建与中文场景优化两个维度,带您重新认识这两…...
告别多头对接!DMXAPI 为企业打造国产大模型 “统一入口”
一、企业 AI 落地的普遍痛点:被接口和平台消耗的成本在企业数字化转型的浪潮中,AI 大模型已经成为标配,但很多企业在落地时,都会陷入一个共同的困境:为了满足不同业务场景的需求,需要同时对接 DeepSeek、阿…...
Awoo Installer:让Switch游戏安装变得简单高效的终极解决方案
Awoo Installer:让Switch游戏安装变得简单高效的终极解决方案 【免费下载链接】Awoo-Installer A No-Bullshit NSP, NSZ, XCI, and XCZ Installer for Nintendo Switch 项目地址: https://gitcode.com/gh_mirrors/aw/Awoo-Installer 厌倦了繁琐的Switch游戏安…...
3分钟快速上手:bilibili-parse视频解析API终极指南
3分钟快速上手:bilibili-parse视频解析API终极指南 【免费下载链接】bilibili-parse bilibili Video API 项目地址: https://gitcode.com/gh_mirrors/bi/bilibili-parse bilibili-parse是一款高效专业的B站视频解析工具,为开发者和内容创作者提供…...
