C# 基础(8)--网络编程
套接字,客户端连接服务器,作为进程通讯机制,是基于描述IP地址和端口,是一个通讯链的句柄,其实质就是两个程序通讯用的。
非常类似于电话插座。双方通话的过程,是一方向电话机发出信号和对方从电话机接受信号的过程,相当于Socket发送数据和从Socket接收数据,通话结束后,一方挂电话相当于关闭Socket,撤销连接。
有两种类型:
流式Socket(Stream)
是一种面向连接的Socket,针对于面向连接的TCP服务应用。安全但效率低。
数据报式(DATAGRAM)
是一种无连接的Socket , 对应于无连接的UDP服务应用,不安全但效率高。
1、 服务端 Welcoming Socket开始监听端口,负责监听客户端连接信息。
2、 客户端 Client Socket连接服务端指定端口,负责接收和发送服务端消息。
3、服务端welcoming Socket 监听到客户端连接,创建Connection Socket,负责和客户通讯。
->服务器端Socket(至少需要2个)
一个负责接收客户端连接数据请求,(但不与客户端通讯)
每成功接收到一个客户端的连接,便在服务器端产生一个对应的Socket。
申请一个Socket
绑定到一个IP和端口上
开启侦听,等待接受连接
->客户端的Socket
必须制定要连接的服务端地址和端口
通过创建一个Socket对象来初始化一个到服务端的TCP连接。
申请一个Socket
接连服务器,指明IP地址和端口号
服务器连接到请求后,产生一个新的Socket,( 端口大于1024),于客户端建立连接并进行通讯,原侦听Socket继续侦听。
在.net下进行网络编程其实也相对比较简单,因为在.NET 类库中已经提供了大量封装好的类。比较底层的类是System.Net.Sockets.Scoket类,这个类提供了丰富的方法和属性,并且还提供了异步数据传输支持。
常见方法:
Public Scoket Accept ();为新连接创建新的Socket
Public void Bind(EndPoint localEP) 使Socket与本地终结点相关联。
Public void Close() 关闭Socket连接并释放所有有关联的资源。
PublicVoid Connect(EndPoint remoteEP)建立于远程主机的连接。
Public void Disconncet(bool reuseSocket) 关闭套接字连接并是否允许重用套接字。
Public void Listen(int backlog) 将Socket置于侦听状态
Public int Receive(byte[] buffer)接收来自绑定的Socket的数据
Public int ReceiveFrom(byte[] buffer,ref EndPoint remoteEP) 接收数据报并存储源终结点。
Public int Send(byte[] buffer) 将数据发送到接连的Socket
Public void SendFile(string FileName) 将文件和可选数据异步发送到连接的Socket
Public int SendTo(byte[] buffer,EndPoint remoteEP)将数据发送到特定的终结点。
Pblic Void Shutdown (SocketShutDown how) 禁用某Socket上的发送和接收。
注意:
在网络传输时,传输的数据都是二进制形式的,表现为字节数组,所以如果要传输类似于中文这样的双字节字符就需要在传输之前用合适的编码转换成字节数组,然后接收方按照发送方的编码将接收到的字节数组转换为字符串,另外,注意接收数据的时候,是先声明一个字节数组,然后接收到的数据保存到字节数组汇总,这个方法有个返回值,表示实际接受了多少字节的数据,这是因为数组是不可变的,加入声明了一大于1024字节的数组,而仅发送1字节数据,而接收方并不直接到发送方发送的数据量,而是把整个1024当做发送的数据发送的话,最终会导致错误。
要实现一个服务器端的面向连接的Socket用于接收客户端的请求的话,有如下步骤:
1) 首先根据IP地址和端口号实例化一个Socket,注意端口要大于1024并且不适用特殊端口号,要大于1024的原因是1024以下的端口号已经被指派了,而1433、3306这样的端口号已经被用作SQL Sever和MySQl的默认端口号了,若指定这些端口号易发生冲突。
2) 接着调用Bind()方法进行绑定,然后再调用Listen()方法用于监听,Listen方法的参数用于指定监听的队列大小,也就是最多可容纳的等待接受的传入的接连数。
3) 再调用Accept()方法,调用这个方法之后会是程序处于阻塞状态,直至有客户端连接为止,当有客户端接连,这个方法将会返回一个新的Socket,使用这个Socket与客户端进行通讯。
4) 使用Accept()方法返回的新的Socket的Send()方法就可以向客户端发送数据了,还可以使用这个新Socket的Receive()接收客户顿的数据。
5) 最后,终止与客户端会话时,注意使用ShutDown()方法关闭Socket连接,并且使用Close方法,释放锁占用的资源。
使用Socket类编写客户端的Socket程序步骤如下:
1) 首先,指定远程主机和端口号实例化Socket类,注意连接的端口号一定要与服务器监听的端口号一致。
2) 接着调用Connect()方法连接远程主机。
3) 连接到远程主机之后就可以调用Send()方法向服务器发送请求了,然后可以调用Receive()方法,接收服务器响应数据,注意如果是发送的类似于中文这样的双字节字符串的话,还需要按照服务器响应的字符串编码将字节数组转换成字符串。
4) 最后终止与客户端会话时,注意使用ShutDown()关闭Socket连接,并且使用Close()方法释放所占用的资源。
需要特别说明的是上面是建立连接式Socket(如建立TCP协议Socket)的一般步骤,如果是建立非连接式Socket(如UDP协议Socket)就不需要进行监听端口了,直接使用ReceiveFrom()方法就能接收来自指定主机端口的数据,用SendTo()方法就能向直接主机端口发送数据。
C# 基础(8)--网络编程的更多相关文章
- 黑马程序员:Java基础总结----网络编程
黑马程序员:Java基础总结 网络编程 ASP.Net+Android+IO开发 . .Net培训 .期待与您交流! 网络编程 网络通讯要素 . IP地址 . 网络中设备的标识 . 不易记忆,可用 ...
- GO学习-(19) Go语言基础之网络编程
Go语言基础之网络编程 现在我们几乎每天都在使用互联网,我们前面已经学习了如何编写Go语言程序,但是如何才能让我们的程序通过网络互相通信呢?本章我们就一起来学习下Go语言中的网络编程. 关于网络编程其 ...
- python渗透测试入门——基础的网络编程工具
<Python黑帽子--黑客与渗透测试编程之道学习>这本书是我在学习安全的过程中发现的在我看来十分优秀的一本书,业内也拥有很高的评价,所以在这里将自己的学习内容分享出来. 1.基础的网络编 ...
- 黑马程序员_Java基础:网络编程总结
------- android培训.java培训.期待与您交流! ---------- Java语言是在网络环境下诞生的,它是第一个完全融入网络的语言,虽然不能说它是对支持网络编程做得最好的语言,但是 ...
- java基础知识——网络编程、IO流
IO流 字节流:处理字节数据的流对象,计算机中最小数据单元就是字节.InputStream OutputStream 字符流:字符编码问题,将字节流和编码表封装成对象就是字符流.Reader Writ ...
- 周末班:Python基础之网络编程
一.楔子 你现在已经学会了写python代码,假如你写了两个python文件a.py和b.py,分别去运行,你就会发现,这两个python的文件分别运行的很好.但是如果这两个程序之间想要传递一个数据, ...
- python基础(29):网络编程(软件开发架构、网络基础、套接字初使用)
1. 软件开发架构 我们了解的程序之间通讯的应用可分为两种: 第一种是应用类:qq.微信.百度网盘.腾讯视频这一类是属于需要安装的桌面应用. 第二种是web类:比如百度.知乎.博客园等使用浏览器访问就 ...
- Java基础之网络编程
网络编程:1.网络编程概述 (1)网络模型 OSI参考模型 TCP/IP参考模型 (2)网络通讯要素 IP地址 端口号 传输协议 (3)网络通讯前提: **找到对方IP **数据要发送到指定端口.为了 ...
- 黑马程序员——JAVA基础之网络编程
------Java培训.Android培训.iOS培训..Net培训.期待与您交流! ------- 网络编程 网络模型:OSI参考模型和TCP/IP参考模型 网络通讯三要素: IP地址:InetA ...
- 阶段01Java基础day25网络编程
26.01_网络编程(网络编程概述) A:计算机网络 是指将地理位置不同的具有独立功能的多台计算机及其外部设备,通过通信线路连接起来,在网络操作系统,网络管理软件及网络通信协议的管理和协调下,实现资源 ...
随机推荐
- SQL Server 数据库的维护(三)__事务(transaction)和锁
--维护数据库-- --事务(transaction)和锁-- --事务(transaction)-- --概述: 事务是指封装了一组T-SQL语句的单个逻辑单元.单元中的所有语句作为一个整体,在满足 ...
- ToolStrip控件在窗体没有焦点的情况下,需要单击二次才能够激发事件的解决办法
protected override void WndProc(ref Message m) { if (m.Msg == 0x210) { Control control = Control.Fro ...
- 关于nagios监控远程服务器对服务器性能影响的测试
1. Nagios监视远程服务器时,是通过在控制端执行以下命令进行数据收集的: /usr/local/nagios/libexec/check_http -I 192.168.16.11 /us ...
- SQL Server执行计划的理解
详细看:http://www.cnblogs.com/kissdodog/p/3160560.html 自己总结: 扫描Scan:逐行遍历数据. 查找Seek:根据查询条件,定位到索引的局部位置,然后 ...
- HTML Meta中添加X-UA-Compatible和IE=Edge,chrome=1有什么作用
你好,这个属性主要是设置浏览器优先使用什么模式来渲染页面的.常见写法如下:<meta http-equiv="X-UA-Compatible" content="I ...
- ArcEngine批量添加XY数据
使用ArcGIS Desktop “添加XY数据”或者“创建XY事件图层”工具 可以导入Excel坐标数据,生成临时图层并添加至ArcMap.ArcGlobe或者ArcScene中.在ArcEngin ...
- Python执行系统命令的方法 os.system(),os.popen(),commands
os.popen():用python执行shell的命令,并且返回了结果,括号中是写shell命令 Python执行系统命令的方法: https://my.oschina.net/renwofei42 ...
- iOS开发中多线程间关于锁的使用
为什么需要使用锁,当然熟悉多线程的你,自然不会感到陌生. 那你在代码中是否很好的使用了锁的机制呢?你又知道几种实现锁的方法呢? main.m 1 int main(int argc, const ch ...
- C语言 值传递和地址传递
不少同学在学到C语言的指针部分时感到很困惑,对经常提到的"值传递"和"地址传递"两个概念弄不 明白.实际上,因为地址本身也可以作为一个特殊的"值&qu ...
- 【Python全栈笔记】05 [模块二] 19 Oct 文件的操作
文件操作 一般步骤1. 文件打开 2. 文件操作 3. 文件关闭 1. 打开文件 使用open(文件名(绝对路径), 打开模式, 编码) 文件打开的模式有: r: 只读模式(默认) w: 只写模式 ...