看了系列一 我们开启了对socket tcp的监听状态,那么这一章我们来讲解怎么创建socket的通信代码

我新建一个类 TSocketBase

 public abstract class TSocketBase
     {
         //封装socket
         internal Socket _Socket;
         //回调
         private AsyncCallback aCallback;
         //接受数据的缓冲区
         private byte[] Buffers;
         //标识是否已经释放
         private volatile bool IsDispose;
         //10K的缓冲区空间
          * ;
         //收取消息状态码
         private SocketError ReceiveError;
         //发送消息的状态码
         private SocketError SenderError;
         //每一次接受到的字节数
         ;
         //接受空消息次数
         ;

         public abstract void Receive(byte[] rbuff);

         public void SetSocket()
         {
             this.aCallback = new AsyncCallback(this.ReceiveCallback);
             this.IsDispose = false;
             this._Socket.ReceiveBufferSize = this.BufferSize;
             this._Socket.SendBufferSize = this.BufferSize;
             this.Buffers = new byte[this.BufferSize];
         }

         /// <summary>
         /// 关闭并释放资源
         /// </summary>
         /// <param name="msg"></param>
         public void Close(string msg)
         {
             if (!this.IsDispose)
             {
                 this.IsDispose = true;
                 try
                 {
                     try { this._Socket.Close(); }
                     catch { }
                     IDisposable disposable = this._Socket;
                     if (disposable != null) { disposable.Dispose(); }
                     this.Buffers = null;
                     GC.SuppressFinalize(this);
                 }
                 catch (Exception) { }
             }
         }

         /// <summary>
         /// 递归接收消息方法
         /// </summary>
         internal void ReceiveAsync()
         {
             try
             {
                 if (!this.IsDispose && this._Socket.Connected)
                 {
                     , this.BufferSize, SocketFlags.None, out SenderError, this.aCallback, this);
                     CheckSocketError(ReceiveError);
                 }
             }
             catch (System.Net.Sockets.SocketException) { this.Close("链接已经被关闭"); }
             catch (System.ObjectDisposedException) { this.Close("链接已经被关闭"); }
         }

         /// <summary>
         /// 接收消息回调函数
         /// </summary>
         /// <param name="iar"></param>
         private void ReceiveCallback(IAsyncResult iar)
         {
             if (!this.IsDispose)
             {
                 try
                 {
                     //接受消息
                     ReceiveSize = _Socket.EndReceive(iar, out ReceiveError);
                     //检查状态码
                     if (!CheckSocketError(ReceiveError) && SocketError.Success == ReceiveError)
                     {
                         //判断接受的字节数
                         )
                         {
                             byte[] rbuff = new byte[ReceiveSize];
                             Array.Copy(this.Buffers, rbuff, ReceiveSize);
                             this.Receive(rbuff);
                             //重置连续收到空字节数
                             ZeroCount = ;
                             //继续开始异步接受消息
                             ReceiveAsync();
                         }
                         else
                         {
                             ZeroCount++;
                             ) { this.Close("错误链接"); }
                         }
                     }
                 }
                 catch (System.Net.Sockets.SocketException) { this.Close("链接已经被关闭"); }
                 catch (System.ObjectDisposedException) { this.Close("链接已经被关闭"); }
             }
         }

         /// <summary>
         /// 错误判断
         /// </summary>
         /// <param name="socketError"></param>
         /// <returns></returns>
         bool CheckSocketError(SocketError socketError)
         {
             switch ((socketError))
             {
                 case SocketError.SocketError:
                 case SocketError.VersionNotSupported:
                 case SocketError.TryAgain:
                 case SocketError.ProtocolFamilyNotSupported:
                 case SocketError.ConnectionAborted:
                 case SocketError.ConnectionRefused:
                 case SocketError.ConnectionReset:
                 case SocketError.Disconnecting:
                 case SocketError.HostDown:
                 case SocketError.HostNotFound:
                 case SocketError.HostUnreachable:
                 case SocketError.NetworkDown:
                 case SocketError.NetworkReset:
                 case SocketError.NetworkUnreachable:
                 case SocketError.NoData:
                 case SocketError.OperationAborted:
                 case SocketError.Shutdown:
                 case SocketError.SystemNotReady:
                 case SocketError.TooManyOpenSockets:
                     this.Close(socketError.ToString());
                     return true;
             }
             return false;
         }

         /// <summary>
         /// 发送消息方法
         /// </summary>
         internal int SendMsg(byte[] buffer)
         {
             ;
             try
             {
                 if (!this.IsDispose)
                 {
                     size = , buffer.Length, SocketFlags.None, out SenderError);
                     CheckSocketError(SenderError);
                 }
             }
             catch (System.ObjectDisposedException) { this.Close("链接已经被关闭"); }
             catch (System.Net.Sockets.SocketException) { this.Close("链接已经被关闭"); }
             buffer = null;
             return size;
         }
     }

