• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号
您的位置:首页 > 程序设计 >C#教程 > C#中异步Socket通信编程代码实例

C#中异步Socket通信编程代码实例

作者: 字体:[增加 减小] 来源:互联网 时间:2017-05-28

通过本文主要向大家介绍了c#socket异步通信实例,c#socket异步通信,c#异步socket,c#中socket异步通信,c#socket通信实例等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com

本文将在C#中Socket同步通信的基础上,分析和研究Socket异步编程的实现方法,目的是深入了解Socket编程的基本原理,增强对网络游戏开发相关内容的认识。

什么是Socket编程的异步是实现

所谓Socket编程的异步实现是指按照异步过程来实现Socket编程,那么什么是异步过程呢,我们把在完成了一次调用后通过状态、通知和回调来告知调用者的方式成为异步过程,换句话说,在异步过程中当调用一个方法时,调用者并不能够立刻得到结果,只有当这个方法调用完毕后调用者才能获得调用结果。这样做的好处是什么呢?答案是高效。相信大家还记得我们在《C#中Socket通信编程的同步实现》这篇文章中使用多线程来实现简单聊天的案例吧,在这个案例中我们需要开启两个线程来不断监听客户端的连接和客户端的消息,这样的效率肯定是很低的。那么现在好了,我们可以通过异步过程来解决这个问题,下面我们就来看看如何实现Socket的异步通信。

如何实现Socket异步通信

服务端

基本流程

1.创建套接字
2.绑定套接字的IP和端口号——Bind()
3.使套接字处于监听状态等待客户端的连接请求——Listen()
4.当请求到来后,使用BeginAccept()和EndAccept()方法接受请求,返回新的套接字
5.使用BeginSend()/EndSend和BeginReceive()/EndReceive()两组方法与客户端进行收发通信
6.返回,再次等待新的连接请求
7.关闭套接字

代码示例

using System;
using System.Collections.Generic;
using System.Text;
using System.Net;
using System.Net.Sockets;

namespace AsyncServer
{
  public class AsyncTCPServer
  {
    public void Start()
    {
      //创建套接字
      IPEndPoint ipe = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 6065);
      Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
      //绑定端口和IP
      socket.Bind(ipe);
      //设置监听
      socket.Listen(10);
      //连接客户端
      AsyncAccept(socket);
    }

    /// <summary>
    /// 连接到客户端
    /// </summary>
    /// <param name="socket"></param>
    private void AsyncAccept(Socket socket)
    {
      socket.BeginAccept(asyncResult =>
      {
        //获取客户端套接字
        Socket client = socket.EndAccept(asyncResult);
        Console.WriteLine(string.Format("客户端{0}请求连接...", client.RemoteEndPoint));
        AsyncSend(client, "服务器收到连接请求");
        AsyncSend(client, string.Format("欢迎你{0}",client.RemoteEndPoint));
        AsyncReveive(client);
      }, null);
    }

    /// <summary>
    /// 接收消息
    /// </summary>
    /// <param name="client"></param>
    private void AsyncReveive(Socket socket)
    {
      byte[] data = new byte[1024];
      try
      {
        //开始接收消息
        socket.BeginReceive(data, 0, data.Length, SocketFlags.None,
        asyncResult =>
        {
          int length = socket.EndReceive(asyncResult);
          Console.WriteLine(string.Format("客户端发送消息:{0}", Encoding.UTF8.GetString(data)));
        }, null);
      }
      catch (Exception ex)
      {
        Console.WriteLine(ex.Message);
      }
    }

    /// <summary>
    /// 发送消息
    /// </summary>
    /// <param name="client"></param>
    /// <param name="p"></param>
    private void AsyncSend(Socket client, string p)
    {
      if (client == null || p == string.Empty) return;
      //数据转码
      byte[] data = new byte[1024];
      data = Encoding.UTF8.GetBytes(p);
      try
      {
        //开始发送消息
        client.BeginSend(data, 0, data.Length, SocketFlags.None, asyncResult =>
        {
          //完成消息发送
          int length = client.EndSend(asyncResult);
          //输出消息
          Console.WriteLine(string.Format("服务器发出消息:{0}", p));
        }, null);
      }
      catch (Exception e)
      {
        Console.WriteLine(e.Message);
      }
    }
  }
}

</div>

客户端

基本流程

1.创建套接字并保证与服务器的端口一致
2.使用BeginConnect()和EndConnect()这组方法向服务端发送连接请求
3.使用BeginSend()/EndSend和BeginReceive()/EndReceive()两组方法与服务端进行收发通信
4.关闭套接字

代码示例

using System;
using System.Collections.Generic;
using System.Text;
using System.Net;
using System.Net.Sockets;

