C# 线程手册 第七章 网络和线程

在本书的之前章节,我们已经深入地了解了C#.NET 中的线程并探讨了多线程编程中的不同概念和技术。现在你已经是一个线程专家啦,我们将要使用C#实现一个简单的多线程客户端-服务端程序并在其中使用一些我们到目前为止讨论过的概念。

多一些应用来说,高效地使用线程和异步编程是不可或缺的,比如网络通信,高效用户接口以及磁盘输入/输出等等。在所有这些情况下,如果使用单线程的话程序可能会卡死或者在等待一个操作完成的过程中崩溃。对那些网速比较慢的用户来说,一个网络程序的延迟时间是最重要的衡量标准。在本章的示例程序中,我们将要使用System.Net 命名空间并简要地了解下.NET 的网络能力,尤其是对具有多用户和异步特性的网络程序来说,使用线程是毋庸置疑的。

我们将讨论以下内容:

  1. 使用System.Net 命名空间开发网络程序

  2. 基于TCP/IP 开发一个简单的客户-服务端程序

  3. 使用.NET 功能实现异步操作

  4. 在一个客户端和一个远程服务端之间使用异步消息传输

.NET 中的网络

在.NET Framework 之前, 开发基于Windows 平台的网络程序就仅限于使用难以理解的WinSock 库的C++高级程序员。当然Wintel平台下使用Visual Basic 的开发人员也可以开发出一些相对简单的任务。其他语言提供一些额外的功能。然而,一个开发人员在使用由这些语言提供的简单的、有限的服务时会遇到很多功能障碍,因此不得不进行很多次尝试。

幸运的是,.NET Framework 中的System.Net 命名空间带来了一系列以一种简单的、一致的对象模型包装好的高效功能集合。这些类的易用性并未导致功能的减少,WinSock 2.0 中几乎所有的核心功能都被System.Net命名空间包装和抽象出来。开发人员可以很容易地开发从套接字直到HTTP间任何层级的程序。和原生的WinSock 类不同,System.Net 命名空间将开发人员从自己亲自动手实现很多迫切的资源管理任务的”快乐”中解放出来,比如处理IO重叠和端口完全性。

嗯,事不宜迟,我们现在就来看看System.Net 命名空间。

System.Net 命名空间

System.Net 命名空间事实上有两个命名空间组成,System.Net 和 System.Net.Socket.

我们从System.Net.Socket 命名空间开始。System.Net 命名空间中的类的分层解决方案允许应用程序按照需要使用控件的多种层次来访问网络。除了支持套接字,System.Net 类也提供一个令人印象深刻的功能集合来使用HTTP协议。对大多数情况来说,System.Net 提供三层架构,应用层协议,传输层协议和网络协议。System.Net.Sockets 命名空间由很多初始类和实现组成,可以用来处理传输协议。让我们看看System.Net 命名空间中的很多重要的类,如下表所示:

你可以看到,System.Net 命名空间包含了很多对站点和网络编程非常有用的类和实现。

System.Net.Sockets 命名空间

System.Net.Sockets 命名空间关注传输层:套接字包含了一系列复杂的类。这些类在抽象与套接字编程过程相关的复杂任务中做了出色的工作,它们提供了一个有力且高效的套接字堆栈并向下兼容伯克利套接字。最后,对TCP和UDP的内建支持被很好地集成在System.Net.Sockets 类中。下表列出了System.Net.Sockets命名空间中的类。

一个多种不同层次的控件提供给了开发人员,比如用于系统底层的Socket 类,用于系统上层的TcpClient类,它们提供了易于使用的特性和更多功能。更多内容已经超出了本书的范畴(可以参考《专业.NET 网络编程》),这里我们仅详细地看一下上面的这些类,因为我们稍后要使用它们设计并开发我们的示例程序。

下一篇通过一个示例程序介绍C# 线程手册 中所囊括的所有内容…

