当前位置: 首页 > news >正文

Java—— 网络编程

什么是网络编程

网络编程就是计算机跟计算机之间通过网络进行数据传输

常见软件架构

C/S: Client/Server客户端/服务器

在用户本地需要下载并安装客户端程序,在远程有一个服务器端程序

适合定制专业化的办公类软件如:IDEA、王者荣耀

优缺点:

画面可以做的非常精美,用户体验好

需要开发客户端,也需要开发服务端

用户需要下载和更新

B/S: Browser/Server浏览器/服务器

只需要一个浏览器,用户通过不同的网址,访问不同的服务器

适合移动互联网应用,可以在任何地方随时访问的系统如:新闻头条、4399小游戏

优缺点:

不需要开发客户端,只需要开发服务端

用户不需要下载,打开浏览器就能使用

如果应用过大,用户体验受到影响

网络编程三要素

IP:

全称:nternet Protocol,是互联网协议地址,也称IP地址

是分配给上网设备的数字标签,是设备在网络中的地址,是唯一的标识。

常见的IP分类为:

IPv4 最多只有2^32次方个ip,目前已经用完了

IPv6 为了解决IPv4不够用而出现的,最多有2^128次方个ip

特殊IP地址:
127.0.0.1(localhost):回送地址,也称本地回环地址或本机IP,作用是永远只会寻找当前所在本机。 

InetAddress  

此类表示互联网协议 (IP) 地址 

有两个子类Inet4Address, Inet6Address,分别对应IPv4, IPv6

获取IP地址对象时,底层会判断当前系统用的IP版本,创建对应子类的对象,然后返回