namespace AsyncClient
{
  public class AsyncTCPClient
  {
    /// <summary>
    /// 连接到服务器
    /// </summary>
    public void AsynConnect()
    {
      //端口及IP
      IPEndPoint ipe = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 6065);
      //创建套接字
      Socket client = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
      //开始连接到服务器
      client.BeginConnect(ipe, asyncResult =>
      {
        client.EndConnect(asyncResult);
        //向服务器发送消息
        AsynSend(client,"你好我是客户端");
        AsynSend(client, "第一条消息");
        AsynSend(client, "第二条消息");
        //接受消息
        AsynRecive(client);
      }, null);
    }

    /// <summary>
    /// 发送消息
    /// </summary>
    /// <param name="socket"></param>
    /// <param name="message"></param>
    public void AsynSend(Socket socket, string message)
    {
      if (socket == null || message == string.Empty) return;
      //编码
      byte[] data = Encoding.UTF8.GetBytes(message);
      try
      {
        socket.BeginSend(data, 0, data.Length, SocketFlags.None, asyncResult =>
        {
          //完成发送消息
          int length = socket.EndSend(asyncResult);
          Console.WriteLine(string.Format("客户端发送消息:{0}", message));
        }, null);
      }
      catch (Exception ex)
      {
        Console.WriteLine("异常信息:{0}", ex.Message);
      }
    }

    /// <summary>
    /// 接收消息
    /// </summary>
    /// <param name="socket"></param>
    public void AsynRecive(Socket socket)
    {
      byte[] data = new byte[1024];
      try
      {
        //开始接收数据
        socket.BeginReceive(data, 0, data.Length, SocketFlags.None,
        asyncResult =>
        {
          int length = socket.EndReceive(asyncResult);
          Console.WriteLine(string.Format("收到服务器消息:{0}", Encoding.UTF8.GetString(data)));
          AsynRecive(socket);
        }, null);
      }
      catch (Exception ex)
      {
        Console.WriteLine("异常信息:", ex.Message);
      }
    }
  }
}

</div>


从总体上来讲Socket异步编程的逻辑性更加明确了,因为我们只需要为每一个过程写好回调函数就好了。那么这个示例的效果如何呢?我们来看看它的演示效果:

总结

和Socket同步编程的案例相比,今天的这个案例可能只是对Socket异步编程内容的一个简单应用,因为博主到现在为止都还没有写出一个可以进行交互聊天的程序来。在Socket的异步编程中,服务端不需要为一个客户端单独创建一个线程来维护其连接,可是这样带来的一个问题就是博主不知道该如何实现一个多客户端的异步编程的实例。如果有朋友知道如何实现的话,还希望能够告诉我,毕竟学习就是一个相互促进的过程啊。好了,最后想说的是博主这段时间研究Socket异步编程中关于异步方法调用的写法问题。我们知道Socket异步编程中的方法是成对出现的,每一个方法都有一个回调函数,对于回调函数,这里有两种写法,以BeginConnect方法为例:

m_Socket.BeginConnect(this.m_ipEndPoint,
        new AsyncCallback(this.ConnectCallBack),
        this.m

分享到:QQ空间新浪微博腾讯微博微信百度贴吧QQ好友复制网址打印

您可能想查找下面的文章:

  • C#使用系统方法发送异步邮件完整实例
  • C#异步委托调用实例分析
  • C#中异步Socket通信编程代码实例
  • C# Socket网络编程实例
  • C#基础之异步调用实例教程
  • C#之Socket操作类实例解析
  • C#同步、异步远程下载文件实例
  • C#同步和异步调用方法实例
  • 使用异步方式调用同步方法(实例详解)

相关文章

  • 2017-05-28一个状态机的实现
  • 2017-05-28C#实现把科学计数法(E)转化为正常数字值
  • 2017-05-28C#实现的字符串转MD5码函数实例
  • 2017-05-28完成OSS.Http底层HttpClient重构封装 支持标准库
  • 2017-05-28C#中数组初始化、反转和排序用法实例
  • 2017-05-28C#通过反射创建自定义泛型
  • 2017-05-28浅谈二叉查找树的集合总结分析
  • 2017-05-28为IObservable实现自己的运算符(详解)
  • 2017-05-28C#创建安全的栈(Stack)存储结构
  • 2017-05-28C# yield关键字详解

文章分类

  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号

最近更新的内容

    • c#对list排序示例
    • 深入多线程之:深入生产者、消费者队列分析
    • C# 泛型类(函数)的实例化小例子
    • 探讨如何用委托处理排序
    • C#实现ComboBox控件显示出多个数据源属性的方法
    • 解决C# winForm自定义鼠标样式的两种实现方法详解
    • 深入理解C# abstract和virtual关键字
    • 使用C#发送带附件的电子邮件的方法的代码示例分析
    • c#中SqlHelper封装SqlDataReader的方法
    • WinForm防止程序重复运行的方法分析

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有