TCP服务器的C#实现

news2024/11/15 15:52:08

1、TCP实现类

internal class TcpServer
    {
        public Socket ServerSocket { get; set; }
        public Dictionary<string,Socket> Sockets { get; set; }= new Dictionary<string,Socket>();
        public byte[] SendBuffer { get; set; }
        public byte[] ReceiveBuffer { get; set; }
        /// <summary>
        /// 创建构造函数
        /// </summary>
        /// <param name="sendBufferLength"></param>
        /// <param name="receiveBufferLength"></param>
        public TcpServer(int sendBufferLength, int receiveBufferLength)
        {
            SendBuffer = new byte[sendBufferLength];
            ReceiveBuffer = new byte[receiveBufferLength];
        }
        /// <summary>
        /// 启动服务器
        /// </summary>
        /// <param name="ip"></param>
        /// <param name="port"></param>
        public void Start(string ip, string port)
        {
            ServerSocket = CreateSocket(ip, port);
            CreateThread();
        }
        /// <summary>
        /// 服务端向指定客户端发送消息
        /// </summary>
        /// <param name="clientInfo"></param>
        /// <param name="data"></param>
        public void Send(string clientInfo, byte[] data)
        {
            Socket socket = Sockets[clientInfo];
            socket.Send(data);
        }
        /// <summary>
        /// 创建服务端Socket
        /// </summary>
        /// <param name="ip"></param>
        /// <param name="port"></param>
        /// <returns></returns>
        private Socket CreateSocket(string ip, string port)
        {
            Socket socket=new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
            IPAddress address=IPAddress.Parse(ip);
            IPEndPoint endPoint=new IPEndPoint(address, int.Parse(port));
            socket.Bind(endPoint);
            socket.Listen(20);
            return socket;
        }
        /// <summary>
        /// 创建监听客户端的线程并启动
        /// </summary>
        private void CreateThread()
        {
            Thread watchThread = new Thread(WatchConnection);
            watchThread.IsBackground = true;
            watchThread.Start();
        }
        /// <summary>
        /// 监听客户端请求
        /// </summary>
        private void WatchConnection()
        {
            while (true)
            {
                Socket clientSocket = null;
                try
                {
                    clientSocket = ServerSocket.Accept();
                    IPEndPoint endPoint = (IPEndPoint)clientSocket.RemoteEndPoint;
                    string ip= endPoint.Address.ToString();
                    string port= endPoint.Port.ToString();
                    Sockets.Add(ip + ":" + port, clientSocket);

                }
                catch (Exception ex)
                {
                    Console.WriteLine(ex.ToString());
                    break;
                }
                ParameterizedThreadStart pts = new ParameterizedThreadStart(ClientReceiver);
                Thread clientThread = new Thread(pts);
                clientThread.IsBackground = true;
                clientThread.Start(clientSocket);
            }
        }
        /// <summary>
        /// 
        /// </summary>
        /// <param name="socket"></param>
        private void ClientReceiver(object socket)
        {
            Socket clientSocket=socket as Socket;
            int ReceiveBufferSize = 1 * 1024;
            while (true)
            {
                int receivedLength = 0;
                byte[] buffer = new byte[ReceiveBufferSize];
                try
                {
                    List<byte> ls = new List<byte>();
                    if (clientSocket != null)
                    {
                        receivedLength = clientSocket.Receive(buffer);
                        if (receivedLength > 0)
                        {
                            Buffer.BlockCopy(buffer,0, ReceiveBuffer, 0, receivedLength);
                            string msg = "Receive Success " + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");
                            byte[] datas = System.Text.Encoding.UTF8.GetBytes(msg);
                            clientSocket.Send(datas);
                        }
                    }
                }catch(Exception ex)
                {
                    Console.WriteLine(ex.ToString());
                    break;
                }
            }
        }
    }

2、页面布局

<Grid Margin="10">
        <Grid.RowDefinitions>
            <RowDefinition Height="50"/>
            <RowDefinition Height="50"/>
            <RowDefinition Height="50"/>
            <RowDefinition Height="*"/>
            <RowDefinition Height="50"/>
            <RowDefinition Height="50"/>
        </Grid.RowDefinitions>
        <TextBlock Grid.Row="0" Text="配置" VerticalAlignment="Center"/>
        <DockPanel Grid.Row="1">
            <DockPanel HorizontalAlignment="Left">
                <TextBlock Text="地址" VerticalAlignment="Center" Margin="20 0 10 0"/>
                <TextBox x:Name="TextBoxIp" Text="" Width="100" Height="36" VerticalContentAlignment="Center"/>
                <TextBlock Text="端口" VerticalAlignment="Center" Margin="20 0 10 0"/>
                <TextBox x:Name="TextBoxport" Text="" Width="100" Height="36" VerticalContentAlignment="Center"/>
                <Button x:Name="ButtonStart" Content="启动" Width="75" Height="36" Margin="20,0,10,0" Click="ButtonStart_Click"/>
            </DockPanel>
            <DockPanel HorizontalAlignment="Right">
                <TextBlock Text="客户端" VerticalAlignment="Center" Margin="20 0 10 0"/>
                <ComboBox x:Name="ComboBoxClient" SelectedValuePath="Key" DisplayMemberPath="Key" Width="200" Height="36" Margin="20 0 10 0" SelectionChanged="ComboBoxClient_SelectionChanged"/>
            </DockPanel>
        </DockPanel>
        <TextBlock Grid.Row="2" Text="接收" VerticalAlignment="Center"/>
        <TextBox Grid.Row="3" Name="TextBoxReciver" Text=""/>
        <TextBlock Grid.Row="4" Text="发送" VerticalAlignment="Center"/>
        <StackPanel Grid.Row="5" Orientation="Horizontal">
            <TextBox x:Name="TextBoxSender" Text="" Width="650" Height="36"/>
            <Button Content="发送" Click="ButtonSend_CLick" Width="75" Height="36" HorizontalAlignment="Right" Margin="10 0 20 0"/>
        </StackPanel>
    </Grid>

