• 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异步通信实例

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

kingmoon 通过本文主要向大家介绍了c语言32关键字详解,c语言链表详解,c语言指针详解,c语言题库及详解答案,c语言关键字详解等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com

TCPServer 

1、使用的通讯通道:socket

2、用到的基本功能:

①Bind,

②Listen,

③BeginAccept

④EndAccept

⑤BeginReceive 

⑥EndReceive

3、函数参数说明

 Socket listener = new Socket(AddressFamily.InterNetwork,

      SocketType.Stream, ProtocolType.Tcp);
</div>

新建socket所使用的参数均为系统预定义的量,直接选取使用。

listener.Bind(localEndPoint);
</div>

localEndPoint 表示一个定义完整的终端,包括IP和端口信息。

//new IPEndPoint(IPAddress,port)

//IPAdress.Parse("192.168.1.3")

listener.Listen(100);
</div>

监听

  listener.BeginAccept(

          new AsyncCallback(AcceptCallback),

          listener);
</div>

AsyncCallback(AcceptCallback),一旦连接上后的回调函数为AcceptCallback。当系统调用这个函数时,自动赋予的输入参数为IAsyncResoult类型变量ar。

 listener,连接行为的容器。

Socket handler = listener.EndAccept(ar);
</div>

完成连接,返回此时的socket通道。

handler.BeginReceive(state.buffer, 0, StateObject.BufferSize, 0,

      new AsyncCallback(ReadCallback), state);
</div>

接收的字节,0,字节长度,0,接收时调用的回调函数,接收行为的容器。

========

容器的结构类型为:

public class StateObject
{
  // Client socket.
  public Socket workSocket = null;
  // Size of receive buffer.
  public const int BufferSize = 1024;
  // Receive buffer.
  public byte[] buffer = new byte[BufferSize];
  // Received data string.
  public StringBuilder sb = new StringBuilder();
}
</div>

容器至少为一个socket类型。

===============

 // Read data from the client socket. 

    int bytesRead = handler.EndReceive(ar);
</div>

完成一次连接。数据存储在state.buffer里,bytesRead为读取的长度。

handler.BeginSend(byteData, 0, byteData.Length, 0,

      new AsyncCallback(SendCallback), handler);
</div>

发送数据byteData,回调函数SendCallback。容器handler

int bytesSent = handler.EndSend(ar);
</div>

发送完毕,bytesSent发送字节数。

4 程序结构

主程序:

    byte[] bytes = new Byte[1024];
    IPAddress ipAddress = IPAddress.Parse("192.168.1.104");
    IPEndPoint localEndPoint = new IPEndPoint(ipAddress, 11000);

    // 生成一个TCP的socket
    Socket listener = new Socket(AddressFamily.InterNetwork,
      SocketType.Stream, ProtocolType.Tcp);

    listener.Bind(localEndPoint);
    listener.Listen(100);

    while (true)
    {

      // Set the event to nonsignaled state.
      allDone.Reset();

      //开启异步监听socket
      Console.WriteLine("Waiting for a connection");
      listener.BeginAccept(
           new AsyncCallback(AcceptCallback),
           listener);

      // 让程序等待,直到连接任务完成。在AcceptCallback里的适当位置放置allDone.Set()语句.
      allDone.WaitOne();
      }

  Console.WriteLine("\nPress ENTER to continue");
  Console.Read();
</div>

连接行为回调函数AcceptCallback:

  public static void AcceptCallback(IAsyncResult ar)

  {

    //添加此命令,让主线程继续.

    allDone.Set();

    // 获取客户请求的socket

    Socket listener = (Socket)ar.AsyncState;

    Socket handler = listener.EndAccept(ar);

    // 造一个容器,并用于接收命令.

    StateObject state = new StateObject();

    state.workSocket = handler;

    handler.BeginReceive(state.buffer, 0, StateObject.BufferSize, 0,

      new AsyncCallback(ReadCallback), state);

  }
</div>

读取行为的回调函数ReadCallback:

  public static void ReadCallback(IAsyncResult ar)

  {

    String content = String.Empty;

    // 从异步state对象中获取state和socket对象.

    StateObject state = (StateObject)ar.AsyncState;

    Socket handler = state.workSocket;

    // 从客户socket读取数据. 

    int bytesRead = handler.EndReceive(ar);

    if (bytesRead > 0)

    {

      // 如果接收到数据,则存起来

      state.sb.Append(Encoding.ASCII.GetString(state.buffer, 0, bytesRead));

      // 检查是否有结束标记,如果没有则继续读取

      content = state.sb.ToString();

      if (content.IndexOf("<EOF>") > -1)

      {

        //所有数据读取完毕.

        Console.WriteLine("Read {0} bytes from socket. \n Data : {1}",

          content.Length, content);

        // 给客户端响应.

        Send(handler, content);

      }

      else

      {

        // 接收未完成,继续接收.

        handler.BeginReceive(state.buffer, 0, StateObject.BufferSize, 0,

        new AsyncCallback(ReadCallback), state);

      }

    }

  }