Original: https://www.cnblogs.com/danielWise/archive/2012/05/06/2485640.html
Author: DanielWise
Title: C# 线程手册 第七章 网络和线程

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/539898/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • 高并发场景案例分享(一)分库分表

    今年在公司重构(写)了一个老项目,踩了无数的坑。 中间好几次遇到问题,甚至感觉项目可能要失败了,好在最后终于成功上线了。 虽然被坑的不要不要的,但也从中领悟到了不少东西,在这里记录…

    Java 2023年6月5日
    084
  • 记一次简单的注入

    1、题目名sql_i,环境打开是一张图,可以看到id的参数base64加密了。 源码里还说sqlmap是没有灵魂的。 2、and 、空格,base64加密后提交发现被过滤 3、or…

    Java 2023年6月5日
    079
  • Java基础知识点及易错点(1)

    Java基础知识点及易错点(1) Java基础知识点及易错点(1) 1、缓存池 2、String 3、switch 4、Q&A a = a + b 与 a += b 的区别…

    Java 2023年6月7日
    080
  • HTML基础总结

    HTML细化知识点总结 h1-h6 标签 都是标题标签,定义一段话的标题,h1最大,依次递减,h6最小 标题标签的作用:让文本加粗显示 段落标签:p标签 用来显示一段文本(图片),…

    Java 2023年6月8日
    079
  • 【JAVA基础】别人的开源项目结构

    https://www.bilibili.com/read/cv5236887 posted on2020-08-19 23:18 tigerloveapple 阅读(82 ) 评…

    Java 2023年5月29日
    083
  • 十大排序

    十大排序 import java.util.ArrayList; import java.util.Collections; import java.util.List; impo…

    Java 2023年6月8日
    083
  • 企业级Nginx负载均衡与keepalived高可用实战(一)Nginx篇

    1、集群简介 1.1、什么是集群 简单地说,集群就是指一组(若干个)相互独立的计算机,利用高速通信网络组成的一个较大的计算机服务系统,每个集群节点(即集群中的每台计算机)都是运行各…

    Java 2023年5月30日
    085
  • k8s-持久卷存储

    第一个Demo PV与PVC概念 存储容量 访问模式 PV回收策略 PVC选择PV 第一个Demo PV关联后端存储,PVC关联PV,Pod关联PVC。这里的后端存储使用的是NFS…

    Java 2023年6月8日
    0113
  • SpringBoot-Mybatis

    SpringBoot 整合 Mybatis SpringBoot-Mybatis 10.1 导入 MyBatis 所需要的依赖 org.mybatis.spring.boot my…

    Java 2023年6月5日
    060
  • Java学习 (22) 对象篇(02)类与对象

    类与对象的关系 类是一种抽象的数据类型,它是对某一类事物整体描述/定义,但是并不能代表某一个具体的事物. 动物(猫、狗)、植物(花、草)、手机(安卓、苹果)、电脑(联想、华硕)、&…

    Java 2023年6月8日
    0102
  • 完整实现-通过DelayQueue实现延时任务

    实现延时任务有很多的方法,网上关于延时任务的实现的文章已经不少了。比如:实现延时任务的10种方法等等。但是这些文章基本上都是将方法大概的列举一下,给出部分示例代码,对于有经验的老程…

    Java 2023年6月15日
    0106
  • 一个注解@Recover搞定丑陋的循环重试代码

    使用背景 在实际项目中其中一部分逻辑可能会因为调用了外部服务或者等待锁等情况下出现不可预料的异常,在这个时候我们可能需要对调用这部分逻辑进行重试,代码里面主要就是使用for循环写一…

    Java 2023年6月5日
    078
  • php: 单下划线函数意义

    待完善参考 posted @2022-09-21 09:42 CodeWater 阅读(10 ) 评论() 编辑 Original: https://www.cnblogs.com…

    Java 2023年6月7日
    069
  • 生产环境Redis连接,长时间无响应被服务器断开问题

    上个月线上生产环境有几个接口出现异常响应,查看生产日志后发现,如下错误 线上Redis客户端使用的是 SpringBoot默认的 Lettuce客户端,并且没有指定连接池, con…

    Java 2023年6月14日
    079
  • Mybatis 一级缓存和二级缓存原理区别 (图文详解)

    Java面试经常问到Mybatis一级缓存和二级缓存,今天就给大家重点详解Mybatis一级缓存和二级缓存原理与区别@mikechen Mybatis缓存 缓存就是内存中的数据,常…

    Java 2023年6月15日
    093
  • 【实战问题】【15】报错java.lang.ClassCastException: com.google.gson.internal.LinkedTreeMap cannot be cast to xx

    场景重现:调用封装好的接口,返回的数据类型是List,debug可以看到有返回值。但是进行到对list进行操作的那步,报错了(java.lang.ClassCastExceptio…

    Java 2023年5月29日
    079
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球