C# Socket的TCP通讯 异步 (2015-11-07 10:07:19)转载▼
- 异步
 相对于同步,异步中的连接,接收和发送数据的方法都不一样,都有一个回调函数,就是即使不能连接或者接收不到数据,程序还是会一直执行下去,如果连接上了或者接到数据,程序会回到这个回调函数的地方重新往下执行。详细见下面:
 
服务器:
1、 开启侦听接口
private TcpListener listener; //监听类
listener = new TcpListener(new IPEndPoint(IPAddress.Parse(ip), port));
listener.Start();//开启侦听,对连接的客户端的数目没有限制
或者
listener.Start(int i);// 开启侦听,最多只能连接i个客户端数目
2、 接收客户端
                listener.BeginAcceptSocket(clientConnect, listener);//异步接受客户端的连接请求  clientConnect为连接的回调函数
///
    /// 接收回调函数
    ///
    ///
    private void clientConnect(IAsyncResult ar)
    {
        try
        {
            TcpListener listener = (TcpListener)ar.AsyncState;
            //接受客户的连接,得到连接的Socket
            Socket client = listener.EndAcceptSocket(ar);
        }
        catch { }
    }
3、 接收客户端发送的数据
///
    /// 异步接收数据
    ///
    private void receiveData(Socket client)
    {
            // 调用异步方法 BeginReceive 来告知 socket 如何接收数据
            IAsyncResult iar = client.BeginReceive(buffer, 0, BagSize, SocketFlags.None, out errorCode, receiveCallback, buffer);
        }
 }
    ///
    /// 接收数据回调函数
    ///
    ///
    private void receiveCallback(IAsyncResult ar)
    {          
            //接收到的数据长度.
            int receLen = 0;
            try
            {
                receLen = client.EndReceive(ar, out errorCode);
if (receLen > 0)
                {
                    OnReceiveData(client);//接收到数据之后的处理函数
                }
            }
            catch {     }
        }
        else { }
    }
4、接收成功之后,回发数据给客户端
///
    /// 异步发送报文
    ///
    ///
    private void OnReceiveData (Socket socket)
    {
string strLogin = “succeed recived”;
byte[] data = Encoding.ASCII.GetBytes(strLogin);
     socket.BeginSend(data, 0, data.Length, SocketFlags.None, out errorCode, sendCallBack, socket);//异步发送数据
        }
        else
        { }
    }
///
    /// 异步发送回调事件
    ///
    ///
    private void sendCallBack(IAsyncResult ar)
    {
socket.EndSend(ar, out errorCode);
      }
客户端
1、连接服务器
private TcpClient tcpcz = null
     tcpcz = new TcpClient()
tcpcz.BeginConnect(ipaddress, Convert.ToInt32(port), new AsyncCallback(ConnectCallback), tcpcz);//根据服务器的IP地址和端口号 异步连接服务器
    ///
    /// 异步连接的回调函数
    ///
    ///
    private void ConnectCallback(IAsyncResult ar)
    {
        TcpClient t = (TcpClient)ar.AsyncState;
        try
        {
            if (t.Connected)
            {
                t.EndConnect(ar);//函数运行到这里就说明连接成功
            }
            else
            {
            }
        }
        catch () {    }
    }
2、发送和接收字符串
NetworkStream stream = tcp.GetStream();//创建于服务器连接的数据流
              //发送字符串
              string strLogin = “this is socket example”;
         byte[] data = Encoding.ASCII.GetBytes(strLogin);
      stream.BeginWrite(data, 0, data.Length, new AsyncCallback(SendCallback),stream);//异步发送数据
              //接收字符串
            byte[] result = new byte[tcp.Available]; // tcp.Available为接受的字符串大小
              try
              {
                  stream.BeginRead(result, 0, result.Length, new AsyncCallback(ReadCallback), stream);//异步接受服务器回报的字符串
              }
              catch { }
              string strResponse = Encoding.ASCII.GetString(result).Trim();//从服务器接受到的字符串
          }
      }
      catch ()
      {
      }
  }C# Socket的TCP通讯 异步 (2015-11-07 10:07:19)转载▼的更多相关文章
- C# Socket的TCP通讯
		Socket的TCP通讯 一. socket的通讯原理 服务器端的步骤如下. (1)建立服务器端的Socket,开始侦听整个网络中的连接请求. (2)当检测到来自客户端的连接请求时,向客户端发送收到连 ... 
