Java 网络编程

Java 网络编程

2026年3月11日·#Java菜鸟java·1210 字 6 分钟
浏览量加载中...
AI 摘要

嘿,想用 Java 写个聊天程序、上传文件,或者搞懂为啥浏览器输个网址就能打开网页?其实没那么玄——底层就是 IP、端口、TCP/UDP 这些“老朋友”在干活。这篇就带你轻轻松松理清网络编程的脉络,不堆概念,不啃协议,只聊代码里真正用得到的那些事儿。

一、 网络基础概念#

1.1 网络通信#

  • 概念:两台设备之间通过网络实现数据传输。

  • Java支持:java.net 包提供了一系列类/接口用于网络通信。

1.2 网络分类#

  • 局域网 (LAN):覆盖范围最小,如一个教室、机房。

  • 城域网 (MAN):覆盖一个城市。

  • 广域网 (WAN):覆盖全国或全球,如互联网。

1.3 IP地址#

  • 作用:唯一标识网络中的每台计算机/主机。

  • 表示形式:点分十进制 xx.xx.xx.xx(每个数范围0~255)。

  • 组成:网络地址 + 主机地址。

  • IPv4 vs IPv6:IPv4地址资源有限,IPv6地址数量极大,是下一代协议。

  • IPv4地址分类

类型范围
A类0.0.0.0 到 127.255.255.255
B类128.0.0.0 到 191.255.255.255
C类192.0.0.0 到 223.255.255.255
D类224.0.0.0 到 239.255.255.255 (多播)
E类240.0.0.0 到 247.255.255.255 (保留)

1.4 域名与端口#

1.5 网络通信协议#

  • TCP/IP协议簇:Internet最基本的协议,由网络层的IP协议和传输层的TCP协议等组成。

  • 网络模型

OSI模型TCP/IP模型TCP/IP模型各层协议
应用层应用层HTTP, FTP, Telnet, DNS…
表示层应用层
会话层应用层
传输层传输层TCP, UDP…
网络层网络层IP, ICMP, ARP…
数据链路层物理+数据链路层Link
物理层物理+数据链路层Link

1.6 TCP 与 UDP 协议#

特性TCP (传输控制协议)UDP (用户数据报协议)
连接性面向连接 (三次握手)无连接
可靠性可靠,数据不丢失不可靠,可能丢包
通信单位字节流数据报 (包)
数据大小无限制每个数据报 ≤ 64K
效率较低 (需建立/释放连接)较高
应用场景文件传输、邮件、网页浏览音视频通话、直播、DNS查询

二、 InetAddress 类#

  • 作用:用于封装IP地址和域名。

  • 常用方法

    • InetAddress.getLocalHost():获取本机InetAddress对象。

    • InetAddress.getByName(String host):根据主机名/域名获取对象。

    • getHostName():获取主机名。

    • getHostAddress():获取IP地址字符串。

三、 Socket 编程#

3.1 Socket 概念#

  • 套接字(Socket)是网络通信的端点。

  • 通信两端都必须有Socket。

  • 数据在Socket间通过IO流传输。

  • 主动发起连接的是客户端,等待连接的是服务端

四、 TCP 网络编程#

4.1 编程模型#

  • 服务端

    1. 创建 ServerSocket,在指定端口监听。

    2. 调用 accept() 等待客户端连接,连接成功返回 Socket 对象。

    3. 通过 Socket.getInputStream() 读取客户端发送的数据。

    4. 通过 Socket.getOutputStream() 向客户端回复数据。

    5. 关闭资源。

  • 客户端

    1. 创建 Socket,连接服务端(指定IP和端口)。

    2. 通过 Socket.getOutputStream() 发送数据。

    3. 通过 Socket.getInputStream() 接收服务端回复。

    4. 关闭资源。

4.2 应用案例#

  1. 案例1 (字节流,单向):客户端发送“hello, server”后退出,服务端接收并打印。

  2. 案例2 (字节流,双向):客户端发送消息,服务端回复“hello, client”,客户端接收回复。

    • 注意:通信结束时,应调用 socket.shutdownOutput() 设置输出结束标记,告知对方数据已发送完毕,避免对方 read 方法阻塞。
  3. 案例3 (字符流,双向):使用 BufferedReader 和 BufferedWriter 包装流进行字符通信。

    • 注意:使用 bufferedWriter.newLine() 插入换行作为结束标记,并调用 flush() 手动刷新缓冲区。
  4. 案例4 (文件上传):客户端发送图片/文件,服务端保存到本地,并回复“收到图片”。

    • 核心:使用 BufferedInputStream 和 BufferedOutputStream 提高效率。

    • 工具类:使用 StreamUtils 将输入流转换为字节数组或字符串,简化操作。

