首页 > 编程语言 >c# 异步客户端服务器端

c# 异步客户端服务器端

时间:2024-07-18 09:53:37浏览次数:18  
标签:异步 服务器端 c# ar ReceiveCallBack 接收 clientSocket 客户端

服 客 发➡️收 收⬅️循环发

while(true)
{
     string sendStr="你好我是客户端";
     Console.Write(sendStr);
     ClientSocket.Send(Encoding.UTF8.GetBytes(sendStr));
}
服务端给多个客户端发送消息 服 客 发➡️收 循环收⬅️发 异步的时候开始还是先发送给客户端一条消息问声好,然后接收消息时再开启异步。 那怎么进行一个持续不断的接收呢?通过socket类里的BeginReceive()异步进行一个接收。 让服务器端可以和多个客户端进行连接,然后处理每一个客户端的请求。 就是将Accept()修改为BeginAccept(),这里也要改成异步连接的方式,才能多连客户端,而不是一个客户端。
static void Main()
{
    StartAsnyc(); 
}
static void StartAsnyc()
{
    //Socket clientSocket=ServerSocket.Accept();//这也会等待,等待客户端连接过来程序才继续,没有客户端连过来就继续等待。
    serverSocket.BeginAccept(AcceptCallBack,serverSocket);//BeginAccept开始进行异步连接的接收,等待客户端的连接
            
    byte[] dataBuffer=new byte[1024]; 
    //因为这个是调用异步,所以不会影响下面代码执行的。
    clientSocket.BeginReceive(dataBuffer,0,1024,SocketFlags.None,ReceiveCallBack,clientSocket);
}
static void AcceptCallBack(IAsyncResult ar)
{
    //当我们接收到一个客户端连接的时候应该怎么处理呢?
    //我们要给这个客户端发起一个监听
    //当我们接收到一个客户端连接的时候,要得到客户端的socket,BeginAccept是等待客户端连接,监听那要用到EndAccept()就可以接收客户端的连接
    Socket serverSocket = ar.AsyncState as Socket;
    Socket clientSocket = serverSocket.EndAccept(ar);
    //向客户端发送一条消息
    string SendInfo = "你好我是服务端";
    byte[] SendData = Encoding.UTF8.GetBytes(SendInfo);
    ClientDocket.Send(SendData);
    
    clientSocket.BeginReceive(dataBuffer,0,1024,SocketFlags.None,ReceiveCallBack,clientSocket);
}

static byte[] dataBuffer=new byte[1024];
static void ReceiveCallBack(IAsyncResult ar) 
{
    ///当接收到一条消息应该怎么做呢?就直接把这个消息打印出来。需要通过ClientSocket完成接收
    ///(BeginReceive是开始接收,这里还有一个对应的方法EndReceive表示结束接收,通过EndReceive可以知道接收了多少条/个数据)
    //这里我们把clientSocket当做一个参数传到这个回调方法里边,然后通过ar里边的AsyncState去获取到socket
    Socket clientSocket = ar.AsyncState as Socket;
    //接下来调用EndReceive来完成数据的接收
    //我们调用完BeginReceive()之后,这个方法并不会立即调用,只表示开始监听客户端数据的一个传递,当它接收到客户端的数据后,才会调用回调函数ReceiveCallBack()
    int count = clientSocket.EndReceive(ar);//当客户端关闭,这里没办法接收就会报错。 
    string msg=Encoding.UTF8.GetString(dataBuffer,0,count);
    Console.WriteLine("从客户端接收数据"+msg);
    //ReceiveCallBack只能完成一条数据的接收,在ReceiveCallBack处理完接收的消息之后,想要持续不断的接收就还得再继续调用一下异步,形成一个圈,接收到数据就输出到控制台,接受到数……
    clientSocket.BeginReceive(dataBuffer,0,1024,SocketFlags.None,ReceiveCallBack,clientSocket);
}

  

标签:异步,服务器端,c#,ar,ReceiveCallBack,接收,clientSocket,客户端
From: https://www.cnblogs.com/siki2017/p/18308789

