.NET Socket 简单入门

说到Socket,想必大家都或多或少有所涉及,从最初的计算机网络课程,讲述了tcp协议,而Socket就是对协议的进一步封装,使我们开发人员能够更加容易轻松的进行软件之间的通信。

这个星期刚好接受一个共享车位锁的项目,需要使用Socket与硬件进行通信控制,说白了也就是给锁发送指令,控制其打开或者关闭,再就是对App开放操作接口,使其方便测试以及用户的使用。这其中核心就是Socket的使用,再开发出这个功能之后,我发现使用起来很不方便,于是耗时2天抽象其核心功能并封装成框架,最后使用这个框架将原来的项目重构并上线,极大的提高了软件的可拓展性,健壮性,容错率。

个人坚信的原则:万物皆对象

好了,不废话了,下面进入正文

 

正文:

1、首先简单讲下C#中Socket的简单使用。

第一步:服务端监听某个端口

第二步:客户端向服务端地址和端口发起Socket连接请求

第三步:服务端收到连接请求后创建Socket连接,并维护这个连接队列。

第四步:客户端和服务端已经建立双工通信(即双向通信),客户端和服务端可以轻松方便的给彼此发送信息。

至于简单使用的具体实现代码全部被我封装到项目中了,如果需要学习简单的实现,可以看我的源码,也可以自行百度,有很多的教程

 

2、核心,框架的使用

其实,说其为框架,可能有点牵强,因为每个人对框架都有自己的理解,但是类库和框架又有什么本质区别呢?全部都是代码~哈哈,扯远了

首先,空说无凭,先放上所有的代码:

服务端源文件:

SocketServer.cs
复制代码
using System;
using System.Collections.Generic;
using System.Net; using System.Net.Sockets; namespace Coldairarrow.Util.Sockets { /// <summary> /// Socket服务端 /// </summary> public class SocketServer { #region 构造函数 /// <summary> /// 构造函数 /// </summary> /// <param name="ip">监听的IP地址</param> /// <param name="port">监听的端口</param> public SocketServer(string ip, int port) { _ip = ip; _port = port; } /// <summary> /// 构造函数,监听IP地址默认为本机0.0.0.0 /// </summary> /// <param name="port">监听的端口</param> public SocketServer(int port) { _ip = "0.0.0.0"; _port = port; } #endregion #region 内部成员 private Socket _socket = null; private string _ip = ""; private int _port = 0; private bool _isListen = true; private void StartListen() { try { _socket.BeginAccept(asyncResult => { try { Socket newSocket = _socket.EndAccept(asyncResult); //马上进行下一轮监听,增加吞吐量 if (_isListen) StartListen(); SocketConnection newClient = new SocketConnection(newSocket, this) { HandleRecMsg = HandleRecMsg == null ? null : new Action<byte[], SocketConnection, SocketServer>(HandleRecMsg), HandleClientClose = HandleClientClose == null ? null : new Action<SocketConnection, SocketServer>(HandleClientClose), HandleSendMsg = HandleSendMsg == null ? null : new Action<byte[], SocketConnection, SocketServer>(HandleSendMsg), HandleException = HandleException == null ? null : new Action<Exception>(HandleException) }; newClient.StartRecMsg(); ClientList.AddLast(newClient); HandleNewClientConnected?.Invoke(this, newClient); } catch (Exception ex) { HandleException?.Invoke(ex); } }, null); } catch (Exception ex) { HandleException?.Invoke(ex); } } #endregion #region 外部接口 /// <summary> /// 开始服务,监听客户端 /// </summary> public void StartServer() { try { //实例化套接字(ip4寻址协议,流式传输,TCP协议) _socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); //创建ip对象 IPAddress address = IPAddress.Parse(_ip); //创建网络节点对象包含ip和port IPEndPoint endpoint = new IPEndPoint(address, _port); //将 监听套接字绑定到 对应的IP和端口  _socket.Bind(endpoint); //设置监听队列长度为Int32最大值(同时能够处理连接请求数量) _socket.Listen(int.MaxValue); //开始监听客户端  StartListen(); HandleServerStarted?.Invoke(this); } catch (Exception ex) { HandleException?.Invoke(ex); } } /// <summary> /// 所有连接的客户端列表 /// </summary> public LinkedList<SocketConnection> ClientList { get; set; } = new LinkedList<SocketConnection>(); /// <summary> /// 关闭指定客户端连接 /// </summary> /// <param name="theClient">指定的客户端连接</param> public void CloseClient(SocketConnection theClient) { theClient.Close(); } #endregion #region 公共事件 /// <summary> /// 异常处理程序 /// </summary> public Action<Exception> HandleException { get; set; } #endregion #region 服务端事件 /// <summary> /// 服务启动后执行 /// </summary> public Action<SocketServer> HandleServerStarted { get; set; } /// <summary> /// 当新客户端连接后执行 /// </summary> public Action<SocketServer, SocketConnection> HandleNewClientConnected { get; set; } /// <summary> /// 服务端关闭客户端后执行 /// </summary> public Action<SocketServer, SocketConnection> HandleCloseClient { get; set; } #endregion #region 客户端连接事件 /// <summary> /// 客户端连接接受新的消息后调用 /// </summary> public Action<byte[], SocketConnection, SocketServer> HandleRecMsg { get; set; } /// <summary> /// 客户端连接发送消息后回调 /// 

转载于:https://www.cnblogs.com/MuNet/p/8546052.html

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值