Java学习总结--040网络编程

2023-10-07 18:50

本文主要是介绍Java学习总结--040网络编程,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

1 计算机网络
是指将地理位置不同的具有独立功能的多台计算机及其外部设备,通过通信线路连接起来,在网络操作系统,网络管理软件及网络通信协议的管理和协调下,实现资源共享和信息传递的计算机系统。

2 网络编程
就是用来实现网络互连的不同计算机上运行的程序间可以进行数据交换。

3 网络编程三要素
IP
每个设备在网络中的唯一标识
每台网络终端在网络中都有一个独立的地址,我们在网络中传输数据就是使用这个地址。
IP地址的分类:IPv4 & IPv6
IPv4
IPv4:4个字节组成,4个0-255。大概42亿,30亿都在北美,亚洲4亿。2011年初已经用尽,IP格式: 192.168.1.168。
测试网络连接 ping 192.168.1.68
本地回路地址:ping 127.0.0.1(测试网卡有没插好)
广播地址:255.255.255.255
IP地址也分公网地址(万维网使用)和私有地址(局域网使用),192.168.开头的就是私有址址
IPv6:8组,每组4个16进制数。1a2b:0000:aaaa:0000:0000:0000:aabb:1f2f(IPv6暂先不用掌握)

Port端口
端口号是每个程序在设备上的唯一标识
每个网络程序都需要绑定一个端口号,传输数据的时候除了确定发到哪台机器上,还要明确发到哪个程序,端口号范围从0-65535
编写网络应用就需要绑定一个端口号,尽量使用1024以上的,1024以下的基本都被系统程序占用了。
常用端口,面试会问
mysql: 3306
oracle: 1521
web: 80
tomcat: 8080

协议
协议是为计算机网络中进行数据交换而建立的规则、标准或约定的集合。
网络传输方式协议有TCP&UDP

TCP(传输控制协议)
面向连接(三次握手),数据安全,速度略低。分为客户端和服务端。
三次握手: 客户端先向服务端发起请求, 服务端响应请求, 传输数据

UDP(数据报传输协议)
面向无连接,数据不安全,速度快。不区分客户端与服务端。

4 Socket概述
Socket翻译过来就是套接字
网络上具有唯一标识的IP地址和端口号组合在一起才能构成唯一能识别的标识符套接字。
通信的两端都有Socket,网络通信其实就是Socket间的通信。
数据在两个Socket间通过IO流传输。Socket就是用来建立通信管道
Socket在应用程序中创建,通过一种绑定机制与驱动程序建立关系,告诉自己所对应的IP和port。

在这里插入图片描述

5 TCP通信原理图解
在这里插入图片描述

2.6 UDP通信原理图解
在这里插入图片描述

2.7 案例:UDP数据传输
实现步骤:
发送Send
创建DatagramSocket, 随机端口号
创建DatagramPacket, 指定数据, 长度, 地址, 端口
使用DatagramSocket发送DatagramPacket
关闭DatagramSocket

接收Receive
创建DatagramSocket, 指定端口号
创建DatagramPacket, 指定数组, 长度
使用DatagramSocket接收DatagramPacket
关闭DatagramSocket
从DatagramPacket中获取数据

案例:实现UDP的发送和接收

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

// 1.发送Send
// 创建DatagramSocket, 随机端口号
DatagramSocket sender = new DatagramSocket();

// 创建DatagramPacket【数据包】, 指定数据, 长度, 地址, 端口
String s = “你好吗?最近很想你”;
byte[] bs = s.getBytes(“UTF-8”);
DatagramPacket packet = new DatagramPacket(bs, bs.length, Inet4Address.getByName(“192.168.1.125”), 5288);

// 使用DatagramSocket发送DatagramPacket
sender.send(packet);

// 关闭DatagramSockets
sender.close();
}
public static void main(String[] args) throws IOException {
// 2.接收Receive
// 创建DatagramSocket, 指定端口号
DatagramSocket receiver = new DatagramSocket(5288);

// 创建DatagramPacket, 指定数组, 长度
byte[] buf = new byte[1024];
DatagramPacket packet = new DatagramPacket(buf, 1024);

// 使用DatagramSocket接收DatagramPacket
receiver.receive(packet);

// 关闭DatagramSocket
receiver.close();

// 从PackeDatagramt中获取数据
String s = new String(buf, 0, packet.getLength(), “UTF-8”);
System.out.println(“接收到数据:” + s);
}