常用方法
方法名说明
static InetAddress getByName(String host)获取主机名称的IP地址。主机名称可以是机器名称,也可以是IP地址
String getHostName()获取此IP地址的主机名
String getHostAddress()返回IP地址字符串 
代码演示
import java.net.InetAddress;
import java.net.UnknownHostException;public class InetAddressTest {public static void main(String[] args) throws UnknownHostException {//static InetAddress getByName(String host)	获取主机名称的IP地址。主机名称可以是机器名称,也可以是IP地址//String getHostName()	获取此IP地址的主机名//String getHostAddress()	返回IP地址字符串InetAddress inetAdress = InetAddress.getByName("LAPTOP-CK36DSIB");System.out.println(inetAdress);//LAPTOP-CK36DSIB/169.254.237.195String hostName = inetAdress.getHostName();System.out.println(hostName);//LAPTOP-CK36DSIBString hostAddress = inetAdress.getHostAddress();System.out.println(hostAddress);//169.254.237.195}
}

端口号:

由两个字节表示的整数,取值范围0~65535

是应用程序在设备中唯一的标识,一个端口号只能被一个应用程序使用
其中0~1023的端口号用于一些知名的网络服务或者应用,自己使用要使用1024以上的端口号

协议:

计算机网络中,连接和通信的规则被称为网络通信协议,是数据在网络中传输的规则

常见的协议有UDP、TCP、http、https、ftp

UDP协议

用户数据报协议(User Datagram Protocol),是面向无连接通信协议。
特点:速度快,有大小限制(一次最多发送64K),数据不安全易丢失

发送数据

步骤:

1.创建发送端的DatagramSocket对象  -> 找快递公司      
2 数据打包(DatagramPacket) -> 打包礼物     
3.发送数据 -> 快递公司发送包裹
4.释放资源 -> 付钱走人   

import java.io.IOException;
import java.net.*;public class SendMessageDemo {public static void main(String[] args) throws IOException {//1.创建发送端的DatagramSocket对象//参数为发送端端口号,不写默认随机一个端口号DatagramSocket ds = new DatagramSocket(10000);//2 数据打包(DatagramPacket)//准备要发送的数据String messageStr = "你好!!!";byte[] message = messageStr.getBytes();//准备接收的电脑的ip地址InetAddress address = InetAddress.getByName("127.0.0.1");//准备接收端端口号int port = 10086;//打包DatagramPacket dp = new DatagramPacket(message, message.length, address, port);//3.发送数据ds.send(dp);//4.释放资源ds.close();}
}

接收数据

步骤:

1.创建接收端的DatagramSocket对象 -> 找快递公司
2.接收打包好的数据 -> 接收箱子
3.解析数据包 -> 从箱子里面获取礼物
4.释放资源 -> 签收走人   

​
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;public class ReceiveMessageDemo {public static void main(String[] args) throws IOException {//1.创建接收端的DatagramSocket对象//参数为接收端端口号DatagramSocket ds = new DatagramSocket(10086);//2.接收打包好的数据//准备数据箱接收byte[] bytes = new byte[1024];DatagramPacket dp = new DatagramPacket(bytes, bytes.length);//接收数据到打包箱中//该方法是阻塞的,到这一步时等待发送端发送数据ds.receive(dp);//3.解析数据包byte[] data = dp.getData();int length = dp.getLength();InetAddress address = dp.getAddress();int port = dp.getPort();System.out.println("接收到的数据为:" + new String(data, 0, length));System.out.println("来自" + address + "电脑的" + port + "端口");//4.释放资源ds.close();}
}

先启动接收程序,再启动发送程序,接收端接收到如下数据:

UDP的三种通信方式

单播

一台电脑发送,一台电脑接收

单播地址:接收端的ip地址
代码实现:上述的代码就是单播

组播

一台电脑发送,多台电脑接收
组播地址:224.0.0.0~239.255.255.255,其中224.0.0.0~224.0.0.255为预留的组播地址

代码实现:

        发送

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.InetAddress;
import java.net.MulticastSocket;public class SendMessageDemo {public static void main(String[] args) throws IOException {//1.创建发送端的MulticastSocket对象MulticastSocket ms = new MulticastSocket();//数据打包(DatagramPacket)String messageStr = "你好吗?";byte[] bytes = messageStr.getBytes();//组播地址224.0.0.0~224.0.0.255InetAddress ip = InetAddress.getByName("224.0.0.2");int port = 10086;DatagramPacket dp = new DatagramPacket(bytes, bytes.length, ip, port);//3.发送数据ms.send(dp);//4.释放资源ms.close();}
}

        接收

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.InetAddress;
import java.net.MulticastSocket;public class ReceiveMessageDemo {public static void main(String[] args) throws IOException {//1.创建接收端的MulticastSocket对象//参数为接收端端口号MulticastSocket ms = new MulticastSocket(10086);//2.将本机添加到224.0.0.2这一组中InetAddress address = InetAddress.getByName("224.0.0.2");ms.joinGroup(address);//3.接收打包好的数据byte[] bytes = new byte[1024];DatagramPacket dp = new DatagramPacket(bytes, bytes.length);ms.receive(dp);//4.解析数据byte[] data = dp.getData();int length = dp.getLength();System.out.println(new String(data, 0, length));//4.释放资源ms.close();}
}

上述代码中,只有添加到224.0.0.2这一组中的主机可以接收到数据

广播

一台电脑发送,局域网内的所有电脑接收

广播地址:255.255.255.255

代码实现:只需将单播代码中的单播地址改为广播地址

TCP协议

传输控制协议TCP(Transmission Control Protocol),是面向连接的通信协议。
特点:速度慢,没有大小限制,数据安全。

客户端发送数据

1.创建客户端的Socket对象(Socket)与指定服务端连接    
Socket(String host,int port)        
2.获取输出流,写数据  

            Outputstream  getoutputstream()        
3.释放资源       
void close()  

import java.io.IOException;
import java.io.OutputStream;
import java.net.Socket;public class SocketDemo {public static void main(String[] args) throws IOException {//1.创建客户端的Socket对象(Socket)与指定服务端连接Socket socket = new Socket("127.0.0.1", 10086);//2.获取输出流,写数据OutputStream os = socket.getOutputStream();os.write("你好!!!".getBytes());//3.释放资源socket.close();}
}

服务器接收数据

1.创建服务器端的Socket对象(ServerSocket)

        ServerSocket(int port)  

2. 监听客户端连接,返回一个Socket对象

        Socket  accept()

3.获取输入流,读数据,并把数据显示在控制台

        Inputstream  getInputstream() 

4. 释放资源    
void close()

import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.ServerSocket;
import java.net.Socket;public class ServerSocketDemo {public static void main(String[] args) throws IOException {//1.创建服务器端的Socket对象(ServerSocket)ServerSocket ss = new ServerSocket(10086);//2.监听客户端连接,返回一个Socket对象//阻塞,一直等待直到客户端与服务器端连接成功,返回客户端连接对象Socket socket = ss.accept();//3.获取输入流,读数据,并把数据显示在控制台InputStream is = socket.getInputStream();//防止中文乱码,使用转换流转换为字符流InputStreamReader isr = new InputStreamReader(is);int b;while ((b = isr.read()) != -1) {System.out.print((char) b);}//4.释放资源socket.close();ss.close();}
}

先启动接收程序,再启动发送程序,接收到如下数据:

确保连接建立(三次握手)

1.客户端向服务器发出连接请求,等待服务器确认

2.服务器向客户端返回一个响应,告诉客户端收到了连接请求

3.客户端向服务器再次发出确认信息,连接建立

确保连接断开,且数据处理完毕(四次挥手)

1.客户端向服务器发出取消连接请求,等待服务器确认

2.服务器向客户端返回一个响应,表示收到客户端取消请求

3.服务器处理完所有数据时,向客户端发出确认取消信息

4.客户端再次向服务器发送确认消息,连接取消

http://www.dtcms.com/a/343611.html

相关文章:

  • 具身导航近期论文分享(一)
  • 华清远见25072班数据结构学习day1
  • 【时时三省】集成测试 简介
  • GIS在城乡供水一体化中的应用
  • c#语言的学习【02,函数重载】
  • Java数据类型全解析:从基础到进阶的完整指南
  • leetcode-python-349两个数组的交集
  • 快速了解图像形态学
  • Huggingface 的介绍,使用
  • 人体生理参数信号采集项目——心电信号
  • actuary notes[4]
  • git 冲突解决方案
  • 组件卸载时useEffect状态
  • 人工智能驱动的现代电商前端开发:从基础到智能体验
  • 网易测试岗位--面试真题分析
  • 利用 Java 爬虫获取淘宝商品评论实战指南
  • 大语言模型原理(Transformer架构)
  • 高可用操作步骤
  • FP4层与NF4层 4位量化总结(49)
  • 实践题:数据采集与处理培训大纲
  • JavaWeb(五)转发、重定向、Get、POST
  • 在JAVA中如何给Main方法传参?
  • java开发面试题(提高篇)
  • 2026 济南玉米及淀粉深加工展:从原料到创新产品的完整解决方案
  • 【算法精练】 哈夫曼编码
  • Eino 框架组件协作指南 - 以“智能图书馆建设手册”方式理解
  • Excel中运行VB的函数
  • Sklearn 机器学习 房价预估 线性回归模型实现预估
  • 【自用】JavaSE--网络通信
  • 项目架构分享 —— 离线数仓