C# socket异步通信服务器和客户端

2023-11-14

        本文章向大家介绍C# socket异步通信服务器和客户端,主要包括C# socket异步通信服务器和客户端使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

服务器代码

只要客户端连接进来就会接收到Server received data

using System;
using System.Text;
using System.Net.Sockets;
using System.Net;

class Program
{
    /// <summary>
    /// 缓存接受的数据的byte数组
    /// </summary>
    private static byte[] buffer = new byte[1024];

    private static int connectCount = 0;

    static void Main(string[] args)
    {
        //服务器需要绑定的IP和端口号
        IPEndPoint ed = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 7788);
        //创建一个新的Tcp协议的Socket对象
        Socket Server = new Socket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp);
        //服务器绑定该端口号和ip地址
        Server.Bind(ed);
        //设置该服务器至多只能监听十个客户端
        Server.Listen(10);
        //异步接收客户端
        Server.BeginAccept(new AsyncCallback(ClienAppcet), Server);
        Console.ReadKey();
    }


    private static void ClienAppcet(IAsyncResult ar)
    {
        //每当连接进来的客户端数量增加时链接数量自增1
        connectCount++;
        //服务端对象获取
        Socket ServerSocket = ar.AsyncState as Socket; 
        if (null != ServerSocket)
        {
            //得到接受进来的socket客户端
            Socket client = ServerSocket.EndAccept(ar);
            Console.WriteLine("第" + connectCount + "连接进来了");
            //开始异步接收客户端数据
            client.BeginReceive(buffer, 0, buffer.Length, SocketFlags.None, new AsyncCallback(ReceiveMessage), client);
        }
        if (null != ServerSocket)
        {
            //通过递归来不停的接收客户端的连接
            ServerSocket.BeginAccept(new AsyncCallback(ClienAppcet), ServerSocket);
        }       
     }


    private static void ReceiveMessage(IAsyncResult ar)
    {
        Socket client = ar.AsyncState as Socket; //客户端对象
        if (client != null)
        {
            IPEndPoint clientipe = (IPEndPoint)client.RemoteEndPoint;
            try
            {
                int length = client.EndReceive(ar);

                string message = Encoding.UTF8.GetString(buffer, 0, length);
                WriteLine(clientipe + " :" + message, ConsoleColor.White);
                //服务器给客户端发送消息表示已经连接上
                client.Send(Encoding.UTF8.GetBytes("Server received data"));
                //通过递归不停的接收该客户端的消息
                client.BeginReceive(buffer, 0, buffer.Length, SocketFlags.None, new AsyncCallback(ReceiveMessage), client);
            }
            catch (Exception)
            {
                //设置计数器
                connectCount--;
                //断开连接
                WriteLine(clientipe + " is disconnected,total connects " + (connectCount), ConsoleColor.Red);
            }
        }
    }


    public static void WriteLine(string str, ConsoleColor color)
    {
        Console.ForegroundColor = color;

        Console.WriteLine("[{0:MM-dd HH:mm:ss}] {1}", DateTime.Now, str);
    }
}

客户端代码

只要连接进来就能够打字给服务器发送消息

using System;
using System.Net.Sockets;
using System.Text;


public class Program
{
    private static readonly byte[] Buffer = new byte[1024];

    private static void Main()
    {
        try
        {
            Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
            //链接服务器的端口号和ip地址
            socket.Connect("127.0.0.1", 7788);
            WriteLine("Client: Connect to server success!", ConsoleColor.White);

            //开始异步接收服务器得到的消息
            socket.BeginReceive(Buffer, 0, Buffer.Length, SocketFlags.None, new AsyncCallback(ReceiveMessage), socket);

            //只要客户端一直开着就能不停的往服务器发送消息
            while (true)
            {
                var message = Console.ReadLine();
                if (message != null)
                {
                    var outputBuffer = Encoding.UTF8.GetBytes(message);
                    //异步发送消息
                    socket.BeginSend(outputBuffer, 0, outputBuffer.Length, SocketFlags.None, null, null);
                }
            }
        }
        catch (Exception ex)
        {
            WriteLine("Client: Error " + ex.Message, ConsoleColor.Red);
        }
        finally
        {
            Console.Read();
        }
    }


