《Kotlin从小白到大牛》第23章:网络编程

第23章 网络编程

现代的应用程序都离不开网络,网络编程是非常重要的技术。Kotlin标准库网络编程源自于Java提供java.net包,其中包含了网络编程所需要的最基础一些类和接口。这些类和接口面向两个不同的层次:
1.基于Socket的低层次网络编程。Socket采用TCP、UDP等协议,这些协议属于低层次的通信协议,编程过程比较复杂。
2.基于URL的高层次网络编程。URL采用HTTP和HTTPS这些属于高层次的通信协议,相对低层编程过程比较容易。
所谓低层次网络编程并不等于它功能不强大。恰恰相反,正因为层次低,Socket编程与基于URL的高层次网络编程比较,能够提供更强大的功能和更灵活的控制,但是要更复杂一些。
本章会介绍基于Socket的低层次网络编程和基于URL的高层次网络编程,以及数据交换格式。

23.1 网络基础

网络编程需要程序员掌握一下基础的网络知识,这一节先介绍一些网络基础知识。

23.1.1 网络结构
首先了解一下网络结构,网络结构是网络的构建方式,目前流行的有客户端服务器结构网络和对等结构网络。
1.客户端服务器结构网络
客户端服务器(Client Server,缩写C/S)结构网络,是一种主从结构网络。如图23-1所示,服务器一般处于等待状态,如果有客户端请求,服务器响应请求建立连接提供服务。服务器是被动的,有点像在餐厅吃饭时候的服务员。而客户端是主动的,像在餐厅吃饭的顾客。
在这里插入图片描述
事实上,生活中很多网络服务都采用这种结构。例如:Web服务、文件传输服务和邮件服务等。虽然它们存在的目的不一样,但基本结构是一样的。这种网络结构与设备类型无关,服务器不一定是电脑,也可能是手机等移动设备。
2.对等结构网络
对等结构网络也叫点对点网络(Peer to Peer,缩写P2P),每个节点之间是对等的。它们如图23-2所示,每个节点既是服务器又是客户端,这种结构有点像吃自助餐。
在这里插入图片描述
对等结构网络分布范围比较小。通常在一间办公室或一个家庭内,因此它非常适合于移动设备间的网络通讯,网络链路层是由蓝牙和WiFi实现。

23.1.2 TCP/IP协议
网络通信会用到协议,其中TCP/IP协议是非常重要的。TCP/IP协议是由IP和TCP两个协议构成的,IP(Internet Protocol)协议是一种低级的路由协议,它将数据拆分成许多小的数据包中,并通过网络将它们发送到某一特定地址,但无法保证都所有包都抵达目的地,也不能保证包的顺序。
由于IP协议传输数据的不安全性,网络通信时还需要TCP协议,传输控制协议(Transmission Control Protocol,TCP)是一种高层次的协议,面向连接的可靠数据传输协议,如果有些数据包没有收到会重发,并对数据包内容准确性检查并保证数据包顺序,所以该协议保证数据包能够安全地按照发送时顺序送达目的地。

23.1.3 IP地址
为实现网络中不同计算机之间的通信,每台计算机都必须有一个与众不同的标识,这就是IP地址,TCP/IP使用IP地址来标识源地址和目的地址。最初所有的IP地址都是32位数字构成,由4个8位的二进制数组成,每8位之间用圆点隔开,如:192.168.1.1,这种类型的地址通过IPv4指定。而现在有一种新的地址模式称为IPv6,IPv6使用128位数字表示一个地址,分为8个16位块。尽管IPv6比IPv4有很多优势,但是由于习惯的问题,很多设备还是采用IPv4。不过Kotlin语言同时指出IPv4和IPv6。
在IPv4地址模式中IP地址分为A、B、C、D和E等5类。
o A类地址用于大型网络,地址范围:1.0.0.1~126.155.255.254。
o B类地址用于中型网络,地址范围:128.0.0.1~191.255.255.254。
o C类地址用于小规模网络,192.0.0.1~223.255.255.254。
o D类地址用于多目的地信息的传输和作为备用。
o E类地址保留仅作实验和开发用。
另外,有时还会用到一个特殊的IP地址127.0.0.1,127.0.0.1称为回送地址,指本机。主要用于网络软件测试以及本地机进程间通信,使用回送地址发送数据,不进行任何网络传输,只在本机进程间通信。

