第七章 – Java网络编程(一)

导读:本篇文章讲解 第七章 – Java网络编程(一),希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com

系列文章目录

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

(0)
小半的头像小半

相关推荐

极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!