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

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、运行效果
在这里插入图片描述

http://www.lryc.cn/news/416008.html

相关文章:

  • MTK联发科MT8766/MT8166安卓核心板性能参数对
  • ps绘制动图
  • AI学习指南机器学习篇-强化学习和深度学习简介
  • yolov8 bytetrack onnx模型推理
  • ImageNet数据集和CIFAR-10数据集
  • Go语言编程大全,web微服务数据库十大专题精讲
  • 【LabVIEW学习篇 - 13】:队列
  • 大语言模型综述泛读之Large Language Models: A Survey
  • 奇偶函数的性质及运算
  • 代码随想录 day 32 动态规划
  • 支持目标检测的框架有哪些
  • 原神自定义倒计时
  • top命令实时监测Linux进程
  • Rust 所有权
  • Python面试题:结合Python技术,如何使用PyTorch进行动态计算图构建
  • 基于RHEL7的服务器批量安装
  • C. Light Switches
  • LabVIEW机器人神经网络运动控制系统
  • Qt WebEngine播放DRM音视频
  • 渗透小游戏,各个关卡的渗透实例
  • SpringBoot集成阿里百炼大模型(初始demo) 原子的学习日记Day01
  • 高级java每日一道面试题-2024年8月06日-web篇-cookie,session,token有什么区别?
  • Python 图文:小白也能轻松生成精美 PDF 报告!
  • AQS的ReentrantLock源码
  • CSP-J 模拟题2
  • 途牛养车省养车平台源码 买卖新车租车二手车维修装潢共享O2O程序源码
  • 开发中遇到的gzuncompress,DomDocument等几个小问题以及一次Php上线碰到的502问题及php异常追踪
  • 【Material-UI】Button 组件中的基本按钮详解
  • 人工智能自动驾驶三维车道线检测—PersFormer模型代码详解
  • LangChain +Streamlit+ Llama :将对话式人工智能引入您的本地设备成为可能(上篇)