Day17-Java进阶-网络编程(IP, 端口, 协议)TCP和UDP三次握手和四次挥手

news/2024/11/15 0:40:31/

1. 网络编程介绍

1.1 初始网络编程

1.2 网络编程三要素

1.2.1 IP

InetAddress 的使用

java">package com.itheima.Inetaddress;import java.net.InetAddress;
import java.net.UnknownHostException;public class InetAddressDemo1 {/*static InetAddress getByName(String host) 确定主机名称的IP地址, 主机名称可以是机器名称, 也可以是IP地址String getHostName()                      获取此IP地址的主机名String getHostAddress()                   返回文本显示中的IP地址字符串*/public static void main(String[] args) throws UnknownHostException {// 1. 获取InetAddress的对象 -- IP的对象 --> 一台电脑的对象InetAddress address = InetAddress.getByName("联想小新笔记本");System.out.println(address);String name = address.getHostName();System.out.println(name);String ip = address.getHostAddress();System.out.println(ip);}
}

1.2.2 端口号

1.2.3 协议

(1) UDP协议 (发送数据)

java">package com.itheima.udp;import java.io.IOException;
import java.net.*;public class SendMessageDemo {/*发送数据1. 创建DatagramSocket对象(快递公司)细节:绑定端口, 以后通过这个端口往外发送空参: 所有可用的端口中随机一个进行使用有参: 指定端口号进行绑定2. 打包数据3. 发送数据4. 释放资源*/public static void main(String[] args) throws IOException {// 1. 创建DatagramSocket对象(快递公司)DatagramSocket ds = new DatagramSocket();// 2. 打包数据String str = "你好威呀!!!";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();}
}

因UDP协议是面向无连接的, 只顾发出, 不考虑是否被正确接收.

(2) UDP协议 (接收数据)

java">package com.itheima.udp;import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException;public class ReceiveMessageDemo {/*接收数据:1. 创建DatagramSocket对象(快递公司)细节:1. 接收的时候, 一定要绑定端口2. 绑定的端口, 一定要跟发送的端口保持一致3. 解析数据包4. 释放资源*/public static void main(String[] args) throws IOException {// 1. 创建DatagramSocket对象(快递公司)DatagramSocket ds = new DatagramSocket(10086);// 2. 接收数据包byte[] bytes = new byte[1024];DatagramPacket dp = new DatagramPacket(bytes, bytes.length);// 该方法时阻塞的, 程序在执行到这一步时, 会一直在这里死等, 等发送端发送消息System.out.println(111111);ds.receive(dp);System.out.println(2222);// 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();}
}

(3) UDP协议 (聊天室)
java">package com.itheima.udpdemo2;import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;public class ReceiveMessageDemo {/*按照下面的要求实现程序UDP发送数据: 数据来自于键盘录入, 直到输入的数据是886, 发送数据结束UDP接收数据: 因为接受端不知道发送端什么时候停止发送, 故采用死循环接收*/public static void main(String[] args) throws IOException {// 1. 创建DatagramSocket的对象DatagramSocket ds = new DatagramSocket(10086);// 2. 接收数据包byte[] bytes = new byte[1024];DatagramPacket dp = new DatagramPacket(bytes, bytes.length);while (true) {ds.receive(dp);// 3. 解析数据包byte[] data = dp.getData();int len = dp.getLength();String ip = dp.getAddress().getHostAddress();String name = dp.getAddress().getHostName();// 4. 打印数据System.out.println("ip为: " + ip + ", 主机名为: " + name + "的人, 发送了数据: " + new String(data, 0, len));}}
}

1.3 UDP三种通讯方式

① 单播: 一对一

② 组播: 一对多

③ 广播: 可以给局域网中所有的电脑发送数据

