JAVA中的网络支持
针对网络通信的不同层次,JAVA提供的网络功能有四大类:
- InetAddress:用于标识网络上的硬件资源。
- URL:统一资源定位符,通过URL可以直接读取或写入网络上的数据。
- Sockets:使用TCP协议实现网络通信的Socket相关的类。
- Datagram:使用UDP协议,将数据保存在数据报中,通过网络进行通信。
InetAddress类使用示例
获取主机的软硬件信息。
1 | import java.net.InetAddress; |
URL类使用示例
通过URL对象的openStream()方法可以得到指定的输入流,通过输入流可以读取、访问网络上的数据。
1 | /** |
Socket通信原理及步骤
Socket是基于TCP协议实现网络通信的类。TCP协议是面向连接、可靠的、有序的,以字节流的方式发送数据。
客户端封装Socket类,服务端封装ServerSocket类。
Socket通信实现步骤:
- 创建ServerSocket和Socket。
- 打开连接到Socket的输入/输出流。
- 按照协议对Socket进行读/写操作。
- 关闭输入输出流,关闭Socket。
服务器端:
1、创建ServerSocket对象,绑定监听端口。
2、通过accept()方法监听客户端连接请求。
3、连接建立后,通过输入流读取客户端发送的请求消息。
4、通过输出流向客户端发送响应消息。
5、关闭相关资源。
客户端:
1、创建Socket对象,指明需要连接的服务器的地址和端口号。
2、连接建立后,通过输出流向服务器端发送请求信息。
3、通过输入流获取服务器响应的信息。
4、关闭相关资源。
Socket会话实例:
服务端:
1 | package com.example.demo; |
客户端:
1 | package com.example.demo; |
应用多线程实现服务端与多客户端通信
大多数场景下,服务端都需与多客户端进行通信,由此便需要用到多线程技术,实现与多客户端的通信。
基本步骤:
1、服务器端创建ServerSocket,循环调用accept()等待客户端连接。
2、客户端创建一个socket并请求和服务器端连接。
3、服务器端接受客户端请求,创建socket与该客户建立专线连接。
4、建立连接的两个socket在一个单独的线程上对话。
5、服务器端继续等待新连接。
实现多线程只需在上面例子的基础上修改服务端代码即可。
修改后的Server类代码为:
1 | package com.example.demo; |
创建服务线程类,继承Thread类重写run方法。将原来Server类中,获取输入输出流以读取响应客户端请求的代码,迁移至重写的run方法中。
ServerThread类的代码为:
1 | package com.example.demo; |
基于UDP的Socket编程
UDP协议(用户数据报协议)是无连接、不可靠的、无序的。UDP协议以数据报作为数据传输的载体。
进行数据传输时,首先需要将要传输的数据定义成数据报(Datagram),在数据报中指明数据所要到达的Socket(主机地址和端口号),然后再将数据报发送出去。
- DatagramPacket:表示数据报包
- DatagramSocket:进行端到端通信的类
服务器端实现步骤:
1、创建DatagramSocket,指定端口号。
2、创建DatagramPacket。
3、接受客户端发送的数据信息。
4、读取数据。
客户端实现步骤:
1、定义发送信息。
2、创建DatagramPacket,包含将要发送的信息。
3、创建DatagramSocket。
4、发送数据
基于UDP的Socket通信实例如下(多线程实现逻辑跟上面的例子差不多,这里就不重复操作了):
服务器端:
1 | package com.example.demo; |
客户端:
1 | package com.example.demo; |
重点总结
本章主要内容
Socket通信的主要步骤。
基于TCP的Socket通信。
基于UDP的Socket通信。
基于多线程的服务器与多客户端通信。
多线程的优先级:
1 | serverThread.setPriority(4); //设置线程的优先级,范围为1-10,默认为5 |
未设置优先级可能会导致运行时速度非常慢,可降低优先级。
是否关闭输出流和输入流:
程序未执行结束时,不能关闭输出流。对于同一个socket的输出流,如果关闭了输出流,则与该输出流关联的Socket也会被关闭,所以一般不用关闭流,最后直接关闭socket即可。
关于数据传输格式:
上面例子使用TCP通信传输数据,是通过字符串的形式传输的,而实际的应用中,更多是通过将数据封装成对象进行传输的。
2020年10月27日 完结