3、后台代码

TcpServer tcpServer= null;
        public MainWindow()
        {
            InitializeComponent();
            tcpServer = new TcpServer(2 * 1024, 2 * 1024);
            TextBoxIp.Text = "10.11.10.44";
            TextBoxport.Text = "8080";
        }

        private void ButtonStart_Click(object sender, RoutedEventArgs e)
        {
            string address = this.TextBoxIp.Text;
            string[] arr= address.Split('.');
            if (arr.Length == 4)
            {
                foreach(string item in arr)
                {
                    int i=int.Parse(item);
                    if(i < 0 || i > 255)
                    {
                        return;
                    }
                }
            }
            string port = this.TextBoxport.Text;
            int j= int.Parse(port);
            if (j < 0)
            {
                return;
            }
            ComboBoxClient.ItemsSource = tcpServer.Sockets;
            tcpServer.Start(address, port);
        }
        string currentClient = null;
        private void ComboBoxClient_SelectionChanged(object sender, SelectionChangedEventArgs e)
        {
            //currentClient = ComboBoxClient.SelectedValue.ToString();
            ComboBox comboBox = sender as ComboBox;
            string str = comboBox.SelectedValue.ToString();
            if (tcpServer.Sockets.ContainsKey(str))
            {
                currentClient = str;
            }
        }

        private void ButtonSend_CLick(object sender, RoutedEventArgs e)
        {
            if (currentClient != null)
            {
                string str = TextBoxSender.Text;
                byte[] bytes=System.Text.Encoding.UTF8.GetBytes(str);
                tcpServer.Send(currentClient,bytes);
            }
        }

4、运行结果
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/689155.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Qt消息对话框

一、头文件及类型 #include<QMessageBox> 二、错误、信息、提示、警告演示 错误对话框 QMessageBox::critical(this,"critical","错误"); 信息对话框 QMessageBox::information(this,"info","信息"); 提问对话框 if(QMessageBo…

发布自己的第一个抖音小程序

结构与微信小程序一样 内嵌H5网页&#xff0c;适用于任何平台&#xff0c;同样也是使用web-view组件 <web-view src"https://some-domain/some/path"></web-view> 相比起来&#xff0c;它比微信小程序更加简化&#xff0c;开发会更方便了。 API查询地…

超越Java 7,迎接Java 8时代!掌握这些新特性提升你的编程技能!

大家好&#xff0c;我是小米&#xff0c;一个热衷于技术分享的小伙伴。今天&#xff0c;我将向大家介绍Java 8中的一些新特性。Java 8作为一次重大更新&#xff0c;引入了许多令人激动的新功能&#xff0c;让我们的编码变得更加简洁高效。接下来&#xff0c;我们将详细介绍这些…

【暂时解决】radio单选框的change事件执行两次

项目场景&#xff1a; 简单的单选框场景 选择国内地区&#xff0c;省市县的下拉框就显示&#xff0c;选择国外地区就隐藏。 问题描述 当我使用radio的change事件时&#xff0c;会执行两次 javascript&#xff1a; $(input[typeradio][nameoptionsRadios]).change(function …

黑产科普丨揭秘游戏黑灰产业链

自今年起&#xff0c;游戏版号已恢复常态化发放&#xff0c;游戏行业在官方发文肯定、重获资本青睐、AI降本增效等多方助力下持续回暖。暑期档将至&#xff0c;游戏厂商为了抢占更多的市场份额&#xff0c;占据更多的玩家视野&#xff0c;将有大量的游戏选择在这个时间上线。 …

datax-Oracle新增writeMode支持

