套接字,客户端连接服务器,作为进程通讯机制,是基于描述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)--网络编程的更多相关文章

  1. 黑马程序员:Java基础总结----网络编程

    黑马程序员:Java基础总结 网络编程   ASP.Net+Android+IO开发 . .Net培训 .期待与您交流! 网络编程 网络通讯要素 . IP地址 . 网络中设备的标识 . 不易记忆,可用 ...

  2. GO学习-(19) Go语言基础之网络编程

    Go语言基础之网络编程 现在我们几乎每天都在使用互联网,我们前面已经学习了如何编写Go语言程序,但是如何才能让我们的程序通过网络互相通信呢?本章我们就一起来学习下Go语言中的网络编程. 关于网络编程其 ...

  3. python渗透测试入门——基础的网络编程工具

    <Python黑帽子--黑客与渗透测试编程之道学习>这本书是我在学习安全的过程中发现的在我看来十分优秀的一本书,业内也拥有很高的评价,所以在这里将自己的学习内容分享出来. 1.基础的网络编 ...

  4. 黑马程序员_Java基础:网络编程总结

    ------- android培训.java培训.期待与您交流! ---------- Java语言是在网络环境下诞生的,它是第一个完全融入网络的语言,虽然不能说它是对支持网络编程做得最好的语言,但是 ...

  5. java基础知识——网络编程、IO流

    IO流 字节流:处理字节数据的流对象,计算机中最小数据单元就是字节.InputStream OutputStream 字符流:字符编码问题,将字节流和编码表封装成对象就是字符流.Reader Writ ...

  6. 周末班:Python基础之网络编程

    一.楔子 你现在已经学会了写python代码,假如你写了两个python文件a.py和b.py,分别去运行,你就会发现,这两个python的文件分别运行的很好.但是如果这两个程序之间想要传递一个数据, ...

  7. python基础(29):网络编程(软件开发架构、网络基础、套接字初使用)

    1. 软件开发架构 我们了解的程序之间通讯的应用可分为两种: 第一种是应用类:qq.微信.百度网盘.腾讯视频这一类是属于需要安装的桌面应用. 第二种是web类:比如百度.知乎.博客园等使用浏览器访问就 ...

  8. Java基础之网络编程

    网络编程:1.网络编程概述 (1)网络模型 OSI参考模型 TCP/IP参考模型 (2)网络通讯要素 IP地址 端口号 传输协议 (3)网络通讯前提: **找到对方IP **数据要发送到指定端口.为了 ...

  9. 黑马程序员——JAVA基础之网络编程

    ------Java培训.Android培训.iOS培训..Net培训.期待与您交流! ------- 网络编程 网络模型:OSI参考模型和TCP/IP参考模型 网络通讯三要素: IP地址:InetA ...

  10. 阶段01Java基础day25网络编程

    26.01_网络编程(网络编程概述) A:计算机网络 是指将地理位置不同的具有独立功能的多台计算机及其外部设备,通过通信线路连接起来,在网络操作系统,网络管理软件及网络通信协议的管理和协调下,实现资源 ...

随机推荐

  1. Elasticsearch升级1.5版本暴露jdk的bug

    把测试环境的Elasticsearch升级到1.5.1版本,启动的时候报错: [root@node2 elasticsearch-1.5.1]# bin/service/elasticsearch s ...

  2. 《IT蓝豹》PlayNewsStandDemo资讯类新闻客户端框架

    PlayNewsStandDemo资讯类新闻客户端框架,支持tab滑动切换,当切换到最左边或者最后边的时候停止滑动 本例子切换tab的效果根据AccelerateDecelerateInterpola ...

  3. webstorm 2016 激活(转)

    2016.2.2 版本的破解方式: 安装以后,打开软件会弹出一个对话框:选择"license server" 输入:http://114.215.133.70:41017 2016 ...

  4. cf732f

    思路:先缩点,再以最大连同分量为根dfs,代码太垃圾不想贴

  5. springbootboot-HttpServletRequest.getInputStream() 获取post内容

    问题描述: 在php端用curl post一段json到java springboot.在java端用request.getInputStream()获取到的数据为空. 问题确认: 询问度娘后, 她告 ...

  6. c++学习笔记01-输入输出流&&文件输入输出操作

    const int size=50等于#define size 50 字符串默认以0结尾: 一.输入输出流 cin.get()会从输入中取走一个字符: cin.peek()会从输入中检测第一个字符: ...

  7. linux whoami命令

    whoami显示的是当前"操作用户"的用户名.

  8. tmux 操作

    http://www.cnblogs.com/congbo/archive/2012/08/30/2649420.html https://www.digitalocean.com/community ...

  9. let it be

    回家路上听到电台里主持人在介绍这首歌,听得我两眼模糊,真的太应最近的心情了. let it be.

  10. 关于representation的理解

    目前见过的定义的比较确切的是Yoshua Bengio在ACL2010的一篇paper中关于word representation的定义: " A word Representation i ...