</div>

发送消息给客户端:

private static void Send(Socket handler, String data)

  {

    // 消息格式转换.

    byte[] byteData = Encoding.ASCII.GetBytes(data);

    // 开始发送数据给远程目标.

    handler.BeginSend(byteData, 0, byteData.Length, 0,

      new AsyncCallback(SendCallback), handler);

  }

private static void SendCallback(IAsyncResult ar)

  {

   

      // 从state对象获取socket.

      Socket handler = (Socket)ar.AsyncState;

      //完成数据发送

      int bytesSent = handler.EndSend(ar);

      Console.WriteLine("Sent {0} bytes to client.", bytesSent);

      handler.Shutdown(SocketShutdown.Both);

      handler.Close();

  }
</div>

在各种行为的回调函数中,所对应的socket都从输入参数的AsyncState属性获得。使用(Socket)或者(StateObject)进行强制转换。BeginReceive函数使用的容器为state,因为它需要存放传送的数据。

而其余接收或发送函数的容器为socket也可。

完整代码

  using System;
  using System.Net;
  using System.Net.Sockets;
  using System.Text;
  using System.Threading;
  
  // State object for reading client data asynchronously
  public class StateObject
  {
   // Client socket.
   public Socket workSocket = null;
   // Size of receive buffer.
   public const int BufferSize = ;
   // Receive buffer.
   public byte[] buffer = new byte[BufferSize];
   // Received data string.
   public StringBuilder sb = new StringBuilder();
 }
 
 public class AsynchronousSocketListener
 {
   // Thread signal.
   public static ManualResetEvent allDone = new ManualResetEvent(false);
 
   public AsynchronousSocketListener()
   {
   }
 
   public static void StartListening()
   {
     // Data buffer for incoming data.
     byte[] bytes = new Byte[];
 
     // Establish the local endpoint for the socket.
     // The DNS name of the computer
     // running the listener is "host.contoso.com".
     //IPHostEntry ipHostInfo = Dns.Resolve(Dns.GetHostName());
     IPAddress ipAddress = IPAddress.Parse("...");
 
     IPEndPoint localEndPoint = new IPEndPoint(ipAddress, );
 
     // Create a TCP/IP socket.
     Socket listener = new Socket(AddressFamily.InterNetwork,
       SocketType.Stream, ProtocolType.Tcp);
 
     // Bind the socket to the



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

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

  • 详解C#中三个关键字params,Ref,out
  • 详解三种C#实现数组反转方式
  • 详解C# 利用反射根据类名创建类的实例对象
  • 详解C#用new和override来实现抽象类的重写区别
  • 详解C#把DataTable中数据一次插入数据库的方法
  • 详解c# 类的构造方法
  • 详解C#多线程之线程同步
  • 详解C#中 Thread,Task,Async/Await,IAsyncResult的那些事儿
  • 详解C#中的委托
  • 详解C#中的out和ref

相关文章

  • 2017-05-28给c#添加SetTimeout和SetInterval函数
  • 2017-05-28C#中把字符串String转换为整型Int的小例子
  • 2017-05-28C#日期控件datetimepicker保存空值的三种方法
  • 2017-05-28C# 多线程读取注册表,加载至TreeView
  • 2017-05-28浅析依赖注入框架Autofac的使用
  • 2017-05-28C#中winform实现自动触发鼠标、键盘事件的方法
  • 2017-05-28C#调用WinRar执行rar、zip压缩的方法
  • 2017-05-28c#中(int)、int.Parse()、int.TryParse、Convert.ToInt32的区别详解
  • 2017-05-28WPF弹出自定义窗口的方法
  • 2017-05-28C#中的静态成员、静态方法、静态类介绍

文章分类

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

最近更新的内容

    • C#利用GDI+绘制旋转文字等效果实例
    • 如何应用C#实现UDP的分包组包
    • C#图像处理之图像目标质心检测的方法
    • C#中累加器函数Aggregate用法实例
    • C#中使用反射遍历一个对象属性及值的小技巧
    • 深入C#中get与set的详解
    • C# Winform 让整个窗口都可以拖动
    • c#模拟js escape方法的简单实例
    • C#执行存储过程并将结果填充到GridView的方法
    • C#使用Streamwriter打开文件的方法

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

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