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

Java基础(下)之网络编程

网络编程

什么是网络编程

在网络通信协议下,不同设备上运行的程序,进行数据传输。Java中可以使用Java.net包开发网络应用程序。
image

网络编程三要素

  • IP:设备在网络中的地址,是唯一标识
  • 端口号:程序在设备中的唯一标识
  • 协议:数据在网络中传输的规则,如TCP、UDP、HTTP、FTP、MQTT等

InetAddress 表示IP地址的类

class Main {public static void main(String[] args) throws UnknownHostException {InetAddress device = InetAddress.getByName("ZJQ");//获取网络上设备的对象,名称可以是机器名称,也可以是IP地址System.out.println(device);System.out.println(device.getHostName());//获取该设备对象的主机名,若设备不存在/获取不到,则返回IP地址System.out.println(device.getHostAddress());//获取该设备对象的IP地址}
}

UDP通信程序

单播

发送数据

image

public class UDPSender {static void main(String[] args) throws IOException, InterruptedException {//1.创建本机的套接字对象 DatagramSocketDatagramSocket ds = new DatagramSocket(5678);//参数为本机发出数据的端口,空参:随机选择一个可用端口;有参:指定端口进行绑定//2.打包要发送的数据报 Packet:填写内容及目标套接字(IP:Port)String str = "Hello,NetWork!";byte[] data = str.getBytes();InetAddress targetAdd = InetAddress.getByName("ZJQ");int targetPort = 1234;//目标地址的端口,即目标机器监听并接收的端口DatagramPacket dp = new DatagramPacket(data,data.length,targetAdd,targetPort);//3.发送数据for (int i = 0; i < 10; i++) {ds.send(dp);System.out.println("Send a packet");Thread.sleep(500);}//4.释放资源ds.close();}
}

接收数据

public class UDPReceiver {static void main(String[] args) throws IOException {//1.创建本机上接收/监听的套接字对象DatagramSocketint listenPort = 1234;//监听本机的端口,数据会发到这个端口来DatagramSocket ds = new DatagramSocket(listenPort);//2.创建用于接收数据的数据报对象DatagramPacket,byte[] data = new byte[1024];InetAddress listenAddr = InetAddress.getByName("ZJQ");//接收端的数据报仅需分配内存空间,无需指定地址和端口DatagramPacket dp = new DatagramPacket(data,data.length);//3.接收并解析数据while(true){ds.receive(dp);//接收数据报,同步方法,收不到就阻塞,直到收到数据byte[] rev_data = dp.getData();//数据报中的数据int len = dp.getLength();//数据长度InetAddress send_addr = dp.getAddress(); //数据报发送方的IPint send_port = dp.getPort(); //数据报发送方的端口String str = new String(rev_data,0,len);//编码为字符串System.out.println("接收到来自" + send_addr + ":" + send_port + "的数据:" + str);}}
}

组播

组播地址:224.0.0.0 ~ 239.255.255.255,其中224.0.0.0 ~ 224.0.0.255为预留的组播地址。
示例:通过组播方式写一个群发程序
UDPSender.java

package com.example.helloworld;import java.io.IOException;
import java.net.*;
import java.util.Scanner;public class UDPSender {static void main(String[] args) throws IOException, InterruptedException {//1.创建本机的套接字对象 MulticastSocketMulticastSocket ms = new MulticastSocket(12345);//参数为本机发出数据的端口,空参:随机选择一个可用端口;有参:指定端口进行绑定Scanner sc = new Scanner(System.in);//2.打包要发送的数据报 Packet:填写内容及目标套接字(IP:Port)InetAddress targetAdd = InetAddress.getByName("224.0.0.1");int targetPort = 54321;while(true){String str = sc.nextLine();if("886".equals(str)){break;}byte[] data = str.getBytes();DatagramPacket dp = new DatagramPacket(data,data.length,targetAdd,targetPort);ms.send(dp);}System.out.println("欢迎下次使用!");ms.close();}
}

UDPReceiver.java

package com.example.helloworld;import java.io.IOException;
import java.net.*;public class UDPReceiver {static void main(String[] args) throws IOException {//1.创建本机上接收/监听组播数据的套接字对象MulticastSocketInetAddress listenAddr = InetAddress.getByName("224.0.0.1");int listenPort = 54321;//监听本机的端口,数据会发到这个端口来MulticastSocket ms = new MulticastSocket(listenPort);//2.将当前本机添加到组播这一组当中ms.joinGroup(listenAddr);//3.创建用于接收数据的数据报对象DatagramPacket,接收端的数据报仅需分配内存空间,无需指定地址和端口byte[] data = new byte[1024];DatagramPacket dp = new DatagramPacket(data,data.length);//4.接收并解析数据while(true){ms.receive(dp);//接收数据包,同步方法,收不到就阻塞,直到收到数据byte[] rev_data = dp.getData();//数据包中的数据int len = dp.getLength();//数据长度InetAddress send_addr = dp.getAddress(); //数据包发送方的IPint send_port = dp.getPort(); //数据包发送方的端口String str = new String(rev_data,0,len);//编码为字符串System.out.println("接收到来自" + send_addr + ":" + send_port + "的数据:" + str);}}
}

广播

广播地址:255.255.255.255
广播不需要修改socket类,将单播代码中发送地址修改即可

TCP通信程序

image

基本流程

image

示例程序

TCPServer.java

import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;public class TCPServer {public static void main(String[] args) throws IOException {//1.创建ServerSocket对象,等待客户端来连接,因此无需传入IP地址ServerSocket ss = new ServerSocket(12345);while(true){boolean exit = false;//2.监听端口,等待客户端连接,若没有则阻塞直到有客户端来连接,此时会获取到客户端的socket对象Socket socket = ss.accept();System.out.println("有客户端连接:" + socket.getInetAddress().getHostAddress());//3.有客户端连接后,需要获取socket对象的输入流,本例中传输的是字符串信息,因此使用缓冲字符流BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));//4.从流中读取数据char[] data = new char[1024];int len;while((len = br.read(data)) != -1){String str = new String(data,0,len);System.out.println("收到客户端" + socket.getInetAddress().getHostAddress() + ":" + socket.getPort() + "的请求数据:" + str);if("886".equals(str)){exit = true;break;}}if(exit) break;}// 5.断开连接,关闭服务器ServerSocket对象,释放资源ss.close();System.out.println("Bye");}
}

TCPClient.java

import java.io.BufferedWriter;
import java.io.IOException;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.net.Socket;
import java.util.Scanner;public class TCPClient {public static void main(String[] args) throws IOException {//1.创建Socket对象,此时会与服务器试图建立连接,若连接失败则返回ConnectExceptionSocket socket = new Socket("192.168.3.108",12345);//2. 连接成功后需要获取socket的输出流,通过输出流发送数据,本例中传输的是字符串信息,因此使用缓冲字符流BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));//3.发送数据Scanner sc = new Scanner(System.in);while(true){String str = sc.nextLine();bw.write(str);bw.flush();//注意:必须立刻刷新,否则数据不能及时传输if("886".equals(str)) break;}//4.断开连接,释放资源socket.close();System.out.println("Bye");}
}

建立连接过程:三次握手

image
思考:为什么需要第三次握手?

断开连接过程:四次挥手

image
思考:网上需要第四次挥手?

http://www.jsqmd.com/news/436280/

相关文章:

  • 聚焦环保健康全屋定制:2026国内最新适配家装全场景的十大柜子定制板材生产厂家 - 十大品牌榜
  • Java基础(课后笔记)
  • 改造策略
  • Superpowers:CC 资深工程素养 Skills 库
  • CANoe性能问题的处理方法
  • GIT将某分支(develop分支)合并至某分支(yunwei/develop分支)具体过程
  • 2026年发电机租赁行业权威分析报告:深度解析与优选指南 - 深度智识库
  • C++数据结构与算法_双指针法
  • 2026年中国智能办公平台深度研究报告
  • 【奖励到账】CSDN AI 社区镜像创作激励活动第八批奖励正式发放!
  • 聚焦环保全屋定制:2026国内最新适配家装柜体需求的十大欧松板源头厂家 - 十大品牌榜
  • 2026年发电车租赁厂家三大推荐榜:发电车租赁行业现状与筛选标准 - 深度智识库
  • Xbotics社区 | ArXiv 机器人学每日速递(2026.03.04)
  • 氙灯老化试验箱2026行业全景探究:六大主流品牌厂家实力剖析与科学选型指南 - 品牌推荐大师1
  • 国内有哪些好的字画回收机构?科普指南教你精准挑选 - 品牌排行榜单
  • BXMya GDD471A001 2UBA002322R0001 数字量输入/输出模块
  • 基于深度学习的工地运输车类型识别检测系统|全新web界面|多模态|AI大模型智能分析|YOLOv8、YOLOv10、YOLOv11、YOLOv12
  • 在 Windows 系统上一键安装 Ollama 的命令
  • 2026年 富锌漆厂家推荐排行榜:环氧/水性/无机富锌底漆,防腐防锈漆源头实力品牌深度解析 - 品牌企业推荐师(官方)
  • 2026年3月吉林通讯井/化粪池/污水管/下水井厂家哪家好 - 2026年企业推荐榜
  • OpenClaw agent-browser 技能实战:从入门到排坑指南
  • 2026年 防腐漆厂家实力推荐榜:工业/水性/钢结构/环氧/酚醛/聚硅氧烷等全系防腐工程漆深度解析与选购指南 - 品牌企业推荐师(官方)
  • 2026年发电机租赁厂家推荐:山东斯迈尔领衔三大标杆企业深度解析 - 深度智识库
  • 无速度传感器算法与滑模估测器C语言源码详解:Esmo增强型滑膜角度与位置估测器实现及Hfi+s...
  • 新手微信公众号排版用什么软件:TOP5爆款微信公众平台编辑器深度测评与使用指南 - 鹅鹅鹅ee
  • OpenClaw ClawHub 公共 Skills 注册中心使用指南
  • windows如何安装驱动
  • 西门子Smart与施耐德ATV71变频器通讯程序:自动化驱动流程,断电重启无忧,实现变频器智能...
  • 2026年发电机出租厂家权威推荐:斯迈尔深度解析与选型指南 - 深度智识库
  • Javascript中,const [opcode, ...operands] =数组的具体用法