上面我们事先了socket的异步接受消息,和同步发送消息已经关闭释放资源代码

接受消息net底层提供的接受消息的方法有很多,为什么我们要选择上面所写的呢?那是为了兼容U3D,silverlight, wpf, wp, wf,等程序可执行,不在重复做相同工作。

现在我们来创建一个实现类 TSocketClient

   public class TSocketClient : TSocketBase
     {
         /// <summary>
         /// 是否是服务器端的资源
         /// </summary>
         bool isServer = false;

         /// <summary>
         /// 客户端主动请求服务器
         /// </summary>
         /// <param name="ip"></param>
         /// <param name="port"></param>
         )
         {
             isServer = false;
             this._Socket = new System.Net.Sockets.Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
             this._Socket.Connect(ip, port);
             this.SetSocket();
             this.ReceiveAsync();
         }
         /// <summary>
         /// 这个是服务器收到有效链接初始化
         /// </summary>
         /// <param name="socket"></param>
         public TSocketClient(Socket socket)
         {
             isServer = true;
             this._Socket = socket;
             this.SetSocket();
             this.ReceiveAsync();
         }

         /// <summary>
         /// 收到消息后
         /// </summary>
         /// <param name="rbuff"></param>
         public override void Receive(byte[] rbuff)
         {
             Console.WriteLine("Receive Msg:" + System.Text.UTF8Encoding.Default.GetString(rbuff));
             if (isServer)
             {
                 this.SendMsg(System.Text.UTF8Encoding.Default.GetBytes("Holle Client!"));
             }
         }
     }

因为是测试示例,所以我把服务器和客户端实现类写成了,只是用来不同的构造函数来区分,是客户端还是服务器的标识

接下来我们测试一下代码

   class Program
     {
         static void Main(string[] args)
         {
             TCPListener tcp = new TCPListener();
             TSocketClient client = new TSocketClient();
             client.SendMsg(System.Text.UTF8Encoding.Default.GetBytes("Holle Server!"));
             Console.ReadLine();
         }
     }

运行结果看出,我们连接成功并且发送消息成功。

