Java Sock 网络 InetAddress

本文详细介绍Java网络编程的基础知识,包括如何使用InetAddress类获取本地主机信息、URL类解析网络资源,以及通过Socket进行TCP和UDP通信的具体实现。

//获取本机的InetAddress实例

InetAddress address = InetAddress.getLocalHost();

System.out.println("计算机名:"+ address.getHostName());

System.out.println("IP地址:"+address.getHostAddress());

//获取字节数组形式的IP地址

byte[] bytes = address.getAddress();

System.out.println("字节数组形式的IP"+Arrays.toString(bytes));

System.out.println(address);

//根据主机名获取InetAddress实例

InetAddress address2 = InetAddress.getByName("localhost");

System.out.println("计算机名:"+ address2.getHostName());

System.out.println("IP地址:"+address2.getHostAddress());



//创建URL实例—————

URL urlString = new URL("http://www.baidu.com");

URL url = new URL(urlString, "/index.html?username = tom#test");

System.out.println("协议:"+url.getProtocol());

System.out.println("主机:"+url.getHost());

//未指定端口号 使用默认端口号 此时Por方法返回值是-1

System.out.println("端口:"+url.getPort());

System.out.println("文件路径:"+url.getPath());

System.out.println("文件名:"+url.getFile());

System.out.println("相对路径:"+url.getRef());

System.out.println("查询字符转:"+url.getQuery());

// 端口:-1

// 文件路径:/index.html

// 文件名:/index.html?username = tom

// 相对路径:test

// 查询字符转:username = tom

// 通过URL对象的openSteam()方法可以得到执行的资源输入流 

// 通过输入流可以读取、访问网络上的数据

// 使用读取网页内容

URL urlS = new URL("http://www.baidu.com");

