系列文章目录
Java基础篇之jdk、jre环境变量的配置
第一章 – Java基本语法
第六章 – Java集合
第七章- Java网络编程(二)
文章目录
前言
对于网络编程我们大多数小伙伴只是听说过,但也仅限于此,对于其实现方式,以及背后的逻辑不甚了解,本人和小伙伴们一样在大学Java教材上看到过这个章节的知识介绍,但是没有老师的点拨,我们自己去理解恐怕会事倍功半,但大学课时往往有限,这个章节又偏后,故而等课时结束,老师还没讲解到这个章节,因此只能靠我们自己去摸索了,这个知识点还是较为重要的,因为面试时也常常被问到,本人仅以自己的学习,总结一篇网络编程基础的理解以及案例分析,阐述过程如有出入请大佬们指出,小弟感激不尽。
一、网络的相关概念
1.网络通信
1.1 概念:两台设备之间通过网络实现数据传输
1.2 网络通信:将数据通过网络从一台设备传输到另一台设备
1.3 java.net包下提供了一系列的类或接口,供程序员使用,完成网络通信
2.网络
2.1 概念:两台或多台设备通过一定物品设备连接起来构成了网络
2.2 根据网络的覆盖范围不同,对网络进行分类:
- 局域网:覆盖范围最小,仅仅覆盖一个教室或一个机房
- 城域网:覆盖范围较大,可以覆盖一个城市
- 广域网:覆盖范围最大,可以覆盖全国,甚至全球,万维网是广域网的代表
3.IP地址
3.1 概念:用于唯一标识网络中的每台计算机/主机
3.2 查看ip地址:ipconfig
3.3 ip地址的标识形式:点分十进制 xx.xx.xx.xx
3.4 每一个十进制数的范围:0~255
3.5 ip地址的组成=网络地3.7址+主机地址,比如:192.168.16.69
3.6 ipv6是互联网工程任务组设计的用于替代IPV4的下一代IP协议,其地址数量号称可以为全世界的每一粒沙子编上一个地址
3.7 由于IPV4最大的问题在于网络地址资源有限,严重制约了互联网的应用和发展。IPV6的使用,不仅能解决网络地址资源数量的问题,而且也解决了多种接入设备连入互联网的障碍
3.8 IPV4:
- 4个字节(32位)表示
- 一个字节的范围是0~255
3.9 IPV4图解
4.域名
4.1 举例:www.baidu.com
4.2 好处:为了方便记忆,解决记IP的困难
4.3 概念:将IP地址映射成域名,这里怎么映射上,HTTP协议
5.端口号
5.1 概念:用于标识计算机上某个特定的网络程序
5.2 表示形式:以整数形式,范围0~65535
5.3 0~1024已经被占用,比如ssh 22,ftp 21,smtp 25 ,http 80
5.4 常见的网络程序端口号:
- tomcat : 8080
- mysql :3306
- oracle : 1521
- sqlserver : 1433
6.网络通信协议
6.1 协议
TCP/IP(Transmission Control Protocol/Internet Protocol)的简写,中文译名为传输控制协议/因特网互联协议,又叫网络通信协议,这个协议是Internet最基本的协议、Internet国际互联网络的基础,简单地说,就是由网络层的IP协议和传输层的TCP协议组成的。
6.2 协议图解
7.TCP和UDP
7.1 TCP协议:传输控制协议
- 使用TCP协议前,须先建立TCP连接,形成传输数据通道
- 传输前,采用“三次握手”方式,是可靠的
- TCP协议进行通信的两个应用进程:客户端、服务端
- 在连接中可以进行大数据量的传输
- 传输完毕,需释放已建立的连接,效率低
7.2 UDP协议
- 将数据、源、目的封装成数据包,不需要建立连接
- 每个数据报的大小限制在64K内
- 因无需连接,故是不可靠的
- 发送数据结束时无需释放资源(因为不是面向连接的),速度快
- 举例:厕所通知:发短信
二、InetAddress类
1.相关方法
- 获取本机InetAddress对象 getLocalHost
- 根据指定主机名/域名获取IP地址对象getByName
- 获取InetAddress对象的主机名 getHostName
- 获取InetAddress对象的地址 getHostAdddress
// 1.获取本机的InetAddress对象
InetAddress localHost = InetAddress.getLocalHost();
System.out.println(localHost);// LAPTOP-477BP2NV/192.168.1.107
// 2.根据主机名称获取InetAddress对象
InetAddress localHost1 = InetAddress.getByName("LAPTOP-477BP2NV");
System.out.println(localHost1);// LAPTOP-477BP2NV/192.168.1.107
// 3.根据域名返回InetAddress对象,比如www.baidu.com
InetAddress localHost2 = InetAddress.getByName("www.baidu.com");
System.out.println(localHost2); // www.baidu.com/183.232.231.172
// 4.通过InetAddress对象获取对应的IP地址
String hostAddress = localHost2.getHostAddress();
System.out.println(hostAddress);// 183.232.231.172
// 5.通过InetAddress对象获取主机名
String hostName = localHost2.getHostName();
System.out.println(hostName);// www.baidu.com
三、Socket
1.基本介绍
- 套接字(Socket)开发网络应用程序被广泛采用,以至于成为事实上的标准。
- 通信的两端都要有Socket,是两台机器间通信的端点
- 网络通信其实就是Socket间的通信
- Socket允许程序把网络连接成一个流,数据在两个Socket间通过IO传输
- 一般主动发起通信的应用程序属客户端,等待通信请求的为服务端
2.TCP网络通信编程
2.1 基本介绍
- 基于客户端-服务端的网络通信
- 底层使用的是TCP/IP协议
- 应用场景举例:客户端发送数据,服务端接受并显示控制台
- 基于Socket的TCP编程
2.2 Tcp网络编程图解
2.3 Tcp编程案例一(字节流编程)
要求:
- 编写一个服务器端,和一个客户端
- 服务器端在9999端口监听
- 客户端连接到服务端,发送“hello, server”, 然后退出
- 服务端接收到客户端发送的信息,输出,并退出
案例图解:
代码实现:
// 客户端代码实现
// 1.连接服务端(ip, 端口)
// 解读:连接本机的9999端口,如果连接成功,返回Socket对象
Socket socket = new Socket(InetAddress.getLocalHost(), 9999);
System.out.println("客户端 socket返回=" + socket.getClass());
// 2.连接上后,生成Socket通过
// socket.getOutputStream()
// 3.通过输出流,写入数据到 数据通道
OutputStream outputStream = socket.getOutputStream();
outputStream.write("Hello Server".getBytes());
// 4.关闭流对象和socket,必须关闭
outputStream.close();
socket.close();
System.out.println("客户端退出...");
// 服务端代码实现
// 1.服务端在9999端口监听,等待连接
ServerSocket serverSocket = new ServerSocket(9999);
System.out.println("服务端,在9999端口监听,等待连接...");
// 2.在本机没有其他服务在监听9999
Socket socket = serverSocket.accept();
System.out.println("socket=" + socket.getClass());
// 3.通过socket.getInputStream() 读取到客户端写入到数据通道到的数据,显示
InputStream inputStream = socket.getInputStream();
// 4.IO读取
byte[] buf = new byte[1024];
int len = 0;
while ((len = inputStream.read(buf)) != -1){
System.out.println(new String(buf, 0, len));
}
// 5.关闭流和socket
inputStream.close();
socket.close();
serverSocket.close();
2.4 Tcp编程案例二(字节流编程)
要求:
- 编写一个服务器端,和一个客户端
- 服务器端在9999端口监听
- 客户端连接到服务端,发送“hello, server”, 并接收服务器端退出回发的“hello,client”,再退出
- 服务端接收到客户端发送的信息,输出,并发送“hello client”,再退出
案例图解:
代码实现:
// 客户端代码实现
// 1.创建客户端socket
Socket socket = new Socket(InetAddress.getLocalHost(), 9999);
System.out.println("客户端 socket返回=" + socket.getClass());
// 2.获取输出流
OutputStream outputStream = socket.getOutputStream();
// 3.向数据通道写数据
outputStream.write("hello, server".getBytes());
// 设置结束标记
socket.shutdownOutput();
// 4.获取输入流
InputStream inputStream = socket.getInputStream();
// 5.读取服务端写入数据通道的数据
byte[] buf = new byte[1024];
int len = 0;
while( (len = inputStream.read(buf)) != -1){
System.out.println(new String(buf, 0, len));
}
// 6.关闭流和socket
outputStream.close();
inputStream.close();
socket.close();
System.out.println("客户端退出...");
// 服务端代码实现
// 1.创建服务端socket
ServerSocket serverSocket = new ServerSocket(9999);
System.out.println("服务端,在9999端口监听,等待连接...");
// 2.等待客户端连接
Socket socket = serverSocket.accept();
System.out.println("socket=" + socket.getClass());
// 3.获取客户端在数据通道写入的数据
InputStream inputStream = socket.getInputStream();
// 4.IO读取
byte[] buf = new byte[1024];
int len = 0;
while((len = inputStream.read(buf)) != -1){
System.out.println(new String(buf, 0, len));
}
// 5.向数据通道写入数据
OutputStream outputStream = socket.getOutputStream();
outputStream.write("hello, client".getBytes());
// 设置结束标记
socket.shutdownOutput();
// 6.关闭流和socket
inputStream.close();
outputStream.close();
socket.close();
serverSocket.close();
2.5 Tcp编程案例三(字符流编程)
要求:
- 编写一个服务器端,和一个客户端
- 服务器端在9999端口监听
- 客户端连接到服务端,发送“hello, server”, 并接收服务器端退出回发的“hello,client”,再退出
- 服务端接收到客户端发送的信息,输出,并发送“hello client”,再退出
案例图解:
代码实现:
// 客户端代码实现
// 1.创建客户端socket
Socket socket = new Socket(InetAddress.getLocalHost(), 9999);
System.out.println("客户端 socket返回=" + socket.getClass());
// 2.获取输出流
OutputStream outputStream = socket.getOutputStream();
// 3.向数据通道写数据
BufferedWriter bufferedWriter = new BufferedWriter(new OutputStreamWriter(outputStream));
bufferedWriter.write("hello, server");
bufferedWriter.newLine();// 插入一个换行符,表示写入内容结束,要求对方使用readLine()
bufferedWriter.flush();// 如果使用字符流需要手动刷新,否则数据不会写入数据通道
// 4.获取输入流
InputStream inputStream = socket.getInputStream();
// 5.读取服务端写入数据通道的数据
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream));
String s = bufferedReader.readLine();
System.out.println(s);
// 6.关闭外层流和socket
bufferedWriter.close();
bufferedReader.close();
socket.close();
System.out.println("客户端退出...");
// 服务端代码实现
// 1.创建服务端socket
ServerSocket serverSocket = new ServerSocket(9999);
System.out.println("服务端,在9999端口监听,等待连接...");
// 2.等待客户端连接
Socket socket = serverSocket.accept();
System.out.println("socket=" + socket.getClass());
// 3.获取客户端在数据通道写入的数据
InputStream inputStream = socket.getInputStream();
// 4.IO读取
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream));
String s = bufferedReader.readLine();
System.out.println(s);
// 5.向数据通道写入数据
OutputStream outputStream = socket.getOutputStream();
BufferedWriter bufferedWriter = new BufferedWriter(new OutputStreamWriter(outputStream));
bufferedWriter.write("hello, client");
bufferedWriter.newLine();
bufferedWriter.flush();
// 6.关闭外层流和socket
bufferedWriter.close();
bufferedReader.close();
socket.close();
serverSocket.close();
总结
以上只是Java中网络编程的部分基础知识,全篇阅读下来,并完成三个案例的练习,可以基本理解网络编程的含义,TCP的连接方式以及客户端和服务端是如何进行通信的,至此本篇阐述将告一段落,后期会继续补充网络编程未完善的部分。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/71709.html