1.  异步
    相对于同步,异步中的连接,接收和发送数据的方法都不一样,都有一个回调函数,就是即使不能连接或者接收不到数据,程序还是会一直执行下去,如果连接上了或者接到数据,程序会回到这个回调函数的地方重新往下执行。详细见下面:

服务器:

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)转载▼的更多相关文章

  1. C# Socket的TCP通讯

    Socket的TCP通讯 一. socket的通讯原理 服务器端的步骤如下. (1)建立服务器端的Socket,开始侦听整个网络中的连接请求. (2)当检测到来自客户端的连接请求时,向客户端发送收到连 ...

  2. [C#]手把手教你打造Socket的TCP通讯连接(一)

    本文章将讲解基于TCP连接的Socket通讯,使用Socket异步功能,并且无粘包现象,通过事件驱动使用. 在编写Socket代码之前,我们得要定义一下Socket的基本功能. 作为一个TCP连接,不 ...

  3. python socket 模拟tcp通讯

    对于tcp server 端的创建而言, 分为如下步骤:   1,创建socket对象(socket):其中俩个参数分别为     Address Family(如AF_INET为ipv4),AF_I ...

  4. C++ 利用socket实现TCP,UDP网络通讯

    学习孙鑫老师的vc++深入浅出,有一段时间了,第一次接触socket说实话有点儿看不懂,第一次基本上是看他说一句我写一句完成的,第二次在看SOCKET多少有点儿感觉了,接下来我把利用SOCKET完成T ...

  5. 【socket】TCP 和 UDP 在socket编程中的区别

    一.TCP与UDP的区别 基于连接与无连接  对系统资源的要求(TCP较多,UDP少)  UDP程序结构较简单  流模式与数据报模式  TCP保证数据正确性,UDP可能丢包  TCP保证数据顺序,UD ...

  6. boost asio 异步实现tcp通讯

    ---恢复内容开始--- asioboost   目录(?)[-] 一前言 二实现思路 通讯包数据结构 连接对象 连接管理器 服务器端的实现 对象串行化   一.前言 boost asio可算是一个简 ...

  7. 网络层、传输层、应用层、端口通信协议编程接口 - http,socket,tcp/ip 网络传输与通讯知识总结

    引: http://coach.iteye.com/blog/2024511 什么是TCP和UDP,以及二者区别是什么? TCP的全称为传输控制协议.这种协议可以提供面向连接的.可靠的.点到点的通信. ...

  8. socket(TCP)通讯之Python实现

    1.Service address = ('localhost', 9102) # AF_INET = ipv4; SOCK_STREAM:TCP s = socket.socket(socket.A ...

  9. 使用SOCKET实现TCP/IP协议的通讯

    一.原理: 首先要理解基本的原理,2台电脑间实现TCP通讯,首先要建立起连接,在这里要提到服务器端与客户端,两个的区别通俗讲就是主动与被动的关系,两个人对话,肯定是先有人先发起会话,要不然谁都不讲,谈 ...

随机推荐

  1. ListCtrl中垂直滚动条自动滚动

    在用ListCtrl控件时,当向该控件中添加数据时,怎么样可以把滚动条时时滚动到最后一行,这样便可看到添加的新数据内容 1 加完数据后执行 EnsureVisible(最后一行索引) 可以保证滚动到最 ...

  2. Openjudge-计算概论(A)-球弹跳高度的计算

    描述: 一球从某一高度落下(整数,单位米),每次落地后反跳回原来高度的一半,再落下.编程计算气球在第10次落地时,共经过多少米? 第10次反弹多高?输入输入一个整数h,表示球的初始高度.输出输出包含两 ...

  3. matlab显示原图和灰度直方图

    **只会显示灰度直方图I = imread('*.bmp') %图必须是灰度图,或者转换为灰度图I=rgb2gray(I);imshow(I);imhist(I); **同时出现在一个平面上I = i ...

  4. 获取集合、数组后要判断为空的必要性以及根据构造器创建对象后不是null的证实

    在开发过程中,凡是获取到一个集合对象,在利用或者说遍历这个集合对象之前,都要进行是否为null以及size()>0的判断,但是如果size()>0的话,不是就已经可以说明此集合对象不为nu ...

  5. C# WebService 概念,创建及引用调用

    1.1.Web Service基本概念 Web Service也叫XML Web Service WebService是一种可以接收从Internet或者Intranet上的其它系统中传递过来的请求, ...

  6. 【JQuery的选择器】

    一.基本选择器 基本选择器是JQuery中最常用的选择器,也是最简单的选择器,它通过元素的id,class和标签名来查找DOM元素(在网页中id只能使用一次,class允许重复使用). 选择器  描述 ...

  7. Nexus Maven 私服搭建

    1.下载Nexus安装文件:http://www.sonatype.org/nexus/go ,目前是nexus-2.13.0-01-bundle.tar.zip这个最新版本: 2.解压到任意目录,我 ...

  8. APK重新签名方法

    Android使用SHA1-RSA算法进行签名.可通过eclipse插件进行,可以通过keytool和jarsigner 用命令行执行,也可以在源码下进行签名. 第一种:通过使用eclipse进行签名 ...

  9. 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) 空格符      ...

  10. 高效程序猿之 VS2010快速生成代码模板

    本文转载,原文地址 http://edi.wang/Post/2011/12/8/efficient-code-monkey-1-vs2010-generate-code-template 一只程序猿 ...