文章目录
- 网络基础知识
- IP 地址
- 端口
- 协议
- Java 中网络编程
- InetAddress(静态类)
- UDP 通信原理
- UDP 发送数据步骤
- UDP 接收数据步骤
- UDP 发送接收案例
- TCP 通信原理
- TCP 发送数据步骤
- TCP 接收数据步骤
- TCP 发送接收案例
网络基础知识
-
概述:在网络通信协议下(http/tcp/udp)实现网络互连的不同计算机上运行的程序间可以进行数据交换。
-
网络编程中的三要素:
名字 作用 IP 地址 网络中设备的唯一标识 端口 应用程序的标识 协议 对数据的传输格式、传输速率、传输步骤做了统一的规定,通信双方必须同时遵守才能完成数据交换,常见协议有(TCP UDP)
IP 地址
-
常见的 IP 地址
-
IPV4
-
给每个连接在网络上的主机分配一个 32 bit (位)的地址,按照 TCP/IP 规定,IP 地址使用二进制表示,每个 IP 地址 32bit ,也就是 4 个字节(1字节=8位)
-
十进制形式(点分十进制表示法):192.168.1.66
-
二进制表示形式: 11000000.10101000.00000001.01000010
-
-
IPV6
- 采用 128 bit , 16个字节一组,分成 8 组十六进制数据,解决了网络地址资源数量不够的问题。
-
-
关于IP的一些命令(命令运行框使用)
命令 作用 ipconfig 查看本机IP地址 ping IP 地址 检查网络是否连通 -
特殊的 IP 地址
- 127.0.0.1 回送地址,可以代表本机地址,常用来测试
- 例如(本地地址):
- 127.0.0.1/demo/login.html
- localhost/demo/login.html
端口
- 端口号
- 用两个字节表示的整数,它的取值范围是0~65535
- 其中0~1023之间的端口号用于一些知名的网络服务和应用
- 普通应用程序需使用1024以上的端口号,如果端口号被占用,会导致当前程序启动失败
协议
-
UDP协议
1、用户数据报协议(User Datagram Protocol) 2、UDP是无连接通信协议,发送端和接收端不会建立逻辑连接 3、由于UDP协议消耗资源小,通信效率高,所以通常都会用于音频、视频、普通数据的传输 4、由于UDP的面向无连接性,不能保证数据的完整性,因此传输重要数据不建议使用 -
TCP协议
1、传输控制协议(Transmission Control Protocol) 2、TCP协议是面向连接的通信协议,传输数据前,发送端和接收端建立逻辑连接,然后再传输数据 3、提供两台计算机之间可靠无差错的数据传输,TCP中必须明确客户端与服务器端,三次握手 4、保证数据传输的安全,上传文件,下载文件,浏览网页等 5、三次握手:TCP协议中,在发送数据的准备阶段,客户端和服务器之间的三次交互,以保证可靠连接
Java 中网络编程
InetAddress(静态类)
-
概述:为了方便我们对IP地址的获取和操作,Java提供了一个类 InetAddress 供我们使用。InetAddress : 表示Internet协议(IP)地址
-
常用方法
方法 作用 static InetAddress getByName(String host) 确定主机名称的IP地址。
主机名称可以是机器名称,也可以是IP地址String getHostName() 获取此IP地址的主机名 String getHostAddress() 返回文本显示中的IP地址字符串 -
代码演示
-
首先 win + r ,输入 cmd 打开命令运行框
-
输入 ipconfig,找到 IPV4 地址(红框圈住的就是主机名称)
public class Test { public static void main(String[] args) throws UnknownHostException { // 使用 InetAddress类,调用方法,获取本机对象 InetAddress lh = InetAddress.getByName("xiaoHeng"); // 调用方法,获取此IP地址的主机名 String hostName = lh.getHostName(); // 调用方法,返回文本显示中的IP地址字符串 String hostAddress = lh.getHostAddress(); System.out.println("本机名称是:" + hostName); System.out.println("本机地址是:" + hostAddress); } }
注意:代码演示的,换成自己主机名后,输出的 本地地址,就和 命令运行框 查看的 IPV4 地址一致
-
UDP 通信原理
- 概述:UDP是一种不可靠的网络协议,它在通信两端各建立一个 Socket 对象,但是这两个 Socket 只是发送,接收数据的对象
- DatagramSocket 基于UDP协议的Socket
UDP 发送数据步骤
-
创建发送端的 Socket 对象(DatagramSocket)
DatagramSocket ds = new DatagramSocket();
-
创建数据,并把数据打包
byte[] bys = "你好".getBytes(); // 将字符串转换成 字节数组 DatagramPacket dp = new DatagramPacket(bys,bys.length,InetAddress.getByName("ip"),int port);
-
调用 DatagramSocket 对象的方法发送数据
void send(DatagramPacket p);
-
关闭发送端
void close();
UDP 接收数据步骤
-
创建接收端的 Socket 对象(DatagramSocket)
DatagramSocket(int port); // 根据端口号
-
创建一个数据包,用于接收数据
DatagramPacket(byte[] bys , int length);
-
调用 DatagramSocket 对象方法接收数据
void receive(DatagramPacket dp);
-
解析数据包,并展示在控制台
byte[] getData(); // 数据缓冲区 int getLength(); // 实际数据长度 String s = new String(dp.getData(),0,dp.getLength()); // 转换成字符串
-
关闭接收端
void close();
UDP 发送接收案例
-
使用 UDP 协议,发送 “你好,世界!你好,中国!”,用接收端接收,并展示在控制台上?
- 发送端(再开启服务端)
// 发送端 public class Client { public static void main(String[] args) throws IOException { // 1、创建发送端的 Socket 对象 DatagramSocket ds = new DatagramSocket(); // 2、创建数据,并将数据打包 byte[] bys = "你好,世界!你好,中国!".getBytes(); DatagramPacket dp = new DatagramPacket(bys, bys.length, InetAddress.getByName("127.0.0.1"), 8080); // 3、调用 DatagramSocket 对象发送数据 ds.send(dp); // 4、关闭发送端 ds.close(); } }
- 接收端(先开启接收端)
// 接收端 public class Server { public static void main(String[] args) throws IOException { // 1、创建接收端的 Socket 对象 DatagramSocket ds = new DatagramSocket(8080); // 2、创建一个数据包,用于接收数据 byte[] bys = new byte[1024]; DatagramPacket dp = new DatagramPacket(bys , bys.length); // 3、调用 DatagramSocket 对象方法接收数据 ds.receive(dp); // 4、解析数据包,并展示在控制台 byte[] data = dp.getData(); int length = dp.getLength(); String s = new String(data ,0,length); System.out.println(s); // 5、关闭接收端 ds.close(); } }
TCP 通信原理
-
概述:TCP可靠的网络协议,在通信两端各建立一个Socket对象,从而在通信的两端形成网络虚拟链路,一旦建立了虚拟的网络链路,两端的程序就可以通过虚拟链路进行通信
-
Java为客户端提供了Socket类,为服务器端提供了ServerSocket类
-
Java对基于TCP协议的网络提供了良好的封装,使用Socket对象来代表两端的通信端口,并通过Socket产生IO流来进行网络通信
TCP 发送数据步骤
-
创建客户端 Socket 对象(Socket)
Socket(String host , int port); // host:主机号 port:端口号
-
获取输出流,写数据
OutputStream getOutputStream();
-
释放资源
void close();
TCP 接收数据步骤
-
创建服务器端的Socket对象(ServerSocket)
ServerSocket(int port);
-
监听客户端连接,返回一个 Socket 对象
Socket accept();
-
获取输入流,读数据,并把数据显示在控制台上
InputStream getInputStream();
-
释放资源
void close();
TCP 发送接收案例
-
使用 TCP 协议,建立客户端和服务端连接,在客户端使用键盘输入随机文字,显示在服务端控台上?IO 流可参考这篇文章
- 服务端(接收数据,先打开服务端)
public class Server { public static void main(String[] args) throws IOException { // 1、创建服务器端对象(端口号,随意) ServerSocket ss = new ServerSocket(8080); // 2、监听客户端连接 Socket a = ss.accept(); // 3、获取输入流,读数据,将数据展示在控制台上 InputStream is = a.getInputStream(); byte[] bys = new byte[1024]; int len; while((len = is.read(bys)) != -1){ System.out.println(new String(bys,0,len)); } // 4、释放资源 ss.close(); } }
- 客户端(发送数据,再打开客户端)
public class Client { public static void main(String[] args) throws IOException { // 1、创建客户端 对象 Socket s = new Socket("127.0.0.1",8080); // 2、获取输出流,写数据 OutputStream os = s.getOutputStream(); // 3、创建键盘输入对象 Scanner sc = new Scanner(System.in); System.out.print("请输入你想要发送的内容:"); String data = sc.next(); // 4、利用输出流写数据 os.write(data.getBytes()); // 5、释放资源 s.close(); } }
- 运行结果
欢迎大家留言,一起进入编程世界!