十二 Java_网络编程

网络编程是指编写运行在多个设备(计算机)的程序,这些设备都通过网络连接起来。java.net 包中 J2SE 的 API 包含有类和接口,它们提供低层次的通信细节。你可以直接使用这些类和接口,来专注于解决问题,而不用关注通信细节。java.net 包中提供了两种常见的网络协议支持:
1.TCP:传输控制协议的缩写,保障两个应用程序之间的可靠通信。通常用于互联网协议,被称 TCP / IP。
2.UDP:是用户数据报协议的缩写,一个无连接的协议。提供了应用程序之间要发送的数据的数据包。

Socket 编程

工作流程

套接字使用TCP提供了两台计算机之间的通信机制。 客户端程序创建一个套接字,并尝试连接服务器的套接字。当连接建立时,服务器会创建一个 Socket 对象。客户端和服务器现在可以通过对 Socket 对象的写入和读取来进行通信。
在这里插入图片描述
java.net.Socket 类代表一个套接字,并且 java.net.ServerSocket 类为服务器程序提供了一种监听客户端,并与其建立连接的机制。在两台计算机之间使用套接字建立TCP连接时步骤如下:
在这里插入图片描述

编程实例

客户端输入正方形的边长,服务器端接收到后计算面积并返回给客户端。
实现一:通过服务器端程序和客户端程序是一对一的关系
实现二:让一个服务器端程序能同时为多个客户提供服务,可以使用多线程机制,每个客户端的请求都由一个独立的线程进行处理
具体实现参考:https://www.cnblogs.com/midiyu/p/7875574.html

ServerSocket 类方法

服务器应用程序通过使用 java.net.ServerSocket 类以获取一个端口,并且侦听客户端请求。构造方法及常用方法如下:
构造方法:
(没有抛出异常表示应用程序已经成功绑定到指定的端口,并且侦听客户端请求)
public ServerSocket(int port) 创建绑定到特定端口的服务器套接字。
public ServerSocket(int port, int backlog) 利用指定的 backlog 创建服务器套接字并将其绑定到指定的本地端口号。
public ServerSocket(int port, int backlog, InetAddress address) 使用指定的端口、侦听 backlog 和要绑定到的本地 IP 地址
创建服务器。
public ServerSocket() 创建非绑定服务器套接字

常用方法:
public int getLocalPort() 返回此套接字在其上侦听的端口
public Socket accept() 侦听并接受到此套接字的连接
public void setSoTimeout(int timeout) 通过指定超时值启用/禁用 SO_TIMEOUT,以毫秒为单位
public void bind(SocketAddress host, int backlog) 将 ServerSocket 绑定到特定地址(IP 地址和端口号)

Socket类

java.net.Socket 类代表客户端和服务器都用来互相沟通的套接字。客户端通过实例化获取一个 Socket 对象,而服务器通过accept()的返回值获得一个Socket对象。
构造方法:
(构造方法返回并非简单的实例化一个 Socket 对象,还会尝试连接到指定的服务器和端口)
public Socket(String host, int port) 创建一个流套接字并将其连接到指定主机上的指定端口号。
public Socket(InetAddress host, int port) 创建一个流套接字并将其连接到指定 IP 地址的指定端口。
public Socket(String host, int port,
InetAddress localAddress, int localPort) 创建一个套接字并将其连接到指定远程主机上的指定远程端口
public Socket(InetAddress host, int port, InetAddress localAddress, int localPort) 创建一个套接字并将其连接到指定远程地址上的指定远程端口。
public Socket() 通过系统默认类型的 SocketImpl 创建未连接套接字

常用方法:
(注:客户端和服务器端都有一个Socket对象,故客户端和服务端都能够调用这些方法。)
public void connect(SocketAddress host, int timeout) 将此套接字连接到服务器,并指定一个超时值。
public InetAddress getInetAddress() 返回套接字连接的地址
public int getPort() 返回此套接字连接到的远程端口
public int getLocalPort() 返回此套接字绑定到的本地端口
public SocketAddress getRemoteSocketAddress() 返回此套接字连接端点的地址,如果未连接则返回 null
public InputStream getInputStream() 返回此套接字的输入流。
public OutputStream getOutputStream() 返回此套接字的输出流。
public void close() 关闭此套接字

InetAddress类

