socket网络编程和套接字

网络编程就是编写程序使得两台联网的计算机进行数据的交换。套接字是网络传输时使用的软件设备,因此我们可以通过套接字来实现数据传输。

socket编程的基本步骤

由于网络编程中涉及到了两台联网计算机,所以我们将其分为服务器端和客户端,顾名思义,服务器端是用来受理连接请求,客户端是用来请求连接。

服务器端

  • 步骤一:调用socket函数生成套接字。
  • 步骤二:调用bind函数为套接字分配网络地址和端口号。
  • 步骤三:调用listen函数转为可接受请求状态,此时服务端保持监听客户端是否有请求。
  • 步骤四:调用accept函数受理连接请求,在客户端有请求时及时处理。
  • 步骤五:利用write和read函数进行数据的读写操作
  • 步骤六:调用close函数关闭socket套接字

客户端

  • 步骤一:调用socket函数生成套接字。
  • 步骤二:调用connect向服务器端发送连接请求。
  • 步骤三:利用write和read函数进行数据的读写操作
  • 步骤四:调用close函数关闭socket套接字

socket编程中涉及的函数解释

注意: 现在介绍的函数都是在linux环境下使用的,在linux环境中,套接字和文件是一样的,或者说,套接字就是一种特殊的文件而已。

  • socket函数:成功时返回文件描述符,失败时返回-1
#include<sys/socket.h>
int socket(int domain,int type,int protocol);

参数解释如下:
(1)domain:套接字中使用的协议域/协议族(family)信息。目前主要使用的协议族是:PF_INET(IPv4互联网协议族)

(2)type:套接字数据传送的类型。一般来说,比较有代表性的套接字是面向连接的套接字和面向消息的套接字。
①面向连接的套接字(SOCK_STREAM):可靠的,按序传递的,基于字节的面向连接的数据传输方式的套接字。
②面向消息的套接字(SOCK_DGRAM):不可靠的,不按序的,以数据的告诉传送为目的的套接字(无连接的)。

(3)protocol:计算机之间通信的协议信息该参数决定最终使用哪种协议。常用的协议有:IPPROTO_TCP(TCP套接字,面向连接的);IPPROTO_UDP(UDP套接字)。

  • bind函数:成功时返回0,失败时返回-1
#include<sys/socket.h>
int bind(int sockfd,struct sockaddr *myaddr,socklen_t addrlen);

参数解释如下:

(1)sockfd:要分配的IP地址和端口号的套接字的文件描述符。

IP地址包括:IPv4(4字节)和IPv6(16字节),现在主要使用IPv4(IPv6是IPv4的扩展和备用),其IP地址分为网络ID和主机ID,且为了供不同规模的网络使用,分为ABCDE五种IP地址类型。我们可以参考下图(图为借鉴的):

java在try中套接字serversocket什么时候释放 套接字socket编程_文件描述符

A类地址的首字节范围:0-127(以0开头)

B类地址的首字节范围:128-191(以10开头)

C类地址的首字节范围:192-233(以110开头)

(2)myaddr:存有地址信息的结构体变量地址值
(3)addrlen:第二个结构体变量的长度

  • listen函数:成功时返回0,失败时返回-1
#include<sys/socket.h>
int listen(int sockfd,int backlog);

参数解释如下:
(1)sockfd:要监听的socket文件描述符
(2)backlog:创建的socket可以排队的最大连接个数。

  • accept函数:成功时返回文件描述符,失败时返回-1
#include<sys/socket.h>
int accept(int sockfd,struct sockaddr *addr,socklen_t *addrlen);

(1)sockfd:socket文件描述符
(2)addr:客户端的协议地址
(3)addrlen:协议地址的长度。

  • connect函数:成功时返回0,失败时返回-1
#include<sys/socket.h>
int connect(int sockfd,struct sockaddr *serv_addr,socklen_t addrlen);

参数解释如下:
(1)sockfd:客户端的socket文件描述符描述字
(2)serv_addr:服务器的socket地址
(3)addrlen:socket地址的长度。

基于TCP服务端/客户端的关系

java在try中套接字serversocket什么时候释放 套接字socket编程_套接字_02