try {

// 通过URLopenSream方法获取URL对象所表示的资源字节输入

InputStream isurlS.openStream();

// 将字节输入流转换为字节输入流

InputStreamReader isr = new InputStreamReader(is);

// 为字符输入流添加到缓冲

BufferedReader br = new BufferedReader(isr);

String data = br.readLine(); //读取数据

while (data!= null) {

System.out.println(data);

data = br.readLine();

}

br.close();

isr.close();

is.close();


Socket TCP编程

// Socket实现步骤

// 创建ServerSocketSocket  打开连接到Socket的输入输出流

// 服务器端

// 1、创建ServerSocket对象,绑定监听端口 2、通过accept()方法监听客户端请求

// 3、连接建立后,通过输入流读取客户端发送的请求信息 4、通过输出流向客户点发送相应信息

// 5、关闭相关资源

// 客户端

// 1、创建Socket对象,指明需要连接的服务器的地址和端口号

// 2、连接建立后,通过输出流流向服务器端发送请求信息

// 3、通过输入流获取服务器相应的信息 4、关闭相关资源


//服务器线程处理类————

public class ServerThread extends Thread {


// 和本线程相关的socket

Socket socket = null;

public ServerThread(Socket socket){

this.socket = socket;

}

// 线程执行的操作, 响应客户端的请求

public void run() {

//

// 获取输入流 并读取客户端信息

InputStream is = null;

InputStreamReader isr= null;

// 为输入流添加缓冲

BufferedReader br = null;

// 获取输出流响应客户端的请求

OutputStream os = null;

PrintWriter pw = null;

try {

is = socket.getInputStream();

isr = new InputStreamReader(is);

br = new BufferedReader(isr);

String info = null;

while ((info = br.readLine()) != null) {// 循环读取客户端的信息

System.out.println("我是服务器, 客户端说:"+ info);

}

socket.shutdownInput();// 关闭输入流

os = socket.getOutputStream();

pw = new PrintWriter(os);

pw.write("hello lanuch");

pw.flush();  //将缓冲输出

} catch (IOException e) {

// TODO Auto-generated catch block

e.printStackTrace();

} finally {

try {

if(pw!=null)

// 关闭相关的资源

pw.close();

if(os!= null)

os.close();

if(br!= null)

br.close();

if(isr!= null)

isr.close();

if(is!= null)

is.close();

if(socket!= null)

socket.close();


//基于TCP协议的Socket通信实现登录=============

// 服务器端

// 创建服务器端Socket ServerSocket 指定绑定的端口号,并监听此端口

ServerSocket serverSocket = new ServerSocket(8888);

Socket socket = null;

// 记录客户端的数量

int count = 0;

System.out.println("**服务器即将启动,等待客户端的连接***");

while(true){

// 调用accept()方法开始监听 等待客户端连接

socket = serverSocket.accept();

// 创建一个新线程

ServerThread serverThread = new ServerThread(socket);

// 启动线程

serverThread.start();

count++;

System.out.println("客户端的数量"+count);

}

//// 获取输入流 并读取客户端信息

// InputStream is =  socket.getInputStream(); //字节输入流

// InputStreamReader isr = new InputStreamReader(is); //将字节流转换为字符流

//// 为输入流添加缓冲

// BufferedReader br = new BufferedReader(isr);

// String info = null;

// while ((info = br.readLine()) != null) {// 循环读取客户端的信息

//

// System.out.println("我是服务器, 客户端说:"+ info);

// }

// socket.shutdownInput();// 关闭输入流

//

//// 获取输出流响应客户端的请求

// OutputStream os = socket.getOutputStream();

// PrintWriter pw = new PrintWriter(os); //包装打印流

// pw.write("hello lanuch");

// pw.flush();  //将缓冲输出

//

//// 关闭相关的资源

// pw.close();

// os.close();

//

// br.close();

// isr.close();

// is.close();

// socket.close();

// serverSocket.close();


客户端——————————————————

1.创建客户端Socket 指定服务器地址和端口

Socket socket = new Socket("127.0.0.1", 8888);

// 2.获取输出流,向服务器端发送信息

OutputStream ossocket.getOutputStream(); //字节输出流

PrintWriter pw = new PrintWriter(os); //将输出流包装为打印流输出

pw.write("用户名:admin2 ;密码:1233");

pw.flush();

socket.shutdownOutput(); //关闭输出流

// 获取输入流读取服务器端的响应信息

InputStream is = socket.getInputStream();

BufferedReader br = new BufferedReader(new InputStreamReader(is));

String info = null;

while((info = br.readLine() )!= null){

System.out.println("我是客户端 服务器说:"+info);

}

// 关闭资源

br.close();

is.close();

pw.close();

os.close();

socket.close();



基于UDP的Socket编程

客户端

/ 1、定义发送信息 2、创建DatagramPacket包含将要发送的信息

// 3、创建DatagramSocket 4、发送数据

public static void main(String[] args) throws IOException {

// 向服务器端发送数据

// 1.定义服务器的地址、端口号、数据

InetAddress address = InetAddress.getByName("localhost");

int port = 8800;

byte[] data = "用户名: admin 密码:123".getBytes();

// 创建数据报,包含发送的数据信息

DatagramPacket packet = new DatagramPacket(data, data.length, address, port);

// 创建DatagramSocket对象

DatagramSocket socket = new DatagramSocket();

// 向服务器端发送数据报

socket.send(packet);

// 接收服务器端响应的数据

// 1、创建数据报 用于接收服务器端响应的数据

byte[] data2 = new byte[1024];

DatagramPacket packet2 = new DatagramPacket(data2, data2.length);

// 2/接收服务器响应的数据

socket.receive(packet2);

// 3、读取数据

String reply = new String(data2, 0, packet2.getLength());

System.out.println("我是客户端,服务器端说:"+reply);

// 关闭资源

socket.close();

}


服务器端————

/1、服务器端实现步骤 创建DatagramSocket指定端口号 2、创建DatagramPacket

// 3、接受客户端发送的数据信息 4、读取数据

public static void main(String[] args) throws IOException {

try {

// 接收客户端发送的数据

// 创建服务器端DatagramSocket 指定端口

DatagramSocket socket = new DatagramSocket(8800);

// 创建数据报 用于接受客户端发送的数据

byte[] data = new byte[1024];

DatagramPacket packet = new DatagramPacket(data, data.length);

// 接收客户端发送的数据

System.out.println("我是服务器启动 等待客户端。。。");

socket.receive(packet); //此方法在接收到数据报之前会一直阻塞

// 读取数据

String info = new String(data, 0, packet.getLength());

System.out.println("我是服务器,客户端说"+info);

// 向客户端相应数据

// 定义客户端的地址、端口号、数据

InetAddress addresspacket.getAddress();

int port = packet.getPort();

byte[] data2 ="欢迎 ".getBytes();

// 创建数据报 包含相应的数据信息

DatagramPacket packet2  = new DatagramPacket(data2, data2.length, address, port);

// 响应客户端

socket.send(packet2);


// 关闭资源

socket.close();

} catch (SocketException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

}

内容概要:本文详细介绍了“秒杀商城”微服务架构的设计与实战全过程,涵盖系统从需求分析、服务拆分、技术选型到核心功能开发、分布式事务处理、容器化部署及监控链路追踪的完整流程。重点解决了高并发场景下的超卖问题,采用Redis预减库存、消息队列削峰、数据库乐观锁等手段保障数据一致性,并通过Nacos实现服务注册发现与配置管理,利用Seata处理跨服务分布式事务,结合RabbitMQ实现异步下单,提升系统吞吐能力。同时,项目支持Docker Compose快速部署和Kubernetes生产级编排,集成Sleuth+Zipkin链路追踪与Prometheus+Grafana监控体系,构建可观测性强的微服务系统。; 适合人群:具备Java基础和Spring Boot开发经验,熟悉微服务基本概念的中高级研发人员,尤其是希望深入理解高并发系统设计、分布式事务、服务治理等核心技术的开发者;适合工作2-5年、有志于转型微服务或提升架构能力的工程师; 使用场景及目标:①学习如何基于Spring Cloud Alibaba构建完整的微服务项目;②掌握秒杀场景下高并发、超卖控制、异步化、削峰填谷等关键技术方案;③实践分布式事务(Seata)、服务熔断降级、链路追踪、统一配置中心等企业级中间件的应用;④完成从本地开发到容器化部署的全流程落地; 阅读建议:建议按照文档提供的七个阶段循序渐进地动手实践,重点关注秒杀流程设计、服务间通信机制、分布式事务实现和系统性能优化部分,结合代码调试与监控工具深入理解各组件协作原理,真正掌握高并发微服务系统的构建能力。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值