    // 接收信息
    public static void ReceiveMessage(IAsyncResult ar)
    {
        try
        {
            var socket = ar.AsyncState as Socket;

            //方法参考:
            if (socket != null)
            {
                int length = socket.EndReceive(ar);
                string message = Encoding.ASCII.GetString(Buffer, 0, length);
                WriteLine(message, ConsoleColor.White);
            }

            //接收下一个消息
            if (socket != null)
            {
                socket.BeginReceive(Buffer, 0, Buffer.Length, SocketFlags.None, new AsyncCallback(ReceiveMessage), socket);
            }
        }
        catch (Exception ex)
        {
            WriteLine(ex.Message, ConsoleColor.Red);
        }
    }


    public static void WriteLine(string str, ConsoleColor color)
    {
        Console.ForegroundColor = color;
        Console.WriteLine("[{0:MM-dd HH:mm:ss}] {1}", DateTime.Now, str);
    }
}

http://www.manongjc.com/article/61596.html

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C# socket异步通信服务器和客户端 的相关文章

  • latex解决×叉符号(乘符号)如何打

    简单实用 直接取走 times times
  • 抽样技术--不等概率抽样

    文章目录 不等概抽样 放回不等概抽样 只抽取一个样本单元的不等概抽样 估计量 有放回不等概整群抽样 两阶段有放回不等概抽样 多阶段有放回不等概抽样 不放回不等概抽样 两阶段不放回不等概抽样 不等概抽样 提高估计精度 放回的PPS抽样简化方差
  • 无重复字符的最长字串

    给定一个字符串 s 请你找出其中不含有重复字符的 最长子串 的长度 示例 1 输入 s abcabcbb 输出 3 解释 因为无重复字符的最长子串是 abc 所以其长度为 3 示例 2 输入 s bbbbb 输出 1 解释 因为无重复字符的
  • Zabbix监控服务详解+实战

    目录 一 监控体系概述 1 为什么需要监控 2 监控目标与流程 1 监控的目标 2 监控的流程 3 监控的对象 1 CPU监控 2 磁盘监控 3 内存监控 4 网络监控 5 系统重要进程监控 6 应用服务监控 7 硬件设备监控 8 安全监控
  • 【elasticsearch】memory locking requested for elasticsearch process but memory is not locked

    解决方法 开启bootstrap memory lock 修改文件 etc elasticsearch elasticsearch yml 上面那个报错就是开启后产生的 如果开启还要修改其它系统配置文件 bootstrap memory l
  • 【并发编程】Python多线程、多进程、多协程入门篇

    文章目录 1 基础概念 2 并发编程如何选择 2 1 CPU IO密集型计算 2 2 多线程 多进程 多协程对比 3 Python运行速度根因分析 3 1 速度慢两大原因 3 1 GIL 4 多线程 4 1 Python多线程基础爬虫 4