案例:添加键盘和死循环功能
public class Demo_Sender {

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

// 1.发送Send
// 创建DatagramSocket, 随机端口号
DatagramSocket sender = new DatagramSocket();

	//2 ScannerScanner scanner = new Scanner(System.in);while(true){

// 创建DatagramPacket【数据包】, 指定数据, 长度, 地址, 端口
System.out.println(“输入内容:”);
String s = scanner.nextLine();
byte[] bs = s.getBytes(“UTF-8”);
DatagramPacket packet = new DatagramPacket(bs, bs.length, Inet4Address.getByName(“192.168.1.125”), 5288);

// 使用DatagramSocket发送DatagramPacket
sender.send(packet);
}

// 关闭DatagramSockets
//sender.close();
}
}

package lesson05;
public class Demo_Receiver {

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

// 2.接收Receive
// 创建DatagramSocket, 指定端口号
DatagramSocket receiver = new DatagramSocket(5288);

	while(true){

// 创建DatagramPacket, 指定数组, 长度
byte[] buf = new byte[1024];
DatagramPacket packet = new DatagramPacket(buf, 1024);

// 使用DatagramSocket接收DatagramPacket
receiver.receive(packet);

// 关闭DatagramSocket
//receiver.close();

// 从PackeDatagramt中获取数据
String s = new String(buf, 0, packet.getLength(), “UTF-8”);
System.out.println(new Date() + “接收到数据:” + s);
}
}
}

案例:使用双线程来收发数据
public class Demo {

public static void main(String[] args) {// 案例:UDP数据传输+键盘和循环+双线程实现(了解)new Receiver().start();new Sender().start();
}

}

class Receiver extends Thread {
@Override
public void run() {
// TODO Auto-generated method stub
try {

		// 创建DatagramSocket, 指定端口号DatagramSocket receiver = new DatagramSocket(5288);while (true) {// 创建DatagramPacket, 指定数组, 长度byte[] buf = new byte[1024];DatagramPacket packet = new DatagramPacket(buf, 1024);// 使用DatagramSocket接收DatagramPacketreceiver.receive(packet);// 关闭DatagramSocket// receiver.close();// 从PackeDatagramt中获取数据String s = new String(buf, 0, packet.getLength(), "UTF-8");System.out.println(new Date() + "接收到数据:" + s);}} catch (Exception e) {// TODO: handle exception}
}

}

class Sender extends Thread {
@Override
public void run() {
try {
// 创建DatagramSocket, 随机端口号
DatagramSocket sender = new DatagramSocket();

		//2 ScannerScanner scanner = new Scanner(System.in);while(true){

// 创建DatagramPacket【数据包】, 指定数据, 长度, 地址, 端口
System.out.println(“输入内容:”);
String s = scanner.nextLine();
byte[] bs = s.getBytes(“UTF-8”);
DatagramPacket packet = new DatagramPacket(bs, bs.length, Inet4Address.getByName(“192.168.1.125”), 5288);

// 使用DatagramSocket发送DatagramPacket
sender.send(packet);
}
} catch (Exception e) {
// TODO: handle exception
}
}
}

2.8 案例:TCP数据传输【多练】
》客户端用键盘+死循环实现
public class Demo_Client {

public static void main(String[] args) throws IOException {//1.创建Socket对象Socket socket = new Socket("192.168.1.125", 9999);//2.获取输入流出InputStream is = socket.getInputStream();OutputStream os = socket.getOutputStream();BufferedReader br = new BufferedReader(new InputStreamReader(is));PrintWriter pw = new PrintWriter(os);//3.发送数据给服务端面pw.write("Java 还是不错的...\r\n");pw.flush();//4.读服务响应的数据System.out.println("读取响应数据:" + br.readLine());//关流br.close();socket.close();
}

}
public class Demo_Server {

public static void main(String[] args) throws Exception {//1.创建个服务端Socket对象,绑定端口ServerSocket serverSocket = new ServerSocket(9999);//2.监听客户端面连接while(true){Socket clientSocket = serverSocket.accept();//3.接收客户端面发送的数据new Thread(){public void run() {try {//读写数据都是通过IOInputStream is = clientSocket.getInputStream();OutputStream os = clientSocket.getOutputStream();BufferedReader br = new BufferedReader(new InputStreamReader(is));PrintWriter pw = new PrintWriter(os);while(true){//读取客户端的数据String line = br.readLine();if(line != null){System.out.println(clientSocket + ":" + new Date() +  "接收到客户端发送的数据:" + line);//响应客户端面pw.write("receiver success\r\n");pw.flush();}	}} catch (Exception e) {// TODO: handle exception}};}.start();}
}

}