C# Socket系列二 简单的创建 socket 通信的更多相关文章

  1. C# Socket系列一 简单的创建socket的监听

    socket的应用场景,在快速,稳定,保持长连接的数据传输代码.Http也是socket封装出来的,基于一次请求一次回复,然后断开的socket连接封装. 比如我们常见的游戏服务器,目前的很火的物联网 ...

  2. LINQ to Sql系列二 简单查询和联接查询

    这一篇文章主要总结LINQ to sql的简单查询(单表查询)和联接查询(多表查询) 单表查询 需求是我们要输出TClass表中的结果.使用了from-in-select语句,代码如下: public ...

  3. 简单的同步Socket程序服务端

    首先,Socket是.Net提供的 System.Net.Sockets命名空间的Scoket类为网络通信提供了一套丰富的方法和属性 服务器按照Socket的基本流程 先创建Socket 在用Bind ...

  4. python 实现一个简单tcp epoll socket

    python 实现一个epoll server #!/usr/bin/env python #-*- coding:utf-8 -*- import socket import select impo ...

  5. import socket模块二

    ---恢复内容开始--- 优化两个小脚本实现不间断聊天: server.py: import socket sk = socket.socket() # 创建socket addess = ('127 ...

  6. Socket学习总结系列(二) -- CocoaAsyncSocket

    这是系列的第二篇 这是这个系列文章的第二篇,要是没有看第一篇的还是建议看看第一篇,以为这个是接着第一篇梳理的 先大概的总结一下在上篇的文章中说的些内容: 1. 整理了一下做IM我们有那些途径,以及我们 ...

  7. C# Socket系列三 socket通信的封包和拆包

    通过系列二 我们已经实现了socket的简单通信 接下来我们测试一下,在时间应用的场景下,我们会快速且大量的传输数据的情况! class Program { static void Main(stri ...

  8. socket编程——一个简单的样例

    从一个简单的使用TCP样例開始socket编程,其基本过程例如以下: server                                                  client ++ ...

  9. socket计划——一个简单的例子

    从一个简单易用TCP样品开始socket计划,的基本过程例如下列: server                                                  client +++ ...

随机推荐

  1. 【腾讯Bugly干货分享】深入理解 ButterKnife,让你的程序学会写代码

    本文来自于腾讯bugly开发者社区,非经作者同意,请勿转载,原文地址:http://dev.qq.com/topic/578753c0c9da73584b025875 0.引子 话说我们做程序员的,都 ...

  2. Backbone源码解析(二):Model(模型)模块

    Model(模型)模块在bk框架中的作用主要是存储处理数据,它对外和对内都有很多操作数据的接口和方法.它与视图(Views)模块精密联系着,通过set函数改变数据结构从而改变视图界面的变化.下面我们来 ...

  3. Android(蓝牙)

    因近期项目需求调试了Android蓝牙通讯接口,主要是两个终端作为服务端和客户端的通信,本文将部分重要知识点记录如下. 蓝牙是短距离无线通信,通常分经典蓝牙和低功耗蓝牙(即蓝牙4.0),两类蓝牙协议各 ...

  4. Java设计模式12:装饰器模式

    装饰器模式 装饰器模式又称为包装(Wrapper)模式.装饰器模式以多客户端透明的方式扩展对象的功能,是继承关系的一个替代方案. 装饰器模式的结构 通常给对象添加功能,要么直接修改对象添加相应的功能, ...

  5. 招聘:有兴趣做一个与Android对等的操作系统么?

    招聘:有兴趣做一个与Android对等的操作系统么? 前不久我发了一篇<八一八招聘的那些事儿>讲了我自己作为求职者对招聘的一些看法.那个时候我还在求职,对求职的结果还是挺满意的,五家公司面 ...

  6. Git学习笔记(4)——添加远程仓库,克隆远程库,以及库的推送

    本文记录了远程库的连接和库的克隆和推送. 远程仓库简介 Git是分布式版本控制系统,同一个Git仓库,可以分布到不同的机器上.有一台机器有一个原始版本库,此后,别的机器可以“克隆”这个原始版本库,而且 ...

  7. redis常用命令、常见错误、配置技巧等分享

    转载于:http://www.itxuexiwang.com/a/shujukujishu/redis/2016/0216/117.html?1455860236 1. redis查看当前所有的key ...

  8. Nodejs·进程

    之前对这部分的内容很感兴趣,没想到读起来有点晦涩,还是因为对服务器的知识不是很了解. 说道服务器一般人都会想到tomcat或者Jboss或者weblogic,现在流行起来的Node总让人不太放心,JS ...

  9. fir.im Weekly - 揭秘直播移动 APP 技术实现

    2016年直播似乎无处不在,作为一个开发者也许需要补充下关于直播技术点.本期 fir.im Weekly 整理了一些开发者对于直播实践项目中的技术经验与直播技术架构分析等内容,还有一些关于 iOS . ...

  10. fir.im Weekly - 聊聊让人向往的远程开发工作

    6月30 日,苹果开发者后台贴出一封关于广电总局的醒目通知,申报一个游戏 APP 上架AppStore,你需要文网文+ICP证+软著+版号,审批难度将越来越大,不禁让人感慨中国独立开发者的成长 &qu ...