第十四章:网络编程

2021310

20:56

一、网络编程中有两个主要的问题:

 * 1.如何准确地定位网络上一台或多台主机;定位主机上的特定的应用

 * 2.找到主机后如何可靠高效地进行数据传输

 *

二、网络编程中的两个要素:

 * 1.对应问题一:IP和端口号

 * 2.对应问题二:提供网络通信协议:TCP/IP参考模型(应用层、传输层、网络层、物理+数据链路层

0 引 参 考 模 型 
表 示 层 
会 话 层 
传 输 层 
网 络 层 
数 据 链 路 层 
物 理 层 
网 络 通 信 协 议 
TCP 胛 参 考 模 型 
应 用 层 
传 输 层 
网 络 层 
物 理 + 数 据 链 路 层 
TCP/I P 参 考 模 型 各 层 对 
应 协 议 
HTTP 、 FTP 、 Telnet 、 
DNS. 
TCP 、 U D P 、 
IP 、 ICMP 、 ARP. 
Link

 *

三、通信要素一:IP和端口号

 * 1. IP:唯一的标识 Internet 上的计算机(通信实体)

 * 2. 在Java中使用InetAddress类代表IP

 * 3. IP分类:IPv4 和 IPv6 ; 万维网 和 局域网

 * 4. 域名:   http://www.baidu.com/   http://www.mi.com/  http://www.sina.com/  http://www.jd.com/

 *            http://www.vip.com/

 * 5. 本地回路地址:127.0.0.1 对应着:localhost

 *

 * 6. 如何实例化InetAddress:两个方法:

InetAddress.getByName(String host) IP地址和域名都可以

InetAddress.getLocalHost()

 *        两个常用方法:getHostName() / getHostAddress()

 *

 * 7. 端口号:正在计算机上运行的进程。

 * 要求:不同的进程有不同的端口号

 * 范围:被规定为一个 16 位的整数 0~65535

 *

 * 8. 端口号与IP地址的组合得出一个网络套接字:Socket

 

TCP/IP协议簇

l传输层协议中有两个非常重要的协议:

Ø 传输控制协议TCP(Transmission Control Protocol)

Ø 用户数据报协议UDP(User Datagram Protocol)

lTCP/IP 以其两个主要协议:传输控制协议(TCP)和网络互联协议(IP)而得名,实际上是一组协议,包括多个具有不同功能且互为关联的协议。

lIP(Internet Protocol)协议是网络层的主要协议,支持网间互连的数据通信。

lTCP/IP协议模型从更实用的角度出发,形成了高效的四层体系结构,即物理链路层、IP层、传输层和应用层

 

TCP UDP

l TCP协议:

Ø 使用TCP协议前,须先建立TCP连接,形成传输数据通道

Ø 传输前,采用“三次握手”方式,点对点通信,是可靠的

Ø TCP协议进行通信的两个应用进程:客户端、服务端。

Ø 在连接中可进行大数据量的传输

Ø 传输完毕,需释放已建立的连接效率低

l UDP协议:

Ø 将数据、源、目的封装成数据包,不需要建立连接

Ø 每个数据报的大小限制在64K

Ø 发送不管对方是否准备好,接收方收到也不确认,故是不可靠的

Ø 可以广播发送

Ø 发送数据结束时无需释放资源,开销小,速度快

 

TCP三次握手

客 户 端 发 送 syn 报 文 
首 发 送 序 号 为 X 
客 户 端 发 送 ACK 报 文 、 
首 发 送 序 号 为 Z 
在 确 认 号 为 Y + 1 . 
TC p 三 次 握 手 
服 务 端 发 送 syn + ACK 报 文 
荇 乏 发 送 号 为 Y 
在 确 认 序 号 为 X + 1 
ACK 、 
、 Y+ 7,seq=z

TCP四次挥手

主 动 方 发 送 Fin + A 报 文 
荇 首 发 送 号 为 X 
主 动 方 发 送 k 报 文 
荇 首 发 送 号 为 x 
在 确 认 号 为 Y 
T ( P 四 次 挥 手 
被 动 方 发 送 A ( K 报 文 
卉 首 发 送 号 为 Z 
在 确 认 号 为 X + 1 
: 2 , seq = 
ACK=X*I , seq¯ 
被 动 方 发 送 Fin + A 报 文 
荇 首 发 送 号 为 Y 
在 确 认 号 为 X 
1 ack=%,seq¯y 
CK= y

 

l 通信的两端都要有Socket,是两台机器间通信的端点。

l 网络通信其实就是Socket间的通信。

l Socket允许程序把网络连接当成一个流,数据在两个Socket间通过IO传输。

 

lSocket分类:

Ø流套接字(stream socket):使用TCP提供可依赖的字节流服务

Ø数据报套接字(datagram socket):使用UDP提供“尽力而为”的数据报服务

 

基于SocketTCP编程

l 客户端Socket的工作过程包含以下四个基本的步骤

Ø 创建 Socket根据指定服务端的 IP 地址或端口号构造 Socket 类对象。若服务器端响应,则建立客户端到服务器的通信线路。若连接失败,会出现异常。

Ø 打开连接到 Socket 的输入/出流: 使用 getInputStream()方法获得输入流,使用getOutputStream()方法获得输出流,进行数据传输

Ø 按照一定的协议对 Socket 进行读/写操作:通过输入流读取服务器放入线路的信息(但不能读取自己放入线路的信息),通过输出流将信息写入线程。

Ø 关闭 Socket断开客户端到服务器的连接,释放线路

//1.创建Socket对象,指明服务器端的ip和端口号

InetAddress inet = InetAddress.getByName("127.0.0.1");

Socket socket = new Socket(inet,1111);

//2.获取一个输出流,用于输出数据

OutputStream os = socket.getOutputStream();

System.out.println(os.getClass()); //class java.net.SocketOutputStream

//3.写出数据的操作

os.write("我是客户端,服务器收到请回答!".getBytes());

//4.资源的关闭

os.close();

socket.close();

 

l服务器程序的工作过程包含以下四个基本的步骤:

Ø调用 ServerSocket(int port) 创建一个服务器端套接字,并绑定到指定端口上。用于监听客户端的请求。

Ø调用 accept()监听连接请求,如果客户端请求连接,则接受连接,返回通信套接字对象。

Ø调用 该Socket类对象的 getOutputStream() getInputStream ()获取输出流和输入流,开始网络数据的发送和接收。

Ø关闭ServerSocketSocket对象:客户端访问结束,关闭通信套接字。

//1.创建服务器端的ServerSocket,指明自己的端口号

ServerSocket ss = new ServerSocket(1111);

//2.调用accept()表示接收来自于客户端的socket

Socket socket = ss.accept();

//3.获取输入流

InputStream is = socket.getInputStream();

System.out.println(is.getClass()); //class java.net.SocketInputStream

//4.读取输入流中的数据

ByteArrayOutputStream baos = new ByteArrayOutputStream();

byte[] buffer = new byte[5];

int len;

while ((len = is.read(buffer)) != -1) {

    baos.write(buffer,0,len);

}

System.out.println(baos.toString());

//socket.getInetAddress().getHostAddress()获取socketIP

System.out.println("收到了来自: " + socket.getInetAddress().getHostAddress() + "的消息");

//5.关闭资源

baos.close();

is.close();

socket.close();

ss.close();

 

//客户端发送完数据之后,需要关闭数据的输出。不然会一直处于阻塞状态。

socket.shutdownOutput();

 

UDP网络通信

l DatagramSocket DatagramPacket 实现了基于 UDP 协议网络程序。

l UDP数据报通过数据报套接字 DatagramSocket 发送和接收,系统不保证UDP数据报一定能够安全送到目的地,也不能确定什么时候可以抵达。

l DatagramPacket 对象封装了UDP数据报,在数据报中包含了发送端的IP地址和端口号以及接收端的IP地址和端口号。

l UDP协议中每个数据报都给出了完整的地址信息,因此无须建立发送方和接收方的连接。如同发快递包裹一样。

l 流 程:

1. DatagramSocketDatagramPacket

2. 建立发送端,接收端

3. 建立数据包

4. 调用Socket的发送、接收方法

5. 关闭Socket

l 发送端与接收端是两个独立的运行程序

@Test

public void sender() throws IOException {

    //发送端用空参的

    DatagramSocket socket = new DatagramSocket();

    String s = "我是用UDP发送过来的导弹!";

    byte[] data = s.getBytes();

    InetAddress inetAddress = InetAddress.getByName("127.0.0.1");

 

    //数据源,偏移量,数据长度,接收方地址,接收方端口

    DatagramPacket packet = new DatagramPacket(data,0,data.length,inetAddress,9090);

 

    //socket发送packet

    socket.send(packet);

 

    //关闭socket

    socket.close();

}

 

@Test

public void receiver() throws IOException {

    //服务器需要指定socket的端口号

    DatagramSocket socket = new DatagramSocket(9090);

    //创建一个数组用来接收数据

    //byte[] data = new byte[]{97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97};

    byte[] data = new byte[100];

    //指定packet的存放地址(缓冲区)

    DatagramPacket packet = new DatagramPacket(data,0,data.length);

 

    //socket接收packet

    socket.receive(packet);

 

    //getData()是返回数据缓冲区,即获取到数组中所有的值,getLength()是获取packet收到的数据的长度

    String s = new String(packet.getData(),0,packet.getLength());

    System.out.println(s);

 

    socket.close();

}

 

l URL的基本结构由5部分组成:

<传输协议>://<主机名>:<端口号>/<文件名>#片段名?参数列表

Ø例如:

http://192.168.1.100:8080/helloworld/index.jsp#a?username=shkstart&password=123

Ø#片段名:即锚点,例如看小说,直接定位到章节

Ø参数列表格式:参数名=参数值&参数名=参数值....

URL url = new URL("http://192.168.1.100:8080/helloworld/index.jsp?username=shkstart&password=123");

l一个URL对象生成后,其属性是不能被改变的,但可以通过它给定的方法来获取这些属性:

Øpublic String getProtocol( ) 获取该URL的协议名

Øpublic String getHost( ) 获取该URL的主机名

Øpublic String getPort( ) 获取该URL的端口号

Øpublic String getPath( ) 获取该URL的文件路径

Øpublic String getFile( ) 获取该URL的文件名

Øpublic String getQuery( ) 获取该URL的查询

System.out.println(url.getProtocol()); // http

System.out.println(url.getHost()); // 192.168.1.100

System.out.println(url.getPort()); // 8080

System.out.println(url.getPath()); // /helloworld/index.jsp

System.out.println(url.getFile()); // /helloworld/index.jsp?username=shkstart&password=123

System.out.println(url.getQuery()); // username=shkstart&password=123

 

URLConnection

从网络上下载资源:

URL url = new URL("https://aaa.com/头像/aaa.jpg");

//url.openConnection()建立一个与URL的链接对象

HttpURLConnection urlConnection = (HttpURLConnection)url.openConnection();

 

//建立与URL的连接

urlConnection.connect();

 

//获取输入流

InputStream is = urlConnection.getInputStream();

 

FileOutputStream fos = new FileOutputStream("day10\\头像.jpg");

byte[] buffer = new byte[10];

int len;

while ((len = is.read(buffer)) != -1) {

    fos.write(buffer,0,len);

}

 

//关闭资源

fos.close();

is.close();

//断开连接

urlConnection.disconnect();

 

小 结

l位于网络中的计算机具有唯一的IP地址,这样不同的主机可以互相区分。

l客户端-服务器是一种最常见的网络应用程序模型。服务器是一个为其客户端提供某种特定服务的硬件或软件。客户机是一个用户应用程序,用于访问某台服务器提供的服务。端口号是对一个服务的访问场所,它用于区分同一物理计算机上的多个服务。套接字用于连接客户端和服务器,客户端和服务器之间的每个通信会话使用一个不同的套接字。TCP协议用于实现面向连接的会话。

lJava 中有关网络方面的功能都定义在 java.net 程序包中。Java InetAddress 对象表示 IP地址,该对象里有两个字段:主机名(String) IP 地址(int)

lSocket ServerSocket 实现了基于TCP协议的客户端-服务器程序。Socket是客户端和服务器之间的一个连接,连接创建的细节被隐藏了。这个连接提供了一个安全的数据传输通道,这是因为 TCP 协议可以解决数据在传送过程中的丢失、损坏、重复、乱序以及网络拥挤等问题,它保证数据可靠的传送。

lURL URLConnection 提供了最高级网络应用。URL 的网络资源的位置来同一表示Internet 上各种网络资源。通过URL对象可以创建当前应用程序和 URL 表示的网络资源之间的连接,这样当前程序就可以读取网络资源数据,或者把自己的数据传送到网络上去。

 

202131111:28:16 完结。把结尾拉到上面。

 

结尾

 

使用 Microsoft OneNote 2016 创建。 版权所有:古木苏