Java网络编程

网络编程

所谓计算机网络,就是把分布在不同地理区域的计算机与专门的外部设备用通信线路互连成一个规模大、功能强的网络系统,从而使众多的计算机可以方便地互相传递消息,共享硬件、软件、数据信息等资源。

计算机网络提供以下功能:

  • 资源共享
  • 信息传输与集中处理
  • 均衡负荷与分布处理
  • 综合信息服务

计算机网络中实现通信必须有一些约定,这些约定被称为通信协议。通信协议负责对传输速率

传输代码、代码结构、传输控制步骤、出错控制等制定处理标准。通信协议由三部分组成:语义部分,用于决定双方的对话类型;二是语法部分,用于决定双方的对话格式;三是变换规则,用于决定通信双方的应答关系。

OSI:开放系统互连参考模型

在这里插入图片描述

IP地址与端口号

IP地址用于唯一的标识网络中的一个通信实体,这个通信实体既可以是一台主机,也可以是一台打印机,或者是路由器的某个端口。在基于IP协议网络中传输的数据包,都必须使用IP地址来进行标识。

IP地址是数字型的,IP地址是一个32位整数,例如202.9.128.88。

端口是一个16位的整数,用于表示数据交给哪个通信程序处理。端口就是应用程序与外界交流的出入口,是一种抽象数据结构,包括一些数据结构和I/O缓冲区。

  • 公认端口:从0到1023,绑定一些特定的服务
  • 注册端口:从1024到49151,应用程序一般使用这个端口
  • 动态或/和私有端口:从49152到65535,这些端口是应用程序使用的动态端口,一般不会主动使用。
Java的基本网络支持

java.net包

InetAress类代表IP地址,有两个子类:Inet4Address代表Ipv4,Inet6Adress代表Ipv6。

InetAdress无构造器,提供如下两个静态方法来获取实例:

  • getByName(String host):根据主机获取相应的InetAddress对象。
  • getByAddress(byte[] addr):根据原始IP地址来获取对应的InetAddress对象。

提供三个方法来来获取InetAddress实例对应的IP地址和主机名。

  • String getCanonicalHostName():获取此IP地址的权限定域名。

  • String getHostAddress():返回该InetAddress实例对应的IP地址字符串。

  • String getHostName(): 获取此IP地址的主机名。

  • getLocalHost()方法:获取本机IP地址对应的InetAddress实例。

  • isReachable:用于测试是否可达该地址。

URLDecoder和URLEncoder用于完成普通字符串和application/x-www-form-urlencoded MIME之间的转换,每个中文字符将转换成%XX%XX的形式。

URL

URL对象代表统一资源定位器,它是指向互联网“资源”的指针。

URL可以由协议名、主机、端口和资源组成。

protocol://host:port/resourceName
  • String getFile():获取该URL的资源名。
  • String getHost():获取该URL的主机名。
  • String getPath():获取该URL的路径部分。
  • int getPort():获取该URL的端口号。
  • String getProtocol():获取该URL的协议名称。
  • String getQuery():获取该URL的查询字符串部分。
  • URLConnection openConnection():返回一个URLConnection对象,他代表了与URL所引用的远程对象的连接。
  • InputStream openStream():打开与此URL的连接,并返回一个用于读取该URL资源的InputStream。

Java 8新增URLPermission工具类,用于管理HttpURLConnection的权限问题。

通常创建一个和URL的连接,并发送请求、读取此URL引用的资源需要如下几个步骤:

  • 通过调用URL对象的openConnection()方法来创建URLConnection对象。

  • 设置URLConnection的参数和普通请求属性

  • 如果只是发送GET请求,则使用connect()方法建立和远程资源之间的实际连接即可;如果需要发送POST方式的请求,则需要获取URLConnection实例对应的输出流来发送请求参数。

  • 远程资源变为可用,程序可以访问远程资源的头字段或通过输入流读取远程资源的数据。

    基于TCP协议的网络编程

在这里插入图片描述

使用ServerSocket创建TCP服务器端

Java使用Socket对象来代表两端的通信端口,并通过Socket产生IO流来进行网络通信。Java能接受其他通信实体连接请求的类是ServerSocket,ServerSocket对象用于监听来自客户端的Socket连接,如果没有连接,它将一直处于等待状态。ServerSocket包含一个监听来自客户端连接请求的方法。

Socket accept():如果接收到一个客户端Socket的连接请求,该方法将返回一个与客户端Socket对应的Socket;否则该方法将一直处于等待状态,线程也被阻塞。

构造方法:

ServerSocket(int port)、ServerSocket(int port, int backlog)、ServerSocket(int port, int backlog, InetAddress localAddr):在机器存在多个IP地址的情况下,允许通过localAddr参数来指定将ServerSocket绑定到指定的IP地址。

使用Socket进行通信

