网络编程之套接字程序实现(套接字在网络编程中的作用是什么)

http://www.itjxue.com  2023-02-01 19:46  来源:未知  点击次数: 

浅析C#中的套接字编程

大家都知道Java语言的强大功能 尤其在网络编程方面 于是 C#在网络编程方面也自然不甘落后于人 本文就向大家介绍一下C#下实现套接字(Sockets)编程的一些基本知识 以期能使大家对此有个大致了解 首先 我向大家介绍一下套接字的概念  套接字基本概念 套接字是通信的基石 是支持TCP/IP协议的网络通信的基本操作单元 可以将套接字看作不同主机间的进程进行双向通信的端点 它构成了单个主机内及整个网络间的编程界面 套接字存在于通信域中 通信域是为了处理一般的线程通过套接字通信而引进的一种抽象概念 套接字通常和同一个域中的套接字交换数据(数据交换也可能穿越域的界限 但这时一定要执行某种解释程序) 各种进程使用这个相同的域互相之间用Internet协议簇来进行通信  套接字可以根据通信性质分类 这种性质对于用户是可见的 应用程序一般仅在同一类的套接字间进行通信 不过只要底层的通信协议允许 不同类型的套接字间也照样可以通信 套接字有两种不同的类型 流套接字和数据报套接字  套接字工作原理 要通过互联网进行通信 你至少需要一对套接字 其中一个运行于客户机端 我们称之为ClientSocket 另一个运行于服务器端 我们称之为ServerSocket 根据连接启动的方式以及本地套接字要连接的目标 套接字之间的连接过程可以分为三个步骤 服务器监听 客户端请求 连接确认  所谓服务器监听 是服务器端套接字并不定位具体的客户端套接字 而是处于等待连接的状态 实时监控网络状态  所谓客户端请求 是指由客户端的套接字提出连接请求 要连接的目标是服务器端的套接字 为此 客户端的套接字必须首先描述它要连接的服务器的套接字 指出服务器端套接字的地址和端口号 然后就向服务器端套接字提出连接请求  所谓连接确认 是指当服务器端套接字监听到或者说接收到客户端套接字的连接请求 它就响应客户端套接字的请求 建立一个新的线程 把服务器端套接字的描述发给客户端 一旦客户端确认了此描述 连接就建立好了 而服务器端套接字继续处于监听状态 继续接收其他客户端套接字的连接请求 lishixinzhi/Article/program/net/201311/13368

在javasocket网络编程中,开发基于udp协议的程序使用的套接字有哪些

Socket套接字,是由系统提供用于网络通信的技术(操作系统给应用程序提供的一组API叫做Socket API),是基于TCP/IP协议的网络通信的基本操作单元。基于Socket套接字的网络程序开发就是网络编程。

socket可以视为是应用层和传输层之间的通信桥梁;

传输层的核心协议有两种:TCP,UDP;socket API也有对应的两组,由于TCP和UDP协议差别很大,因此,这两组API差别也挺大。

分类:

Socket套接字主要针对传输层协议划分为如下三类:

流套接字:使用传输层TCP协议

TCP,即Transmission Control Protocol(传输控制协议),传输层协议;

TCP的特点:

有连接:像打电话,得先接通,才能交互数据;

可靠传输:传输过程中,发送方知道接收方有没有收到数据.(打电话就是可靠传输);

面向字节流:以字节为单位进行传输.(非常类似于文件操作中的字节流);

全双工:一条链路,双向通信;

有接收缓冲区,也有发送缓冲区。

大小不限

对于字节流来说,可以简单的理解为,传输数据是基于IO流,流式数据的特征就是在IO流没有关闭的情况下,是无边界的数据,可以多次发送,也可以分开多次接收。

数据报套接字:使用传输层UDP协议

UDP,即User Datagram Protocol(用户数据报协议),传输层协议。

UDP的特点:

无连接:像发微信,不需要接通,直接就能发数据;

不可靠传输:传输过程中,发送方不知道接收方有没有收到数据.(发微信就是不可靠传输);

面向数据报:以数据报为单位进行传输(一个数据报都会明确大小)一次发送/接收必须是一个完整的数据报,不能是半个,也不能是一个半;

全双工:一条链路,双向通信;

有接收缓冲区,无发送缓冲区;

大小受限:一次最多传输64k;

对于数据报来说,可以简单的理解为,传输数据是一块一块的,发送一块数据假如100个字节,必须一次发送,接收也必须一次接收100个字节,而不能分100次,每次接收1个字节。

原始套接字

原始套接字用于自定义传输层协议,用于读写内核没有处理的IP协议数据。

