Java网络编程
目录
1.网络编程
计算机跟计算机之间通过网络进行数据传输。
-------------------------------------------------------------------------
网络分层
仅作了解,百度或请点这里。
2.软件架构
-
B/S 架构:浏览器/服务器
- 优点:
- 不需要开发客户端,只需要页面 +服务端
- 用户不需要下载,打开浏览器就能使用(eg:淘宝,京东等)
- 缺点:
- 如果应用过大,用户体验受到影响
- 优点:
- C/S 架构:客户端/服务器
- 优点:
- 画面精美额,体验较好
- 缺点:
- 需要开发客户端+服务端
- 用户需要下载和更新
- 优点:
-------------------------------------------------------------------------
网络编程三要素:
- IP
- 设备在网络中的地址,是唯一的标识。
- 端口号
- 应用程序在设备中唯一的标识。
- 由两个字节表示的整数,取值范围 :0 ~ 65535
- 协议
- 数据在网络中传输的规则,常见的协议有UDP、TCP、http、https、ftp。
-------------------------------------------------------------------------
- IP地址
- 唯一标识网络上的每一台计算机
- IP地址的组成
- 32位,由4个8位二进制数组成
- IP地址 = 网络地址 + 主机地址
- 网络地址:标识计算机或网络设备所在的网段
- 主机地址:标识特定主机或网络设备
IPv4 vs IPv6:
IPv4:最多只有2^32次方个ip,目前已经使用完。
当前解决方案:利用局域网IP解决IP不够的问题
IPv6:为了解决IPv4不够用而出现,最多有2^128次方个ip。
-------------------------------------------------------------------------
IP地址的配置和检测
- 查看IP地址,检测网络是否畅通
- 查看本机的IP地址
- ipconfig
- 测试网络是否通畅
- ping 目标地址
- 查看本机的IP地址
特殊的IP地址:127.0.0.1,也可以是 localhost,指本机IP。
-------------------------------------------------------------------------
2.1.网路通信协议
计算机网络中,连接和通信的规则被称为网络通信协议。
2.1.1.UDP协议
- 用户数据报协议
- UDP是面向无连接通信协议
- 速度快,有大小限制,一次最多发送64K,数据不安全,易丢失数据
2.1.2.TCP协议
- 传输控制协议TCP
- TCP协议是面向连接的通信协议
- 速度慢,没有大小限制,数据安全
TCP | UDP | |
是否连接 | 面向连接 | 面向非连接 |
传输可靠性 | 可靠 | 不可靠 |
速度 | 慢 | 快 |
-------------------------------------------------------------------------
2.2.UDP的三种通信方式
- 单播
- 组播
- 组播地址:224.0.0.0~239.255.255.255,其中224.0.0.0~224.0.0.255为预留的组播地址
- 广播
- 广播地址:255.255.255.255
-------------------------------------------------------------------------
2.3.TCP通信程序
在通信两端建立一个 Socket 对象,通信之间要保证连接已经建立,通过 Socket 产生IO流来进行网络通信。
步骤:
客户端(Socket):
- 创建客户端 Socket 对象(Socket)与指定服务器连接
Socket socket = new Socket("localhost", 5000);
- 获取输出流对象,写数据
OutputStream os = socket.getOutputStream();
- 释放资源
void close()
示例:
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.net.Socket;
//客户端
public class LoginClient {
public static void main(String[] args) {
try {
// 1.创建客户端Socket
Socket socket = new Socket("localhost", 5000);
// 2.创建输出流对象
OutputStream os = socket.getOutputStream();
// 3.通过输出流将登录信息发送请求给服务器
String loginInfo = "用户名:admin;密码:123456";
os.write(loginInfo.getBytes());
//通过输入流接收服务器返回给客户的相应
socket.shutdownOutput();
InputStream is =socket.getInputStream();
BufferedReader br = new BufferedReader(new InputStreamReader(is));
String reply;
while ((reply = br.readLine())!=null) {
System.out.println("服务器响应说:"+reply);
}
//4.关闭流及Socket
br.close();
is.close();
os.close();
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
服务器端(ServerSocket):
- 创建服务器端Socket 对象(ServerSocket)
ServerSocket serverSocket = new ServerSocket(5000);
- 监听客户端连接,返回一个Socket对象
Socket socket = serverSocket.accept();
- 获取输入流,读数据,并把数据显示在控制台
InputStream is =socket.getInputStream();
- 释放资源
void close()
示例:
//服务器端
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;
public class LoginServer {
public static void main(String[] args) {
try {
//1.创建服务器端Socker对象
ServerSocket serverSocket = new ServerSocket(5000);
//2.使用accept()方法来监听接收用户请求,创建链接
Socket socket = serverSocket.accept();
//3.通过输入流获取用户请求的信息
InputStream is =socket.getInputStream();
BufferedReader br = new BufferedReader(new InputStreamReader(is));
String info;
while ((info = br.readLine())!= null) {
System.out.println("客户端说:"+info);
}
//通过输出流给客户端一个响应
OutputStream os = socket.getOutputStream();
String reply = "欢迎登录";
os.write(reply.getBytes());
//关闭相应的流和Socket
os.close();
br.close();
is.close();
socket.close();
serverSocket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
运行结果:


----------------------------------------------------------------------------------
三次握手:
-
第一次握手:客户端向服务器端发出连接请求,等待服务器确认
-
第二次握手:服务器端向客户端回送一个响应,通知客户端收到了连接请求
-
第三次握手:客户端再次向服务器端发送确认信息,确认连接
四次挥手:
2.4.UDP通信程序
基于UDP协议的socket网络编程步骤
- 利用 DatagramPacket 对象封装数据包
- 利用 DatagramSocket 发送数据包
- 利用 DatagramSocket 接收数据包
- 利用 DatagramPacket 处理数据包
示例:简单聊天室
发送端:
package dh09.UDPDemo;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException;
import java.net.UnknownHostException;
import java.util.Scanner;
//简单聊天室
public class SendMessage {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
try {
//1.创建DatagramSocket对象
DatagramSocket ds = new DatagramSocket();
//2.打包数据
while (true) {
System.out.print("请输入您要说的话:");
String str = sc.next();
if ("886".equals(str)) {
break;
}
byte[] b = str.getBytes();
InetAddress address = InetAddress.getByName("localhost");
int port = 10086;
DatagramPacket dPacket =new DatagramPacket(b, b.length,address,port);
//3.发送数据
ds.send(dPacket);
}
//4.释放资源
ds.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
接收端:
package dh09.UDPDemo;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.SocketException;
public class ReceiveMessage {
public static void main(String[] args) {
try {
// 1.创建对象DatagramSocket的对象
DatagramSocket ds = new DatagramSocket(10086);
// 2.接收数据包
byte[] b = new byte[1024];
DatagramPacket dPacket = new DatagramPacket(b, b.length);
while (true) {
ds.receive(dPacket);
// 3.解析数据包
byte[] data = dPacket.getData();
int len = dPacket.getLength();
String ip = dPacket.getAddress().getHostAddress();
String name = dPacket.getAddress().getHostName();
// 4.打印数据
System.out.println("ip为:" + ip + ",主机名为:" + name + "的人,发送了数据:" + new String(data, 0, len));
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?