23.1.4 端口
一个IP地址标识这一台计算机,每一台计算机又有很多网络通信程序在运行,提供网络服务或进行通信,这就需要不同的端口进行通信。如果把IP地址比作电话号码,那么端口就是分机号码,进行网络通信时不仅要指定IP地址,还要指定端口号。
TCP/IP系统中的端口号是一个16位的数字,它的范围是0~65535。小于1024的端口号保留给预定义的服务,如HTTP是80,FTP是21,Telnet是23,Email是25等,除非要和那些服务进行通信,否则不应该使用小于1024的端口。

23.2 TCP Socket低层次网络编程
TCP/IP协议的传输层有两种传输协议:TCP(传输控制协议)和 UDP(用户数据报协议)。TCP是面向连接的可靠数据传输协议。TCP通信过程类似于打电话,电话接通后双方才能通话,在挂断电话之前,电话一直占线。TCP连接一旦建立起来,一直占用,直到关闭连接。另外,TCP为了保证数据的正确性,会重发一切没有收到的数据,还会对进行数据内容进行验证,并保证数据传输的正确顺序。因此TCP协议对系统资源的要求较多。
基于TCP Socket编程很有代表性,先介绍TCP Socket编程。

23.2.1 TCP Socket通信概述
Socket是网络上的两个程序,通过一个双向的通信连接,实现数据的交换。这个双向链路的一端称为一个Socket。Socket通常用来实现客户端和服务端的连接。Socket是TCP/IP协议的一个十分流行的编程接口,一个Socket由一个IP地址和一个端口号唯一确定,一旦建立连接Socket还会包含本机和远程主机的IP地址和远端口号,如图23-3所示,Socket是成对出现的。
在这里插入图片描述
23.2.2 TCP Socket通信过程
使用Socket进行C/S结构编程,通信过程如图23-4所示。
在这里插入图片描述
服务器端监听某个端口是否有连接请求,服务器端程序处于阻塞状态,直到客户端向服务器端发出连接请求,服务器端接收客户端请求,服务器会响应请求,处理请求,然后将结果应答给客户端,这样就会建立连接。一旦连接建立起来,通过Socket可以获得输入输出流对象。借助于输入输出流对象就可以实现服务器与客户端的通信,最后不要忘记关闭Socket和释放一些资源(包括:关闭输入输出流)。

23.2.3 Socket类
java.net包为TCP Socket编程提供了两个核心类:Socket和ServerSocket,分别用来表示双向连接的客户端和服务器端。
本节先介绍一下Socket类,Socket常用的构造函数有:
o Socket(address: InetAddress!, port: Int)。创建Socket对象,并指定远程主机IP地址和端口号。
o Socket(address: InetAddress!, port: Int, localAddr: InetAddress!,
localPort: Int)。创建Socket对象,并指定远程主机IP地址和端口号,以及本机的IP地址(localAddr)和端口号(localPort)。
o Socket(host: String!, port: Int)。创建Socket对象,并指定远程主机名和端口号,IP地址为null,null表示回送地址,即127.0.0.1。
o Socket(host: String!, port: Int, localAddr: InetAddress!, localPort:
Int)。创建Socket对象,并指定远程主机和端口号,以及本机的IP地址(localAddr)和端口号(localPort)。host主机名,IP地址为null,null表示回送地址,即127.0.0.1。
在这里插入图片描述
Socket其他的常用函数和属性有:
o getInputStream()函数。通过此Socket返回输入流对象。
o getOutputStream()函数。通过此Socket返回输出流对象。
o port: Int属性。返回Socket连接到的远程端口。
o localPort属性。返回Socket绑定到的本地端口。
o inetAddress属性。返回Socket连接的地址。
o localAddress属性。返回Socket绑定的本地地址。
o isClosed属性。返回Socket是否处于关闭状态。
o isConnected属性。返回Socket是否处于连接状态。
o close()函数。关闭Socket。
在这里插入图片描述
23.2.4 ServerSocket类
ServerSocket类常用的构造函数:
o ServerSocket(port: Int, maxQueue: Int)。创建绑定到特定端口的服务器Socket。maxQueue设置连接的请求最大队列长度,如果队列满时,则拒绝该连接。默认值是50。
o ServerSocket(port:

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值