java">package com.itheima.udpdemo3;import java.io.IOException;
import java.net.DatagramPacket;
import java.net.InetAddress;
import java.net.MulticastSocket;public class SendMessageDemo {/*组播发送端代码*/public static void main(String[] args) throws IOException {// 1. 创建MulticastSocket的对象MulticastSocket ms = new MulticastSocket();// 2. 打包数据String str = "你好你好!";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();}
}
java">package com.itheima.udpdemo3;import java.io.IOException;
import java.net.DatagramPacket;
import java.net.InetAddress;
import java.net.MulticastSocket;public class ReceiveMessageDemo1 {/*组播接收端代码*/public static void main(String[] args) throws IOException {// 1. 创建MulticastSocket的对象MulticastSocket ms = new MulticastSocket(10000);// 2. 将当前本机, 添加到224.0.0.1的这一组当中InetAddress address = InetAddress.getByName("224.0.0.1");ms.joinGroup(address);// 3. 创建DatagramPacket数据包对象byte[] bytes = new byte[1024];DatagramPacket dp = new DatagramPacket(bytes, bytes.length);// 4. 接受数据ms.receive(dp);// 5. 解析数据包byte[] data = dp.getData();int len = dp.getLength();String ip = dp.getAddress().getHostAddress();String name = dp.getAddress().getHostName();// 打印数据System.out.println("ip为: " + ip + ", 主机名为: " + name + "的人, 发送了数据: " + new String(data, 0, len));// 6. 释放资源ms.close();}
}

1.4 TCP 通信程序

java">package com.itheima.tcpdemo;import java.io.IOException;
import java.io.OutputStream;
import java.net.Socket;public class Client {/*TCP协议, 发送数据1. 创建Socket对象细节:在创建对象的同时会连接服务器若连接不上, 代码会报错*/public static void main(String[] args) throws IOException {// 1. 创建Socket对象Socket socket = new Socket("127.0.0.1",10000);// 2. 可以从连接通道中获取输出流OutputStream os = socket.getOutputStream();// 写出数据os.write("你好你好啊".getBytes()); // 一个字符占3个字节, 共12个字节// 3. 释放资源os.close();socket.close();}
}
java">package com.itheima.tcpdemo;import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.ServerSocket;
import java.net.Socket;public class Server {/*TCP协议, 接收数据*/public static void main(String[] args) throws IOException {// 1. 创建Socket对象ServerSocket ss = new ServerSocket(10000);// 2. 监听客户端的连接Socket socket = ss.accept();// 3. 从连接通道中获取输入流读取数据(字节流)/*InputStream is = socket.getInputStream();// 将字节流转换成字符流isrInputStreamReader isr = new InputStreamReader(is);// 包一个缓冲流提升读取效率BufferedReader br = new BufferedReader(isr);*/BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));int b;while ((b = br.read()) != -1){System.out.print((char) b);}// 4. 释放资源socket.close(); // 相当于断开跟客户端的连接ss.close(); // 相当于关闭服务器}
}

1.5 三次握手和四次挥手


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

相关文章

WebMvcConfigurer(一)介绍

一、简介 WebMvcConfigurer配置类其实是Spring内部的一种配置方式,采用JavaBean的形式来代替传统的xml配置文件形式进行针对框架个性化定制,可以自定义一些Handler,Interceptor,ViewResolver,MessageConverter。基于j…

Signed的本质和作用

前言 Verilog中的signed是一个很多人用不好,或者说不太愿意用的一个语法。因为不熟悉它的机制,所以经常会导致运算结果莫名奇妙地出错。其实了解了signed以后,很多时候用起来还是挺方便的。 signed的使用方法主要有两种,其中一种…

广州大学《软件工程》实验报告一需求分析

广州大学学生实验报告(一) 开课学院及实验室: 学院 年级/专业/班 姓名 学号 实验课程名称 软件工程导论实验 成绩 实验项目名称 需求分析 指导老师 一、实验目的 掌握需求建模技术,能够撰写需求规格说明文…

大数据时代,保护个人隐私小Tips Get 起来!

随着大数据时代的到来,我们的隐私正处于越来越易被侵犯的风险中。在各种社交媒体和信息共享平台上,我们需要输入各种个人信息,而这些信息可能被不法分子盗取,甚至被用来进行欺诈行为。在如今的大数据时代,保护个人隐私…

初学软件工程后对其的希望及个人目标

(学校作业) flag: 希望这学期可以做出人生中第一个亲手开发的软件。 对软件工程的希望: 1、希望能在软件工程学到更多在软件方面的技能,可以对软件有更加深刻的理解。 2、希望这个专业可以发展的越来越好,软…

在虚拟环境中找到Qt Designer

Pyqt5中找到Qt Designer 安装Pyqt5和Qt Designer: pip install pyqt5-tools 假设Python的虚拟环境名为:d2l ,虚拟环境在d2l文件夹中 D:\Software\d2l\Lib\site-packages\qt5_applications\Qt\bin 双击Qt designer启动 Pyside2中找到Qt Designer d2l是虚拟环境…

2024 年最好的免费数据恢复软件,您可以尝试的几个数据恢复软件

由于系统崩溃而丢失数据可能会给用户带来麻烦。我们将重要的宝贵数据和个人数据保存在我们的 PC、笔记本电脑和其他数字设备上。您可能会因分区丢失、意外删除文件和文件夹、格式化硬盘驱动器而丢失数据。数据丢失是不幸的,如果您不小心从系统中删除了文件或数据&am…

CISSP通关学习笔记:共计 9 个章节(已完结)

1. 笔记说明 第 0 章节为开篇介绍,不包括知识点。第 1 - 8 章节为知识点梳理汇总,8 个章节的知识框架关系如下图所示: 2. 笔记目录 「 CISSP学习笔记 」0.开篇「 CISSP学习笔记 」1.安全与风险管理「 CISSP学习笔记 」2.资产安全「 CISSP…