这个类表示互联网协议(IP)地址。下面列出了 Socket 编程时比较有用的方法:
static InetAddress getByAddress(byte[] addr) 给定了原始IP地址时,返回 InetAddress 对象
static InetAddress getByAddress(String host, byte[] addr) 根据提供的主机名和 IP地址创建 InetAddress
static InetAddress getByName(String host) 在给定主机名的情况下确定主机的 IP 地址。
String getHostAddress() 返回 IP 地址字符串(以文本表现形式)。
String getHostName() 获取此 IP 地址的主机名。
static InetAddress getLocalHost() 返回本地主机
String toString() 将此 IP 地址转换为 String。

URL 处理-待续

概念理解

1、同步和异步的理解(针对应用程序和内核的交互而言)
同步
是用户进程触发IO 操作并等待或者轮询的去查看IO 操作是否就绪
银行取款为例:亲自持银行卡到银行取钱(使用同步 IO 时,Java 自己处理IO 读写);

异步
是指用户进程触发IO 操作以后便开始做自己的事情,而当IO 操作已经完成的时候会得到IO 完成的通知。
银行取款为例:
委托他人拿银行卡到银行取钱再给你(使用异步IO 时,Java 将 IO 读写委托给OS 处理,需要将数据缓冲区地址和大小传给OS(银行卡和密码),OS 需要支持异步IO操作API);

2、阻塞和非阻塞的理解(针对进程在访问数据时,根据IO操作的就绪状态来采取的不同方式)
阻塞
读取或者写入函数将一直等待
银行取款为例:ATM排队取款,只能等待(使用阻塞IO时,Java调用会一直阻塞到读写完成才返回);

非阻塞
读取或者写入方法会立即返回一个状态值
银行取款为例:
柜台取款,取个号,然后坐在椅子上做其它事,等广播通知你办理,没到号你就不能去,期间可询问大堂经理排到了没有,大堂经理如果说还没到你就不能去(使用非阻塞IO时,如果不能读写Java调用会马上返回,当IO事件分发器通知可读写时再继续进行读写,不断循环直到读写完成)

3、BIO编程(Blocking IO-同步阻塞的编程方式,常用于JDK1.4版本之前)
实现过程
首先在服务端启动一个ServerSocket来监听网络请求,
客户端启动Socket发起网络请求,默认情况下ServerSocket会建立一个线程处理此请求,
如果服务端没有线程可用,客户端则会阻塞等待或遭到拒绝。
建立好的连接在通讯过程中是同步的。在并发处理效率上比较低
特点
同步并阻塞,服务器实现模式为一个连接一个线程,即客户端有连接请求时服务器端就需要启动一个线程进行处理,如果这个连接不做任何事情会造成不必要的线程开销,当然可以通过线程池机制改善。
应用
BIO方式适用于连接数目比较小且固定的架构,这种方式对服务器资源要求比较高,并发局限于应用中,JDK1.4以前的唯一选择,但程序直观简单易理解。

4、NIO编程(Unblocking IO(New IO)-同步非阻塞的编程方式。)
简介
NIO本身是基于事件驱动思想来完成的,其主要想解决的是BIO的大并发问题,NIO基于Reactor,当socket有流可读或可写入socket时,操作系统会相应的通知应用程序进行处理,应用再将流读取到缓冲区或写入操作系统。也就是说,这个时候,已经不是一个连接就要对应一个处理线程了,而是有效的请求,对应一个线程,当连接没有数据时,是没有工作线程来处理的。

特点
当一个连接创建后,不需要对应一个线程,这个连接会被注册到多路复用器上面,所以所有的连接只需要一个线程就可以搞定,当这个线程中的多路复用器进行轮询的时候,发现连接上有请求的话,才开启一个线程进行处理,也就是一个请求一个线程模式。
在NIO的处理方式中,当一个请求来的话,开启线程进行处理,可能会等待后端应用的资源(JDBC连接等),其实这个线程就被阻塞了,当并发上来的话,还是会有BIO一样的问题

5、AIO编程(Asynchronous IO-异步非阻塞的编程方式)
简介
读写操作时,只须直接调用API的read或write方法即可。这两种方法均为异步的。
对于读操作而言,当有流可读取时,操作系统会将可读的流传入read方法的缓冲区,并通知应用程序;
对于写操作而言,当操作系统将write方法传递的流写入完毕时,操作系统主动通知应用程序。即可以理解为,read/write方法都是异步的,完成后会主动调用回调函数。
在JDK1.7中,这部分内容被称作NIO.2,主要在java.nio.channels包下增加了如下四个异步通道:
AsynchronousSocketChannel、
AsynchronousServerSocketChannel、
AsynchronousFileChannel、
AsynchronousDatagramChannel

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值