Java基础_网络编程

news/2024/10/24 7:21:44/

Java基础_网络编程

  • 网络编程三要素
    • InetAddress
    • 网络模型
  • UDP通信程序
    • 单播
      • 发送数据
      • 接收数据
      • 聊天室
    • 组播
    • 广播
  • TCP
    • TCP通信程序
    • 三次握手和四次挥手
  • 来源
  • Gitee地址

网络编程三要素

  • IP: 设备在网络中的地址,是唯一的标识
  • 端口号: 应用程序在设备中唯一的标识。
  • 协议: 数据在网络中传输的规则,常见的协议有UDP、TCP、http、https、ftp。

InetAddress

public class demo {public static void main(String[] args) throws UnknownHostException {/*** static InetAddress getByName(String host)  确定主机名称的IP地址。主机名称可以是机器名称,也可以是IP地址* String getHostName()                       获取此IP地址的主机名* String getHostAddress()                    返回文本显示中的IP地址字符串*/// 1. 获取InetAddress的对象InetAddress address = InetAddress.getByName("cen");System.out.println(address);String hostName = address.getHostName();System.out.println(hostName); // cenString hostAddress = address.getHostAddress();System.out.println(hostAddress); // 192.168.174.1}
}

网络模型

  • OSI参考模型:世界互联协议标准,全球通信规范,单模型过于理想化,未能在因特网上进行广泛推
  • TCP/IP参考模型(或TCP/IP协议):事实上的国际标准。

在这里入图片描述

UDP通信程序

单播

发送数据

public class Demo {public static void main(String[] args) throws IOException {/*** udp发送数据*/// 1. 创建DatagramSocket对象// 绑定发送端口// 空参: 所有可用端口中随机一个进行使用// 有参: 指定端口DatagramSocket ds = new DatagramSocket();// 2. 打包数据String str = "Hello Socket!";byte[] bytes = str.getBytes();InetAddress address = InetAddress.getByName("127.0.0.1");int port = 10086;DatagramPacket dp = new DatagramPacket(bytes, bytes.length, address, port);// 3. 发送数据ds.send(dp);// 4. 释放资源ds.close();}
}

接收数据

public class ReceiveDemo {public static void main(String[] args) throws IOException {/*** udp接收数据*/// 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 len = dp.getLength();InetAddress address = dp.getAddress();int port = dp.getPort();System.out.println("接收到数据: " + new String(data, 0, len));System.out.println("该数据是从" + address + "的" + port + "端口发出的");// 4. 释放资源ds.close();}
}

聊天室

// SendDemo
public class SendDemo {public static void main(String[] args) throws IOException {/*** udp循环发送数据, 直到输入886, 停止发送*/DatagramSocket ds = new DatagramSocket();Scanner sc = new Scanner(System.in);// 循环发送数据while(true) {String str = sc.nextLine();if(str.equals("886")){break;}byte[] bytes = str.getBytes();InetAddress address = InetAddress.getByName("127.0.0.1");int port = 10086;DatagramPacket dp = new DatagramPacket(bytes, bytes.length, address, port);ds.send(dp);}ds.close();}
}// ReceiveDemo
public class ReceiveDemo {public static void main(String[] args) throws IOException {/*** udp循环接收数据*/DatagramSocket ds = new DatagramSocket(10086);while(true) {byte[] bytes = new byte[1024];DatagramPacket dp = new DatagramPacket(bytes, bytes.length);ds.receive(dp);byte[] data = dp.getData();int len = dp.getLength();InetAddress address = dp.getAddress();int port = dp.getPort();System.out.println("接收到数据: " + new String(data, 0, len));System.out.println("该数据是从" + address + "的" + port + "端口发出的");}}
}

组播

