C#网络编程(1)
1、Purpose
1、什么是网络编程
2、TCP/IP协议
3、什么是套接字
4、多线程深入理解
二、Basic Concept
1、网络编程:主要实现进程(线程)相互之间的通信和基本的网络应用原理性(协议)功能的程序。
2、TCP/IP是一个协议族,其中包括TCP、IP、UDP、ICMP、RIP、TELNET、FTP、SMTP、ARP、TFTP等许多协议.
TCP(Transmission Control Protocol)传输控制协议
IP(Internet Protocol)网际协议
UDP(User Datagram Protocol)用户数据报协议
ICMP(Internet Control Message Protocol)互联网控制信息协议
SMTP(Simple Mail Transfer Protocol)简单邮件传输协议
SNMP(Simple Network manage Protocol)简单网络管理协议
FTP(File Transfer Protocol)文件传输协议
ARP(Address Resolation Protocol)地址解析协议
TCP/IP从某种角度上来说由四个层次构成:网络接口层、网络层、传输层、应用层.
各层所遵守的协议
具体看看TCP协议
TCP是Transmission Control Protocol(传输控制协议)的简称,是TCP/IP体系中面向连接的运输层协议,在网络中提供全双工的和可靠的服务。
TCP协议最主要的特点是:
1) 是一种基于连接的协议。
2) 全双工、点对点。
3) 保证各数据到达的顺序与数据发出的顺序相同。
4) 传输的数据无消息边界。
解释:(1)是一种基于连接的协议:意思是说连个远程主机(或曰进程)必须进行一次握手过程,确认连接成功之后才能传输实际数据。举个例子A向B发送数据,首先要建立连接,如何建立连接呢,它首先得知道B的位置吧,也就是主机地址,然后要知道从哪个门进去吧,也就是端口号,当知道这些之后它还需要知道B要不要接收它发过来的数据吧,也就是是否满足某种协议,于是A发送一个不含任何数据的请求报文给B来试探B 让不让发送数据,如果B在接收到这个请求之后做出了回应,那么A随后才发送实际数据。
(2)全双工、点对点:如果两个主机上的进程建立好连接,那么数据就可以从A发送到B,也可以从B发送到A,点对点指的是一个TCP连接是两者之间的,不允许第三者插足,通过一个连接将数据发给多个接收方是不可能的。
(3)保证各数据到达的顺序:建立连接后,数据的发送一定能够到达,并且是有序的,发送的时候是ABC,接收的时候一定是ABC
(4)传输的数据无消息边界:说的是不能保证来自单个Send方法的数据能被单个Receive方法读取。举个例子:
第一次发送:abcdefg 第二次发送:123456 接收方接收数据时,可能会出现以下情况:
第一次接收:abcdefg123456 也可能出现:第一次接收:abc 第二次接收:efg12 第三次接收:3456
因此要解决TCP发送消息与接收消息一致性,编程时必须要解决消息边界问题。
三种方式解决传输无消息边界问题:
第一种方法是发送固定长度的消息。该方法适用于消息长度固定的场合。
第二种方法是将消息长度与消息一起发送。
第三种方法是使用特殊标记分隔消息。
3、套接字SOCKET
Windows Sockets以UNIX中流行的Socket接口为范例定义了一套Microsoft Windows网络编程接口。Windows Sockets规范旨在提供给应用程序开发人员一套简单的API,并让各家网络软件供应商共同遵守。Windows Sockets 1.1和Berkeley Sockets都是基于TCP/IP协议的;Windows Sockets 2从Windows Sockets 1.1发展而来,与协议无关并向下兼容,可以使用任何底层传输协议提供的通信能力,来为上层应用程序完成网络数据通信,而不用关心底层网络链路通信的情况,真正实现了底层网络通信对应用程序的透明。
套接字有两种不同的类型:流套接字和数据报套接字。
TCP/IP的Socket则提供3种类型的套接字
(1)流式套接字(SOCK_STREAM)
提供面向连接、可靠的数据传输服务,数据无差错、无重复的发送,且按发送顺序接收。内设流量控制,避免数据流超限;数据被看作是字节流,无长度限制。文件传输 协议(FTP)即使用流式套接字。
(2)数据报式套接字(SOCK_DGRAM)
提供无连接服务。数据包以独立包形式发送,不提供无差错保证,数据可能丢失或重复,并且接收顺序混乱。网络文件系统(NFS)使用数据报式套接字。
(3)原始套接字(SOCK_RAW)
该接口允许对较低层协议,如IP、ICMP直接访问。常用于检验新的协议实现或访问现有服务中配置的新设备。
套接字编程原理
服务器端程序执行步骤如下。
(1)打开一个通信通道并告知本地主机,它愿意在某一地址和端口上接收客户请求。
(2)等待客户请求到达该端口。
(3)接收到重复服务请求,处理该请求并发送应答信号。接收到并发服务请求,激活一个新的进程(或线程)来处理这个客户请求。新进程(或线程)处理此客
户请求, 并不需要对其他请求作出应答。服务完成后,关闭此新进程与客户的通信链路,并终止。
(4)返回第二步,等待另一客户请求。
(5)关闭服务器。
根据连接启动的方式以及本地套接字要连接的目标,套接字之间的连接过程可以分为三个步骤:服务器监听,客户端请求,连接确认
(1)服务器监听
服务器监听时服务器端套接字并不定位具体的客户端套接字,而是处于等待连接的状态,实时监控网络状态。
(2)客户端请求
客户端请求是指由客户端的套接字发出连接请求,要连接的目标是服务器端的套接字。为此,客户端的套接字必须首先描述它要连接的服务器的套接字,指出服务器端
套 接字的地址和端口号,然后再向服务器端套接字提出连接请求。
(3)连接确认
连接确认是指当服务器端套接字监听到(或接收到)客户端套接字的连接请求时,它就响应客户端套接字的请求,建立一个新的线程,把服务器端套接字的描述发给客
户端,一旦客户端确认了此描述,连接就建立好了。而服务器端套接字继续处于监听状态,继续接收其他客户端套接字的连接请求。
以上复制了一大堆,说白了套接字Socket提供的是应用程序和传输层的接口,在这个口外口内我们不需要知道它们干了什么,那是其他层的工作。
.NET程序集提供了两个类对套接字进行了封装:TcpClient 和 TcpListener
从上面图中可以看出TcpClient和TcpListener对套接字进行了封装。从中也可以看出,TcpListener用于接受连接请求,而TcpClient则用于接收和发送流数据。这幅图的意思是TcpListener持续地保持对端口的侦听,一旦收到一个连接请求后,就可以获得一个TcpClient对象,而对于数据的发送和接收都有TcpClient去完成。此时,TcpListener并没有停止工作,它始终持续地保持对端口的侦听状态。
我们考虑这样一种情况:两台主机,主机A和主机B,起初它们谁也不知道谁在哪儿,当它们想要进行对话时,总是需要有一方发起连接,而另一方则需要对本机的某一端口进行侦听。而在侦听方收到连接请求、并建立起连接以后,它们之间进行收发数据时,发起连接的一方并不需要再进行侦听。因为连接是全双工的,它可以使用现有的连接进行收发数据。而我们前面已经做了定义:将发起连接的一方称为客户端,另一段称为服务端,则现在可以得出:总是服务端在使用TcpListener类,因为它需要建立起一个初始的连接。
在上面的链接中有对聊天的三种模式详细介绍
C#网络编程(1)的更多相关文章
- 猫哥网络编程系列:HTTP PEM 万能调试法
注:本文内容较长且细节较多,建议先收藏再阅读,原文将在 Github 上维护与更新. 在 HTTP 接口开发与调试过程中,我们经常遇到以下类似的问题: 为什么本地环境接口可以调用成功,但放到手机上就跑 ...
- python select网络编程详细介绍
刚看了反应堆模式的原理,特意复习了socket编程,本文主要介绍python的基本socket使用和select使用,主要用于了解socket通信过程 一.socket模块 socket - Low- ...
- Linux Socket 网络编程
Linux下的网络编程指的是socket套接字编程,入门比较简单.在学校里学过一些皮毛,平时就是自学玩,没有见识过真正的socket编程大程序,比较遗憾.总感觉每次看的时候都有收获,但是每次看完了之后 ...
- 猫哥网络编程系列:详解 BAT 面试题
从产品上线前的接口开发和调试,到上线后的 bug 定位.性能优化,网络编程知识贯穿着一个互联网产品的整个生命周期.不论你是前后端的开发岗位,还是 SQA.运维等其他技术岗位,掌握网络编程知识均是岗位的 ...
- 浅谈C#网络编程(一)
阅读目录: 基础 Socket编程 多线程并发 阻塞式同步IO 基础 在现今软件开发中,网络编程是非常重要的一部分,本文简要介绍下网络编程的概念和实践. Socket是一种网络编程接口,它是对传输层T ...
- C++11网络编程
Handy是一个简洁优雅的C++11网络库,适用于linux与Mac平台.十行代码即可完成一个完整的网络服务器. 下面是echo服务器的代码: #include <handy/handy.h&g ...
- Java - 网络编程
Java的网络编程学习,关于计算机基础的学习参考:计算机网络基础学习 - sqh. 参考:
- Linux网络编程-IO复用技术
IO复用是Linux中的IO模型之一,IO复用就是进程预先告诉内核需要监视的IO条件,使得内核一旦发现进程指定的一个或多个IO条件就绪,就通过进程进程处理,从而不会在单个IO上阻塞了.Linux中,提 ...
- Python Socket 网络编程
Socket 是进程间通信的一种方式,它与其他进程间通信的一个主要不同是:它能实现不同主机间的进程间通信,我们网络上各种各样的服务大多都是基于 Socket 来完成通信的,例如我们每天浏览网页.QQ ...
- iOS网络编程
今天的重点是UIWebView.NSURLSession.JSon. 网络编程联网准备:1.在Info.plist中添加AppTransportSecurity类型Dictionary:2.在AppT ...
随机推荐
- java 类从哪个jar包加载的
<%@page contentType="text/html; charset=GBK"%><%@page import="java.security. ...
- sql 自定义函数-16进制转10进制
做过笔记,好记性不如烂笔头: if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[HEXTOINT]') and ...
- (转载)Java NIO:NIO原理分析(二)
NIO中的两个核心对象:缓冲区和通道,在谈到缓冲区时,我们说缓冲区对象本质上是一个数组,但它其实是一个特殊的数组,缓冲区对象内置了一些机制,能够跟踪和记录缓冲区的状态变化情况,如果我们使用 ...
- DataTables手动带参数提交至服务器
一:参数传递及接收 JavaScript: 黄背景部分为参数传递关键 <script type="text/javascript"> var table; var de ...
- 前端开发中的一些chrome插件推荐
这篇博客推荐的都是谷歌chrome浏览器插件,理论上,与之相同内核的浏览器都能使用.由于是谷歌插件,所以在天朝的网络,你懂的! 红杏 专为 学者 .程序员.外贸工作者 打造的上网加速器.我们相信,上网 ...
- 如何更好的理解(pageX,pageY,clientX,clientY,eventX,eventY,scrollX,scrollY,screenX,screenY,event.offsetX,event.offsetY,offsetLeft,style.left)
1 pageX,pageY:鼠标指针相对于当前窗口的X,Y坐标,计算区域包括窗口自身的控件和滚动条.(火狐特有) 2 event.clientX,event.clientY:鼠标指针相对于当前窗口的X ...
- 每天一道LeetCode--206. Reverse Linked List
Reverse a singly linked list. package cn.magicdu; import cn.magicdu.extra.ListNode; public class _20 ...
- 自定义实现简单的Android颜色选择器(附带源码)
在写Android App过程中需要一个简单的颜色选择器,Android自带的ColorPicker和网上的一些ColorPicker都太高端了,都实现了颜色渐变功能,我要的不需要那么复杂,只想提供几 ...
- CSS之生成全屏背景图片
在CSS中背景图片的填充方法: background-position:x,y(背景图片x,y轴的定位) background-repeat:no-repeat(不平铺) background-rep ...
- 风云CM - 算法分析 & genkey实现
// 风云CM分析 // 计算用户名 00402D8A |> \8D45 F8 LEA EAX, [LOCAL.2] 00402D8D |. 50 PUSH EAX 00402D8E |. E8 ...