相关文章

  • 使用 Vue 和 ECharts 打造动态数据可视化图表
    使用Vue和ECharts打造动态数据可视化图表大家好,今天我们来聊聊如何使用Vue和ECharts来创建动态数据可视化图表。Vue是一个渐进式的JavaScript框架,非常适合构建用户界面。而ECharts是一个强大的开源图表库,能够帮助我们轻松创建各种类型的图表。将这两者结合起来,我们......
  • 深入探讨 Vue 3 中的 `ref` 和 `reactive`:你需要知道的一切
    深入探讨Vue3中的ref和reactive:你需要知道的一切在Vue3中,响应式系统是其核心特性之一。它使得数据和视图能够自动同步更新,从而简化了开发过程。在这个系统中,ref和reactive是两个非常重要的API。虽然它们都用于创建响应式数据,但它们的使用场景和工作原理却有所不同。......
  • 如何在 Vue 和 JavaScript 中截取视频任意帧图片
    如何在Vue和JavaScript中截取视频任意帧图片大家好!今天我们来聊聊如何在Vue和JavaScript中截取视频的任意一帧图片。这个功能在很多场景下都非常有用,比如视频编辑、视频预览等。本文将带你一步步实现这个功能,并且会提供详细的代码示例。准备工作首先,我们需要一个Vue......
  • 深度解析:React 与 Vue.js 的相似性与差异性
    深度解析:React与Vue.js的相似性与差异性在现代前端开发中,React和Vue.js是两大热门的JavaScript框架。它们都旨在简化用户界面的开发,但在实现方式和设计理念上存在显著差异。本文将深入探讨React和Vue.js的相似性与差异性,并通过代码示例来帮助你更好地理解它们。相似......
  • 【CAN通讯系列3】如何学习CAN通讯?
    对于汽车行业从业者,如何学习CAN通讯,最重要的是取决于你的岗位职责。一方面岗位职责的定义决定你所能获得的资源,另一方面敢岗位职责基本框定了你所使用的CAN通讯内容范围。比如你不是做底层软件开发,那么你很难切身地深入理解CAN通讯的控制流和数据流,因为你没法像底层软件工程师......
  • 【CAN通讯系列2】与CAN通讯的故事
    3年前在知乎撰写很多CAN通讯相关的文章,那时主要偏于软件视角,反馈还不错。3年过去了,随着系统与软件的增加,对CAN通讯的认识有所加深,那就在此基础上,重新更新一个CAN通讯系列文章。先从我与CAN通讯的故事说起:1初始CAN通讯最初接触CAN通讯,那时刚工作,在主机厂的研发部门,经常需要......
  • C. Jellyfish and Green Apple
    原题链接题解1.由于是除二操作,所以最后的平均数一定能表示成\(k_1\cdot\frac{1}{2^{i_1}}+...+k_t\cdot\frac{1}{2^{i_t}}\)的形式2.最小的\(\frac{1}{2^i}\)由于没有往下再分,所以数量一定是偶数,把他们的数量除二加到\(\frac{1}{2^{i-1}}\)上,此时\(i-1\)就变最小的了......
  • CSS总结
    目录1.引入规则1.1行内样式1.2内联样式1.3外部样式2.css选择器2.1基本选择器2.2关系选择器2.3属性选择器2.4复合选择器2.5伪类选择器2.5.1超链接伪类2.5.2表单伪类2.5.3结构伪类2.6伪元素选择器3.css样式3.1背景样式3.2字体样式3.3列表样式3.4内外边距3.5......
  • 【OCPP】ocpp1.6协议第5.5章节Clear Charging Profile的介绍及翻译
    目录5.5清除充电配置ClearChargingProfile-概述ClearChargingProfile请求ClearChargingProfile响应操作流程适用场景5.5清除充电配置ClearChargingProfile-原文译文5.5清除充电配置ClearChargingProfile-概述OCPP1.6协议中的第5.5章节主要讲的是“Cl......
  • 【OCPP】ocpp1.6协议第5.3章节Change Configuration的介绍及翻译
    目录5.3更改配置Changeconfiguration-概述ChangeConfigurationOperation1.概要2.ChangeConfiguration请求3.ChangeConfiguration响应4.流程说明状态说明举例总结5.3更改配置Changeconfiguration-原文译文5.3更改配置Changeconfiguration-概述在OC......