  • 组播地址: 224.0.0.0 ~ 239.255.255.255, 其中224.0.0.0 ~ 224.0.0.255为预留的组播地址
// Send
public class SendDemo {public static void main(String[] args) throws IOException {/*** 组播发送*/// 1. 创建MulticastSocket对象MulticastSocket ms = new MulticastSocket();// 2. 创建DatagramPacket对象String str = "Hello MultiSocket!";byte[] bytes = str.getBytes();InetAddress address = InetAddress.getByName("224.0.0.1");int port = 10000;DatagramPacket dp = new DatagramPacket(bytes, bytes.length, address, port);// 3. 发送数据ms.send(dp);// 4. 释放资源ms.close();}
}// Receive
public class ReveiveDemo1 {public static void main(String[] args) throws IOException {MulticastSocket ms = new MulticastSocket(10000);// 将当前本机添加到 224.0.0.1InetAddress address = InetAddress.getByName("224.0.0.1");ms.joinGroup(address);// 2. 接收数据byte[] bytes = new byte[1024];DatagramPacket dp = new DatagramPacket(bytes, bytes.length);ms.receive(dp);// 3. 解析数据byte[] data = dp.getData();int len = dp.getLength();String ip = dp.getAddress().getHostAddress();String name = dp.getAddress().getHostName();System.out.println("接收到数据: " + new String(data, 0, len));System.out.println("该数据是从" + name + "/" + ip + "发出的");// 4. 释放资源ms.close();}
}

广播

将单播程序发送的ip地址改为255.255.255.255就是广播

TCP

TCP通信程序

// Client
public class ClientDemo {public static void main(String[] args) throws IOException {/*** tcp发送数据*/// 1. 创建Socket对象// 创建对象的同时会连接服务端, 如果连接不是, 代码会报错Socket socket = new Socket("127.0.0.1", 10000);// 2. 可以从连接通道中获取输出流OutputStream os = socket.getOutputStream();// 写出数据os.write("Hello TCP连接!".getBytes());// 3. 释放资源os.close();socket.close();}
}// Server
public class ServerDemo {public static void main(String[] args) throws IOException {/*** tcp接收数据*/// 1. 创建ServerSocket对象ServerSocket ss = new ServerSocket(10000);// 2. 监听客户端的连接Socket socket = ss.accept();// 3. 从连接通道中获取输入流读取数据InputStream is = socket.getInputStream();InputStreamReader isr = new InputStreamReader(is);BufferedReader br = new BufferedReader(isr);int b;while( (b = br.read()) != -1 ){System.out.print((char) b);}// 4. 释放资源socket.close();ss.close();}
}
  • 中文乱码: 将字节流通过转换流转换成字符流
  • 提高效率: 转成缓冲流
  • 输入输出流可以无需手动关闭, 因为流是在连接通道里的, 连接断开后, 流也就关闭了
  • 连接关闭时的协议: 四次挥手, 利用四次挥手协议断开连接, 可以保证连接连接通道里的数据已经处理完毕了.

三次握手和四次挥手

  • 三次握手 - 确保连接建立
    1. 客户端向服务器发出连接请求, 等待服务器确认
    2. 服务器向客户端返回一个响应, 告知客户端收到了请求
    3. 客户端向服务器再次发出确认信息, 连接建立
  • 四次挥手 - 确保连接断开, 且数据处理完毕
    1. 客户端向服务器发出取消连接请求
    2. 服务器向客户端返回一个响应, 表示收到客户端取消请求
    3. 服务器将最后的数据处理完毕后, 服务器向客户端发出确认取消信息
    4. 客户端再次发送确认消息, 连接取消

来源

黑马程序员. 阿玮Java零基础

Gitee地址

https://gitee.com/yu-ba-ba-ba/awJava


http://www.ppmy.cn/news/989959.html

相关文章

只出现1次的数字(总结欢迎补充)

1.找只出现1次的数字,其余数出现n次 给你一个整数数组 nums ,除某个元素仅出现 一次 外,其余每个元素都恰出现n次 。请你找出并返回那个只出现了一次的元素 当n等于2时 这道题可以使用异或运算来解决。我们知道,异或运算有以下性质&#xf…

【技巧】通过 CMD 走代理下载 Vue

通过 CMD 走代理下载 Vue 在学习或者工作中,有时上网走的是代理模式,就是在浏览器里面配置代理服务的那种。后来在下载 Vue 组件的时候显示请求超时。此时才发先,浏览器代理只能在浏览器里生效,cmd 中不生效,那该怎么办…

井字棋(TicTacToe)

目录 三种游戏 习题 1. 传统设置 2. 中间的网格 三种游戏 “选15”、“井字棋”、“魔幻15”游戏本质上是同一个游戏。 function tictactoe(job) % TICTACTOE Pick15, TicTacToe, and Magic3. % % Pick15. Pick single digit numbers. Each digit can be chosen % on…

区块链 2.0笔记

区块链 2.0 以太坊概述 相对于比特币的几点改进 缩短出块时间至10多秒ghost共识机制mining puzzle BTC:计算密集型ETH:memory-hard(限制ASIC) proof of work->proof of stake对智能合约的支持 BTC:decentralized currencyETH:decentral…

【代码review、审核开发工程师的设计与研发质量工作经验之谈】

作为一个开发工程师,代码review与审核是我们日常工作不可或缺的一环。它不仅有助于提高代码质量,还可以避免不必要的错误和漏洞。下面我将分享一下我的经验,重点讨论代码review与审核方面的工作。 一、准备工作 在进行代码review和审核之前&…

Python不是一门伟大的语言

作为一门简洁易用、生态蓬勃且具有高泛用性的编程语言,Python一直以来都被不少人称作“编程语言中的瑞士军刀”。 尤其随着近来AI热潮席卷全球,Python在编程语言圈中的地位也随之水涨船高,甚至一度被视作AI专用语言或大数据专用语言。 然而…

AI 绘画Stable Diffusion 研究(二)sd模型ControlNet1.1 介绍与安装

部署包作者:秋葉aaaki 免责声明: 本安装包及启动器免费提供 无任何盈利目的 大家好,我是风雨无阻。 众所周知,StableDiffusion 是非常强大的AI绘图工具,需要详细了解StableDiffusion的朋友,可查看我之前的这篇文章: …

25.10 matlab里面的10中优化方法介绍—— 函数fmincon(matlab程序)

1.简述 关于非线性规划 非线性规划问题是指目标函数或者约束条件中包含非线性函数的规划问题。 前面我们学到的线性规划更多的是理想状况或者说只有在习题中,为了便于我们理解,引导我们进入规划模型的一种情况。相比之下,非线性规划会更加贴近…