1.在com.alibaba.datax.plugin.writer.oraclewriter.OracleWriter中注释此内容,以让oracle支持writeMode模式 2.在com.alibaba.datax.plugin.rdbms.writer.util.WriterUtil中,增加对oracle的判断,将getWriteTemplate修改为如下内容 public static String getWriteTemplate(List…

在文件夹中获取某个文件的绝对路径

#!/bin/bash -lpathfind $(pwd) -name *.ipaecho ${path}写成下面这样也是可以的 path$(find $(pwd) -name *.ipa)如图所示&#xff0c;Export 文件夹下有.ipa文件&#xff0c;我们目前想获取.ipa文件的绝对路径 执行结果如下 192:Jenkins liubo$ cd /Users/liubo/Desktop/…

C# 通过委托实现多个窗口之间的传值

之前用qt写的时候&#xff0c;都有信号和槽来实现&#xff0c;用C#的话应该也有类似的 大概实现的是我在父窗口当中new了两个子窗口&#xff0c;这个两个子窗口都可以将处理完的数据传递给父窗口&#xff0c;并且两个子窗口通过父窗口进行通信。 我这就按上面窗口名称来说明代…

pipeline实现二次还原

通过mode参数确定是否发布还是回滚&#xff0c;在满足rollback条件下&#xff0c;列举出我们的所有的备份的目录&#xff0c;根据回滚条件选择索要回滚的目录(目录是根据时间戳来判断创建的文件) pipeline {agent anyparameters {choice(name: mode, choices: [deploy,rollbac…

HA 自动化-通知提醒

配置->场景自动化->创建自动化 notify.notify

Gitlab群组及项目仓库搭建

1、新建群组 2、新建项目 3、克隆到Visualstudio 复制克隆地址&#xff0c;克隆到本地 这里会让你登录账号 可以添加成员并邀请ta进项目组 从已注册用户列表中选择 4、Git工作流 回顾一下Git工作流&#xff0c;工程人员只需要从Develop分支新建自己的分支即可。分支命名以姓名…

设计模式学习之抽象工厂模式

设计模式系列往期文章 设计模式学习之策略模式设计模式学习之策略模式在前端的应用设计模式学习之简单工厂模式设计模式学习之工厂方法模式 如果你已经理解了工厂方法模式&#xff0c;那你能够很快的明白抽象工厂模式。 温习&#xff1a;什么是工厂方法模式 我们先温习一下…

【面试题19】B-Tree和B+Tree的区别,以及B+Tree在MySQL中的应用

文章目录 一、前言二、关于B-Tree和B Tree2.1 B-Tree2.2 BTree 三、B Tree与B Tree的差异3.1 叶子节点的差异3.2 数据访问的差异3.3 范围查询的差异 四、Mysql中BTree的应用场景4.1 主键索引4.2 唯一索引4.3 普通索引 五、MySQL为什么使用BTree来做索引&#xff1f;总结 一、前…

【网络安全】IP地址定位技术的应用场景

随着科技的不断发展&#xff0c;网络空间已经成为人们生活中重要的一部分。而其中&#xff0c;IP地址定位技术又是网络空间不可或缺的一部分。IP地址定位技术是一种可以根据IP地址确定用户位置的技术这项技术不仅可以用于个人定位&#xff0c;也可以使用在商业领域、网络安全和…

【新星计划·2023】认识和学习BASH(一)

作者&#xff1a;Insist-- 个人主页&#xff1a;insist--个人主页 作者会持续更新网络知识和python基础知识&#xff0c;期待你的关注 目录 一、认识BASH 1、硬件、核心与Shell ①硬件 ②核心管理 ③应用程序 2、为何要学文字接口的shell&#xff1f; 3、系统的合法shel…

学习AQS

面试的时候被问到AQS会不会一脸懵逼呢?今天来学习一下AQS吧! 看看这个听起来高大上又难以回答的东西到底是个啥? 1.什么是AQS JUC包中 的很多同步器如ReentrantLock、Semaphore、CountDownLatch等等都是有一些基础的共同的行为,比如:等待队列、条件队列、独占获取、共享…

IntelliJ IDEA - IDEA 如何快速生成 serialVersionUID?

问题描述 今天遇到序列化问题的时候&#xff0c;需要用到 serialVersionUID 字段&#xff0c;如下。但是不知道如何快速自动生成这个&#xff0c;于是有了这篇博客&#xff0c;哈哈哈 private static final long serialVersionUID 6828716364537510652L; 解决方案 首先如图…

STM32F系列项目定时器配置-中断触发源详解

1.以高级定时器为例&#xff1a; 2.触发源选择与极性选择&#xff1a; 3.触发源介绍 (282条消息) 【STM32技巧】&#xff08;1&#xff09;STM32定时器8种触发源之ITR0~ITR3说明_stm32 定时器触发定时器_小石头有大内涵的博客-CSDN博客 ITR0内部触发0ITR1内部触发1ITR2内部触…

为什么ECB模式不安全\链接模式【密码学】(6)

目录 一、链接模式 二、ECB模式 三、链接模式缺失带来什么问题 一、链接模式 之前讲过&#xff0c;链接模式就是将是一个分组运算和下一个分组运算联系起来。 上一个分组运算的所有结果都有可能参与到下一个分组运算中&#xff1b;下一个分组运算的每一个要素&#xff0c…

Unity3d_shader_Transparency(解决透明材质物体重叠穿透问题)

解决两个透明材质物体穿透问题 【Unity】半透明なオブジェクトを綺麗に表示するシェーダを導入する - コガネブログ https://github.com/ewersp/Shaders https://github.com/ewersp/Shaders/blob/master/BetterTransparentDiffuse.shader // An improvement to the default …