第十四章:网络编程
2021年3月10日
20:56
一、网络编程中有两个主要的问题:
* 1.如何准确地定位网络上一台或多台主机;定位主机上的特定的应用
* 2.找到主机后如何可靠高效地进行数据传输
*
二、网络编程中的两个要素:
* 1.对应问题一:IP和端口号
* 2.对应问题二:提供网络通信协议:TCP/IP参考模型(应用层、传输层、网络层、物理+数据链路层)
*
三、通信要素一: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三次握手
TCP四次挥手
l 通信的两端都要有Socket,是两台机器间通信的端点。
l 网络通信其实就是Socket间的通信。
l Socket允许程序把网络连接当成一个流,数据在两个Socket间通过IO传输。
lSocket分类:
Ø流套接字(stream socket):使用TCP提供可依赖的字节流服务
Ø数据报套接字(datagram socket):使用UDP提供“尽力而为”的数据报服务
基于Socket的TCP编程
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 ():获取输出流和输入流,开始网络数据的发送和接收。
Ø关闭ServerSocket和Socket对象:客户端访问结束,关闭通信套接字。
//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()获取socket的IP 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. DatagramSocket与DatagramPacket
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)。
l类 Socket 和 ServerSocket 实现了基于TCP协议的客户端-服务器程序。Socket是客户端和服务器之间的一个连接,连接创建的细节被隐藏了。这个连接提供了一个安全的数据传输通道,这是因为 TCP 协议可以解决数据在传送过程中的丢失、损坏、重复、乱序以及网络拥挤等问题,它保证数据可靠的传送。
l类 URL 和 URLConnection 提供了最高级网络应用。URL 的网络资源的位置来同一表示Internet 上各种网络资源。通过URL对象可以创建当前应用程序和 URL 表示的网络资源之间的连接,这样当前程序就可以读取网络资源数据,或者把自己的数据传送到网络上去。
2021年3月11日11:28:16 完结。把结尾拉到上面。
结尾
使用 Microsoft OneNote 2016 创建。 版权所有:古木苏