随机推荐

  • k8s ingress详解(1)

    ingress 是除了 hostport nodeport clusterIP以及云环境专有的负载均衡器外的访问方式 官方提供了Nginx ingress controller 通常情况下 service和pod的IP可以被集群网络访问 外
  • windows driver双机调试环境搭建,用windbg或者debug view查看内核调试输出

    本地环境 本地开发环境 win 10 visual studio installer 2022版 visual studio 2022 VMware player 目的 本地环境作为开发环境 VM作为测试和调试环境 用debug view查
  • PCB天线设计

    PCB天线概述 什么是PCB天线 顾名思义 就是在PCB上印制了一根走线 可以将其画成直线走线 反转的F形走线 蛇形或圆形走线等 长度为四分之一波长就基本可以形成天线 将电信号辐射出去或接收信号 设计指标 在上一期文章 深入解读无线通信中的
  • 二叉树建立

    结束二叉树输入 如何结束创建二叉树的输入那 把二叉树补全 前序 输入 AB C 中序 B A C 后序 B CA 输出结果如下 代码如下 include
  • 前端性能优化:7.页面渲染优化

    本文将主要关注浏览器获取到资源后 进行渲染部分的相关优化内容 7 1 页面渲染性能 页面渲染阶段对性能体验的应i昂与资源加载阶段同样重要 而对于设计高交互频次的应用来说可能更加重要 本节将整个渲染过程划分为五个串行阶段进行概述 优化渲染的实
  • 大众点评校招助理产品经理-笔试题分析(下)

    针对大众点评网的任何一个产品的一个需要改进的点 信息 数据或功能体验都行 给出你的分析和改进规划 希望尽可能的全面 深入 详细 1 改进产品版本与使用机型 使用版本 大众点评Android客户端V5 2版本 机型 HTC Desire HD
  • memset in C++ and C

    definition memset是计算机中C C 语言函数 将s所指向的某一块内存中的前n个 字节的内容全部设置为ch指定的ASCII值 第一个值为指定的内存地址 块的大小由第三个参数指定 这个函数通常为新申请的内存做初始化工作 其返回值
  • Failed to execute goal org.apache.maven.plugins:maven-checkstyle-plugin

    idea编译项目时 出现如下报错 ERROR Failed to execute goal org apache maven plugins maven checkstyle plugin 3 0 0 check validate on p
  • k8s学习笔记(二):k8s的组件介绍

    文章目录 k8s组件介绍 架构图 角色 控制平面组件 Control Plane Components kube apiserver 端口 容器 etcd 端口 容器 kube scheduler 容器 端口 kube controller
  • Postman脚本——断言测试

    pm对象提供了测试相关功能 pm test testName String specFunction Function Function 测试函数 pm expect assertion Function Assertion 允许在响应数据
  • [552]python实现聚类算法(6种算法)

    1 Mean shift 1 概述 Mean shift 即 均值迁移 的基本思想 在数据集中选定一个点 然后以这个点为圆心 r为半径 画一个圆 二维下是圆 求出这个点到所有点的向量的平均值 而圆心与向量均值的和为新的圆心 然后迭代此过程
  • AI炼丹技巧

    目录 样本不平衡 1 什么是样本不平衡问题 2 样本不平衡会对我们模型的训练带来哪些影响呢 3 在机器学习中解决样本不平衡问题有哪些通用的解决策略 4 在深度学习中 有哪些解决样本不平衡的方法 5 从模型评价指标的角度 重新审视训练好的模型
  • 计算机中丢失msvcp140.dll怎么解决?分享三个解决方法

    当我们在运行某些应用程序时 可能会遇到 缺少msvcp140 dll 或 找不到msvcp140 dll 的错误提示 这意味着我们的系统缺少这个重要的动态链接库文件 msvcp140 dll丢失会造成很多软件无法正常启动运行 下面小编就分享
  • 全网最全!Python爬虫requests库教程(附案例)

    1 requests 库简介 Requests 是一个为人类设计的简单而优雅的 HTTP 库 requests 库是一个原生的 HTTP 库 比 urllib3 库更为容易使用 requests 库发送原生的 HTTP 1 1 请求 无需手
  • 【MySQL高级篇笔记-性能分析工具的使用 (中) 】

    此笔记为尚硅谷MySQL高级篇部分内容 目录 一 数据库服务器的优化步骤 二 查看系统性能参数 三 统计SQL的查询成本 last query cost 四 定位执行慢的 SQL 慢查询日志 1 开启慢查询日志参数 2 查看慢查询数目 3
  • 常见的排序算法及其复杂度分析

    1 常见算法分类 十种常见排序算法一般分为以下几种 非线性时间比较类排序 交换类排序 快速排序和冒泡排序 插入类排序 简单插入排序和希尔排序 选择类排序 简单选择排序和堆排序 归并排序 二路归并排序和多路归并排序 线性时间非比较类排序 计数
  • 黑盒测试与白盒测试的区別

    黑盒测试与白盒测试是软件测试中两种不同的测试方法 它们的主要区别在于测试者对被测试软件的了解程度 下面 我们将详细介绍这两种测试方法的特点和适用场景 一 黑盒测试 黑盒测试又称为功能测试 是针对被测试软件的功能进行测试的一种测试方法 测试者
  • linux 进程几种状态,linux进程状态

    linux系统最常用的命令莫过于ps 经常要用其查看linux的进程和线程情况 此文我们着重来看进程 进程又分为以下几种状态 1 运行 正在运行或在运行队列中等待 2 中断 休眠中 受阻 在等待某个条件的形成或接受到信号 3 不可中断 收到
  • Kotlin Coroutines Flow 系列(一) Flow 基本使用

    一 Kotlin Flow 介绍 Flow 库是在 Kotlin Coroutines 1 3 2 发布之后新增的库 官方文档给予了一句话简单的介绍 Flow cold asynchronous stream with flow build
  • C# socket异步通信服务器和客户端

    本文章向大家介绍C socket异步通信服务器和客户端 主要包括C socket异步通信服务器和客户端使用实例 应用技巧 基本知识点总结和需要注意事项 具有一定的参考价值 需要的朋友可以参考一下 服务器代码 只要客户端连接进来就会接收到Se