这篇关于Java学习总结--040网络编程的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/159749

相关文章

Java实现检查多个时间段是否有重合

《Java实现检查多个时间段是否有重合》这篇文章主要为大家详细介绍了如何使用Java实现检查多个时间段是否有重合,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录流程概述步骤详解China编程步骤1:定义时间段类步骤2:添加时间段步骤3:检查时间段是否有重合步骤4:输出结果示例代码结语作

Java中String字符串使用避坑指南

《Java中String字符串使用避坑指南》Java中的String字符串是我们日常编程中用得最多的类之一,看似简单的String使用,却隐藏着不少“坑”,如果不注意,可能会导致性能问题、意外的错误容... 目录8个避坑点如下:1. 字符串的不可变性:每次修改都创建新对象2. 使用 == 比较字符串,陷阱满

Java判断多个时间段是否重合的方法小结

《Java判断多个时间段是否重合的方法小结》这篇文章主要为大家详细介绍了Java中判断多个时间段是否重合的方法,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录判断多个时间段是否有间隔判断时间段集合是否与某时间段重合判断多个时间段是否有间隔实体类内容public class D

IDEA编译报错“java: 常量字符串过长”的原因及解决方法

《IDEA编译报错“java:常量字符串过长”的原因及解决方法》今天在开发过程中,由于尝试将一个文件的Base64字符串设置为常量,结果导致IDEA编译的时候出现了如下报错java:常量字符串过长,... 目录一、问题描述二、问题原因2.1 理论角度2.2 源码角度三、解决方案解决方案①:StringBui

Java覆盖第三方jar包中的某一个类的实现方法

《Java覆盖第三方jar包中的某一个类的实现方法》在我们日常的开发中,经常需要使用第三方的jar包,有时候我们会发现第三方的jar包中的某一个类有问题,或者我们需要定制化修改其中的逻辑,那么应该如何... 目录一、需求描述二、示例描述三、操作步骤四、验证结果五、实现原理一、需求描述需求描述如下:需要在

Java中ArrayList和LinkedList有什么区别举例详解

《Java中ArrayList和LinkedList有什么区别举例详解》:本文主要介绍Java中ArrayList和LinkedList区别的相关资料,包括数据结构特性、核心操作性能、内存与GC影... 目录一、底层数据结构二、核心操作性能对比三、内存与 GC 影响四、扩容机制五、线程安全与并发方案六、工程

JavaScript中的reduce方法执行过程、使用场景及进阶用法

《JavaScript中的reduce方法执行过程、使用场景及进阶用法》:本文主要介绍JavaScript中的reduce方法执行过程、使用场景及进阶用法的相关资料,reduce是JavaScri... 目录1. 什么是reduce2. reduce语法2.1 语法2.2 参数说明3. reduce执行过程

如何使用Java实现请求deepseek

《如何使用Java实现请求deepseek》这篇文章主要为大家详细介绍了如何使用Java实现请求deepseek功能,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录1.deepseek的api创建2.Java实现请求deepseek2.1 pom文件2.2 json转化文件2.2

Java调用DeepSeek API的最佳实践及详细代码示例

《Java调用DeepSeekAPI的最佳实践及详细代码示例》:本文主要介绍如何使用Java调用DeepSeekAPI,包括获取API密钥、添加HTTP客户端依赖、创建HTTP请求、处理响应、... 目录1. 获取API密钥2. 添加HTTP客户端依赖3. 创建HTTP请求4. 处理响应5. 错误处理6.

Spring AI集成DeepSeek的详细步骤

《SpringAI集成DeepSeek的详细步骤》DeepSeek作为一款卓越的国产AI模型,越来越多的公司考虑在自己的应用中集成,对于Java应用来说,我们可以借助SpringAI集成DeepSe... 目录DeepSeek 介绍Spring AI 是什么?1、环境准备2、构建项目2.1、pom依赖2.2