- [C#]手把手教你打造Socket的TCP通讯连接(一)
		本文章将讲解基于TCP连接的Socket通讯,使用Socket异步功能,并且无粘包现象,通过事件驱动使用. 在编写Socket代码之前,我们得要定义一下Socket的基本功能. 作为一个TCP连接,不 ... 
- python socket 模拟tcp通讯
		对于tcp server 端的创建而言, 分为如下步骤: 1,创建socket对象(socket):其中俩个参数分别为 Address Family(如AF_INET为ipv4),AF_I ... 
- C++ 利用socket实现TCP,UDP网络通讯
		学习孙鑫老师的vc++深入浅出,有一段时间了,第一次接触socket说实话有点儿看不懂,第一次基本上是看他说一句我写一句完成的,第二次在看SOCKET多少有点儿感觉了,接下来我把利用SOCKET完成T ... 
- 【socket】TCP 和 UDP 在socket编程中的区别
		一.TCP与UDP的区别 基于连接与无连接 对系统资源的要求(TCP较多,UDP少) UDP程序结构较简单 流模式与数据报模式 TCP保证数据正确性,UDP可能丢包 TCP保证数据顺序,UD ... 
- boost asio 异步实现tcp通讯
		---恢复内容开始--- asioboost 目录(?)[-] 一前言 二实现思路 通讯包数据结构 连接对象 连接管理器 服务器端的实现 对象串行化 一.前言 boost asio可算是一个简 ... 
- 网络层、传输层、应用层、端口通信协议编程接口 - http,socket,tcp/ip 网络传输与通讯知识总结
		引: http://coach.iteye.com/blog/2024511 什么是TCP和UDP,以及二者区别是什么? TCP的全称为传输控制协议.这种协议可以提供面向连接的.可靠的.点到点的通信. ... 
- socket(TCP)通讯之Python实现
		1.Service address = ('localhost', 9102) # AF_INET = ipv4; SOCK_STREAM:TCP s = socket.socket(socket.A ... 
- 使用SOCKET实现TCP/IP协议的通讯
		一.原理: 首先要理解基本的原理,2台电脑间实现TCP通讯,首先要建立起连接,在这里要提到服务器端与客户端,两个的区别通俗讲就是主动与被动的关系,两个人对话,肯定是先有人先发起会话,要不然谁都不讲,谈 ... 
随机推荐
- ListCtrl中垂直滚动条自动滚动
			在用ListCtrl控件时,当向该控件中添加数据时,怎么样可以把滚动条时时滚动到最后一行,这样便可看到添加的新数据内容 1 加完数据后执行 EnsureVisible(最后一行索引) 可以保证滚动到最 ... 
- Openjudge-计算概论(A)-球弹跳高度的计算
			描述: 一球从某一高度落下(整数,单位米),每次落地后反跳回原来高度的一半,再落下.编程计算气球在第10次落地时,共经过多少米? 第10次反弹多高?输入输入一个整数h,表示球的初始高度.输出输出包含两 ... 
- matlab显示原图和灰度直方图
			**只会显示灰度直方图I = imread('*.bmp') %图必须是灰度图,或者转换为灰度图I=rgb2gray(I);imshow(I);imhist(I); **同时出现在一个平面上I = i ... 
- 获取集合、数组后要判断为空的必要性以及根据构造器创建对象后不是null的证实
			在开发过程中,凡是获取到一个集合对象,在利用或者说遍历这个集合对象之前,都要进行是否为null以及size()>0的判断,但是如果size()>0的话,不是就已经可以说明此集合对象不为nu ... 
- C# WebService 概念,创建及引用调用
			1.1.Web Service基本概念 Web Service也叫XML Web Service WebService是一种可以接收从Internet或者Intranet上的其它系统中传递过来的请求, ... 
- 【JQuery的选择器】
			一.基本选择器 基本选择器是JQuery中最常用的选择器,也是最简单的选择器,它通过元素的id,class和标签名来查找DOM元素(在网页中id只能使用一次,class允许重复使用). 选择器 描述 ... 
- Nexus Maven 私服搭建
			1.下载Nexus安装文件:http://www.sonatype.org/nexus/go ,目前是nexus-2.13.0-01-bundle.tar.zip这个最新版本: 2.解压到任意目录,我 ... 
- APK重新签名方法
			Android使用SHA1-RSA算法进行签名.可通过eclipse插件进行,可以通过keytool和jarsigner 用命令行执行,也可以在源码下进行签名. 第一种:通过使用eclipse进行签名 ... 
- ASCII码对应表chr(9)、chr(10)、chr(13)、chr(32)、chr(34)、chr(39)
			chr(9) tab空格 chr(10) 换行 chr(13) 回车 Chr(13)&chr(10) 回车换行 chr(32) 空格符 ... 
- 高效程序猿之 VS2010快速生成代码模板
			本文转载,原文地址 http://edi.wang/Post/2011/12/8/efficient-code-monkey-1-vs2010-generate-code-template 一只程序猿 ... 