4.3 注意事项#

  • 实际通信中,客户端也会使用一个随机端口与服务端通信。

  • 可使用 netstat -an 指令查看主机网络状态(监听端口和连接信息)。

五、 UDP 网络编程#

5.1 基本介绍#

  • 核心类:DatagramSocket (数据报套接字) 和 DatagramPacket (数据包/数据报)。

  • 无连接:每个数据包独立,包含发送方和接收方的IP与端口。

  • 不可靠:不保证送达和顺序。

5.2 编程模型#

  • 发送端

    1. 创建 DatagramSocket 对象。

    2. 将数据封装到 DatagramPacket 对象中(指定数据、长度、目标IP、端口)。

    3. 调用 socket.send(packet) 发送。

    4. 可接收回复。

    5. 关闭 socket。

  • 接收端

    1. 创建 DatagramSocket 并在指定端口监听。

    2. 创建空的 DatagramPacket 对象用于接收。

    3. 调用 socket.receive(packet) 阻塞等待数据。

    4. 拆包 (packet.getData()) 处理数据。

    5. 可回复数据。

    6. 关闭 socket。

5.3 应用案例#

  • 接收端A在9999端口等待,发送端B发送“hello, 明天吃火锅~”,A接收后回复“好的,明天见”。
最后更新于 2026-03-11,距今已过 159 天

部分内容可能已过时

评论区

[ 标签 ]
# AI5# AI 编程2# AI工具1# Ajax2# Apifox1# AstrBot2# Astro2# CC Switch1# CDN2# Claude Code1# claudecode2# ClaudeCode1# CloudFlare2# Cloudflare1# CloudFlare-ImgBed1# coc3# CSS6# DeepSeek2# deepseek2# DELETE1# Docker1# EdgeOne3# Gist1# git1# GitHub1# hexo-circle-of-friends1# HTML6# HTTP2# Java23# java13# JavaScript5# JDBC3# JSON1# JUnit1# Logback1# Maven6# Mybatis1# MyBatis4# MySQL6# MySql1# NapCat1# Obsidian3# OpenCode3# ORM1# PathVariable1# PicGo1# py2# RequestBody1# RequestMapping1# RESTful风格1# skills1# Slf4j1# SpringBoot11# SQL2# Svelte2# TailwindCSS1# Telegram2# Tlias2# Vercel1# Vue7# Waline3# WebDAV1# Web基础6# WinSCP1# YAML1# 三层架构1# 中二宣言1# 书籍1# 使用文档9# 写作1# 刷步数1# 前端32# 动态1# 动漫1# 单词2# 博客6# 博客工作流1# 博客开发2# 参数接收1# 友链1# 反思2# 图床4# 地图1# 备份1# 奇思妙想1# 存储1# 学习方法1# 宝塔面板3# 宝宝9# 导航栏1# 工具2# 开发1# 开发规范1# 开心1# 影视1# 微信1# 性能优化2# 总结1# 想法7# 感悟9# 指南1# 插件3# 故障排除1# 效率工具2# 教程7# 数据库10# 斩神1# 日常60# 日志框架1# 朋友圈1# 朱元璋1# 模板1# 测试1# 游戏1# 生活迁移1# 电影2# 碎碎念1# 视觉识别1# 网络教室1# 羊毛1# 脚本1# 脚本工具1# 自动化2# 蓝奏云1# 订阅推荐1# 记录1# 评论系统1# 词根1# 词缀1# 说说1# 足迹1# 跑步2# 路径参数1# 转载1# 运动1# 部落冲突1# 配置1# 随机图1# 音乐3# 音标1# 饮食1# 驼峰命名1# 高德地图1
[ 公告 ]

如果你喜欢,那么欢迎来到我的世界!

了解更多
[ 音乐 ]
封面

音乐

暂未播放

0:000:00
暂无歌词
找不到相关结果。
[ contents ]
[ 全部文章 ]
工具