客户端可以使用Socket的构造器来连接到指定服务器:

  • Socket(InetAdress/String remoteAddress, int port):创建连接到指定远程主机、远程端口的Socket,该构造器没有指定本地地址,本地端口,默认使用本地主机的默认IP地址,默认使用系统动态分配的端口。
  • Socket(InetAddress/String remoteAddress, int port, InetAddress localAddr, int localPort):创建连接到指定远程主机、远程端口的Socket,并指定本地IP地址和本地端口,适用于本地主机有多个IP地址的情形。

Socket提供如下两个方法来获取输入流和输出流

  • InputStream getInputStream():返回该Socket对象对应的输入流,让程序通过该输入流从Socket中取出数据。
  • OutputStream getOutputStream():返回该Socket对象对应的输出流,让程序通过该输出流向Socket中输出数据。

半关闭的Socket,只关闭Socket的输入流或者输出流

  • shutdownInput():关闭该Socket的输入流,程序还可通过该Socket的输出流输出数据
  • shutdownOutput(): 关闭该Socket的输出流,程序还可通过该Socket的输入流读取数据
使用NIO实现非阻塞Socket通信

Selector:它是SelectableChannel对象的多路复用器,所有希望采用非阻塞方式进行通信的Channel都应该注册到Selector对象。可以调用此类的open()方法来创建Selector实例。

在这里插入图片描述
服务器上的所有Channel都需要向Selector注册,而该Selector则负责监视这些Socket的IO状态,当其中任意一个或多个Channel具有可用的IO操作时,该Selector的select()方法将会返回大于0的整数,该整数值就表示该Selector上有多少个Channel可用的IO操作,并提供了selectedKeys()方法来返回这些Channel对应的SelectKey集合。正是通过Selector,使得服务器端只需要不断地调用Selector实例的Select()方法,即可知道当前所有Channel是否有需要处理的IO操作。

使用Java 7的AIO实现非阻塞通信

在这里插入图片描述

AsynchronousServerSocketChannel是支持TCP通信的异步Channel,创建可用的AsynchronousServerSocketChannel:

  1. 调用open()静态方法创建AsynchronousServerSocketChannel。
  2. 调用AsynchronousServerSocketChannel的bind()方法让它在指定IP地址、端口监听。
  3. 调用AsynchronousServerSocketChannel的accept()方法接受连接请求。

AsynchronousServerSocketChannel用法:

  1. 调用open()方法创建AsynchronousServerSocketChannel。调用open()方法时同样可指定一个AsynchronousChannelGroup作为分组管理器。
  2. 调用AsynchronousServerSocketChannel的connect()方法连接到指定IP地址、指定端口的服务器。
  3. 调用AsynchronousServerSocketChannel的read()、write()方法进行读写。

AsynchronousServerSocketChannel的connect、read、write()方法都有两个版本:一个返回Future对象的版本,一个需要传入CompletionHandler参数的版本。对于返回Future对象的版本,必须等到Future对象的get()方法返回时IO操作才真正完成;对于需要传入CompletionHandler参数的版本,则可通过CompletionHandler在IO操作完成时触发相应的方法。

基于UDP协议的网络编程

UDP协议用来支持那些需要在计算机之间传输数据的网络连接,一种面向非连接的协议,面向非连接值得是在正式通信前不必与对方先建立连接,不管对方状态就直接发送。主要作用是完成网络数据流和数据报之间的转换–在信息的发送端,UDP协议将网络数据流封装成数据报,然后将数据报发送出去;在信息的接受端,UDP协议将数据报转换成实际数据内容。

UDP协议与TCP协议简单对比如下;

TCP协议:可靠,传输大小无限制,但是需要连接建立时间,差错控制开销大。

UDP协议:不可靠,差错控制开销小,传输大小限制在64KB以下,不需要建立连接。

Java使用DatagramSocket代表UDP协议的Socket,Datagram本身只是码头,不维护状态,不能产生IO流,它的唯一作用就是接受和发送数据报,Java使用DatagramPacket来代表数据报。

使用MulticastSocket实现多点广播

在这里插入图片描述

当MulticastSocket把一个DatgramPacket发送到多点广播IP地址时,该数据报将被自动广播到加入该地址的所有MulticastSocket。MulticastSocket既可以将数据报发送到多点广播地址,也可以接受其他主机的广播信息。

使用代理服务器

java.net包提供Proxy和ProxySelector类,其中Proxy代表一个代理服务器,ProxySelector代表一个代理选择器。

代理服务器两个功能:

  • 突破自身IP限制,对外隐藏自身IP地址。突破IP自身IP限制包括访问国外受限站点,访问国内特定单位、团体的内部资源。
  • 提高访问速度,代理服务器的缓冲功能可以避免每个用户都直接访问远程主机,从而提高客户端访问速度。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值