二、UDP数据报套接字编程

UDPSocket中,主要涉及到两类:DatagramSocket、DatagramPacket;

DatagramSocket API

DatagramSocket 创建了一个UDP版本的Socket对象,用于发送和接收UDP数据报,代表着操作系统中的一个socket文件,(操作系统实现的功能–)代表着网卡硬件设备的抽象体现。

DatagramSocket 构造方法:

方法签名 方法说明

DatagramSocket() 创建一个UDP数据报套接字的Socket,绑定到本机任意一个随机端口(一般用于客户端)

DatagramSocket(int port) 创建一个UDP数据报套接字的Socket,绑定到本机指定的端口(一般用于服务端)

DatagramSocket 方法:

方法签名 方法说明

void receive(DatagramPacket p) 从此套接字接收数据报(如果没有接收到数据报,该方法会阻塞等待)

void send(DatagramPacket p) 从此套接字发送数据报包(不会阻塞等待,直接发送)

void close() 关闭此数据报套接字

DatagramPacket API

代表了一个UDP数据报,是UDP Socket发送和接收的数据报,每次发送/接收数据报,都是在传输一个DatagramPacket对象。

DatagramPacket 构造方法:

方法签名 方法说明

DatagramPacket(byte[] buf, int length) 构造一个DatagramPacket以用来接收数据报,接收的数据保存在字节数组(第一个参数buf)中,接收指定长度(第二个参数length)

DatagramPacket(byte[] buf, int offset, int length,SocketAddress address) 构造一个DatagramPacket以用来发送数据报,发送的数据为字节数组(第一个参数buf)中,从0到指定长度(第二个参数length)。address指定目的主机的IP和端口号

DatagramPacket 方法:

方法签名 方法说明

InetAddress getAddress() 从接收的数据报中,获取发送端主机IP地址;或从发送的数据报中,获取接收端主机IP地址

int getPort() 从接收的数据报中,获取发送端主机的端口号;或从发送的数据报中,获取接收端主机端口号

byte[] getData() 获取数据报中的数据

构造UDP发送的数据报时,需要传入 SocketAddress ,该对象可以使用 InetSocketAddress 来创建。

InetSocketAddress API

InetSocketAddress ( SocketAddress 的子类 )构造方法:

方法签名 方法说明

InetSocketAddress(InetAddress addr, int port) 创建一个Socket地址,包含IP地址和端口号

示例1:写一个简单的客户端服务程序,回显服务(EchoSever)

在这里插入图片描述

构建Socket对象有很多失败的可能:

端口号已经被占用,同一个主机的两个程序不能有相同的端口号(这就好比两个人不能拥有相同的电话号码);

此处,多个进程不能绑定同一个端口号,但是一个进程可以绑定多个端口,(这就好比一个人可以拥有多个手机号),一个进程可以创建多个Socket对象,每个Socket都绑定自己的端口。

每个进程能够打开的文件个数是有上限的,如果进程之间已经打开了很多文件,就可能导致此时的Socket文件不能顺利打开;

在这里插入图片描述

这个长度不一定是1024,假设这里的UDP数据最长是1024,实际的数据可能不够1024.

在这里插入图片描述

这里的参数不再是一个空的字节数组了,response是刚才根据请求计算的得到的响应,是非空的,DatagramPacket 里面的数据就是String response的数据。

response.getBytes().length:这里拿到的是字节数组的长度(字节的个数),而response.length得到的是字符的长度。

五元组

一次通信是由5个核心信息描述的:源IP、 源端口、 目的IP、 目的端口、 协议类型。

站在客户端角度:

源IP:本机IP;

源端口:系统分配的端口;

目的IP:服务器的IP;

目的端口:服务器的端口;

协议类型:TCP;

站在服务器的角度:

源IP:服务器程序本机的IP;

源端口:服务器绑定的端口(此处手动指定了9090);

目的IP:包含在收到的数据报中(客户端的IP);

目的端口:包含在收到的数据报中(客户端的端口);

协议类型:UDP;

MFC中网络编程,利用套接字的过程。

1调用WSAStartup()函数初始化套接字库;

2调用socket()来创建套接字句柄;

3服务器的话,先用bind()绑定地址信息,在调用liesten()监听设置好的端口,如果请求到来,调用accept()响应请求。如果是客户端,则直接调用connect()连接服务器即可

4调用send()和recv()等功能函数进行数据交换传输处理

5调用closesocket()关闭套接字,WSACleanup()关闭套接字库

(责任编辑:IT教学网)

更多

推荐网站策划文章