逸学java【初级菜鸟篇】12.网络通讯编程

2023-12-04 00:44

本文主要是介绍逸学java【初级菜鸟篇】12.网络通讯编程,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

hi,我是逸尘,一起学java吧


目标(任务驱动)

请练掌网络通讯的内容。

局域网和互联网

局域网英文:Local Area Network,缩写:LAN,是指一群通过一定形式连接起来的计算机,可以是两台计算机组成也可以是同一区域上千台计算机组成。

将LAN延伸到更大范围,称之为广域网WAN

我们的互联网就是无数个WAN和LAN组成的。

网络编程

实现网络编程的三要素

ip地址,端口,协议

网络协议

规定计算机之间规则的,就像法律一样,但是各个国家不同,所以有各种协议。

TCP/IP协议

我们的Internet网络采用的是TCP/IP协议,包括两部分传输控制协议网络(际)协议

我们来看4层模型的传输层和网络层

 

IP协议

在网际协议中主要是我们的IP协议

IP协议全称为“网际互连协议(Internet Protocol)

由其网络为其分配的ip地址作为计算机的身份,到目前为止,ip地址用4字节也就是32位二进制数表示,为了方便使用,每个字节取用十进制显示称位IPv4,IPv6是为了解决IPv4不足的问题。

TCP和UDP协议

在传输控制协议中主要是我们的TCP协议和UDP协议

TCP协议
使用tcp协议,必须双方先建立连接,它是一种面向连接的可靠通信协议。
传输前,采用"三次握手"方式建立连接,所以是可靠的。
在连接中可进行大数据量的传输。
连接,发送数据都需要确认,且传输完毕后,还需释放已建立的连接,通信效率较低。
tcp协议通信场景
对信息安全要求较高的场景,例如:文件下载,金融等数据通信。

UDP协议

udp是一种无连接,不可靠传输的协议。
将数据源ip,目的地ip和端口封装成数据包,不需要建立连接
每个数据包的大小限制在64kb内
发送不管对方是否准备好,接收方收到也不确认,故是不可靠的
可以广播发送,发送数据结束时无需释放资源,开销小,速度快。
udp协议通信场景
语音通话,视频会话等。

端口

端口:应用程序在设备中唯一的标识。

那么我们接下来说一下端口,在程序设计中是一个假想概念,被规定为0~6553的整数。

普通网络应用程序使用1024以上端口HTTP一般是80

套接字是将端口和应用程序连接的假想装置

 

InetAddress类

 是与IP地址相关的类

package com.yd.tcp;import java.net.InetAddress;
import java.net.UnknownHostException;public class One {public static void main(String[] args) throws UnknownHostException {InetAddress ip=InetAddress.getLocalHost();String localname = ip.getHostName();String localip = ip.getHostAddress();System.out.println("本机名:"+localname);System.out.println("本机地址:"+localip);}
}

ServerSocket类

是与服务器套接字相关的类,主要是等待网络上的"请求",可以指定端口来等待连接的套接字,服务器套接字可以一次一和一个客户端套接字连接,如果多个则,会将其他客户端套接字存入队列中,如果大于最大容量就会拒绝,默认是50。

方法

调用accept()方法会返回一个连接的Socket对象,服务器端的socke对象使用getOutputStream()方法获得输出流,客户端使用getInputStream()方法获得其输入流。

也就是服务器向输出流写入信息时,客户端相应读取输入流。

DatagramPacket类

DatagramSocket类

TCP网络程序设计

客户端发信息给服务器,但是服务器不能向客户端发信息我们称位单向通信。

双方套接字连接成功就可以发送流 来进行信息传输接收。

服务端

package com.yd.tcp;import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.ServerSocket;
import java.net.Socket;public class ServerDEmo {public static void main(String[] args) {try {System.out.println("服务端(元神)启动");//注册端口ServerSocket serverSocket = new ServerSocket(8848);//等待,建立一个socketSocket acceptsocket = serverSocket.accept();//字节输入流InputStream inputStream = acceptsocket.getInputStream();//包装成字符流BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream));//读String msg;while ((msg=bufferedReader.readLine())!=null){System.out.println(acceptsocket.getLocalAddress()+"说"+msg);}}catch (Exception e){e.printStackTrace();}}
}

客户端

package com.yd.tcp;import java.io.OutputStream;
import java.io.PrintStream;
import java.net.Socket;public class Two {public static void main(String[] args) {try{//创建socketSocket socket = new Socket("127.0.0.1", 8848);//输出流,发送信息OutputStream out = socket.getOutputStream();//字节流包装成打印成流PrintStream printStream = new PrintStream(out);//发消息printStream.println("我是TCP客户端");printStream.flush();//关闭socket.close();}catch (Exception e){e.printStackTrace();}}
}

UDP网络程序设计


import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.SocketException;public class ServerDemo {public static void main(String[] args) throws Exception {System.out.println("服务端启动");//创建接收对象DatagramSocket datagramSocket = new DatagramSocket(8888);//创建数据包对象接收数据byte[] buffer=new byte[1024*64];DatagramPacket packet=new DatagramPacket(buffer, buffer.length);//等待接收数据包datagramSocket.receive(packet);//取出数据String s = new String(buffer);System.out.println("收到了"+s);String s1 = packet.getSocketAddress().toString();System.out.println("对方地址"+s1);int port = packet.getPort();System.out.println("对方端口"+port);datagramSocket.close();}
}
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
public class ClientDemo {public static void main(String[] args) throws Exception {//发送数据System.out.println("发送");//创建发送对象,默认端口DatagramSocket socket = new DatagramSocket();byte[] buffer="数据测试10".getBytes();DatagramPacket packet = new DatagramPacket(buffer, buffer.length, InetAddress.getLocalHost(), 8888);//发送数据出去socket.send(packet);socket.close();}
}

这篇关于逸学java【初级菜鸟篇】12.网络通讯编程的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

springboot集成easypoi导出word换行处理过程

《springboot集成easypoi导出word换行处理过程》SpringBoot集成Easypoi导出Word时,换行符n失效显示为空格,解决方法包括生成段落或替换模板中n为回车,同时需确... 目录项目场景问题描述解决方案第一种:生成段落的方式第二种:替换模板的情况,换行符替换成回车总结项目场景s

SpringBoot集成redisson实现延时队列教程

《SpringBoot集成redisson实现延时队列教程》文章介绍了使用Redisson实现延迟队列的完整步骤,包括依赖导入、Redis配置、工具类封装、业务枚举定义、执行器实现、Bean创建、消费... 目录1、先给项目导入Redisson依赖2、配置redis3、创建 RedissonConfig 配

SpringBoot中@Value注入静态变量方式

《SpringBoot中@Value注入静态变量方式》SpringBoot中静态变量无法直接用@Value注入,需通过setter方法,@Value(${})从属性文件获取值,@Value(#{})用... 目录项目场景解决方案注解说明1、@Value("${}")使用示例2、@Value("#{}"php

SpringBoot分段处理List集合多线程批量插入数据方式

《SpringBoot分段处理List集合多线程批量插入数据方式》文章介绍如何处理大数据量List批量插入数据库的优化方案:通过拆分List并分配独立线程处理,结合Spring线程池与异步方法提升效率... 目录项目场景解决方案1.实体类2.Mapper3.spring容器注入线程池bejsan对象4.创建

线上Java OOM问题定位与解决方案超详细解析

《线上JavaOOM问题定位与解决方案超详细解析》OOM是JVM抛出的错误,表示内存分配失败,:本文主要介绍线上JavaOOM问题定位与解决方案的相关资料,文中通过代码介绍的非常详细,需要的朋... 目录一、OOM问题核心认知1.1 OOM定义与技术定位1.2 OOM常见类型及技术特征二、OOM问题定位工具

基于 Cursor 开发 Spring Boot 项目详细攻略

《基于Cursor开发SpringBoot项目详细攻略》Cursor是集成GPT4、Claude3.5等LLM的VSCode类AI编程工具,支持SpringBoot项目开发全流程,涵盖环境配... 目录cursor是什么?基于 Cursor 开发 Spring Boot 项目完整指南1. 环境准备2. 创建

Spring Security简介、使用与最佳实践

《SpringSecurity简介、使用与最佳实践》SpringSecurity是一个能够为基于Spring的企业应用系统提供声明式的安全访问控制解决方案的安全框架,本文给大家介绍SpringSec... 目录一、如何理解 Spring Security?—— 核心思想二、如何在 Java 项目中使用?——

SpringBoot+RustFS 实现文件切片极速上传的实例代码

《SpringBoot+RustFS实现文件切片极速上传的实例代码》本文介绍利用SpringBoot和RustFS构建高性能文件切片上传系统,实现大文件秒传、断点续传和分片上传等功能,具有一定的参考... 目录一、为什么选择 RustFS + SpringBoot?二、环境准备与部署2.1 安装 RustF

springboot中使用okhttp3的小结

《springboot中使用okhttp3的小结》OkHttp3是一个JavaHTTP客户端,可以处理各种请求类型,比如GET、POST、PUT等,并且支持高效的HTTP连接池、请求和响应缓存、以及异... 在 Spring Boot 项目中使用 OkHttp3 进行 HTTP 请求是一个高效且流行的方式。

MySQL的JDBC编程详解

《MySQL的JDBC编程详解》:本文主要介绍MySQL的JDBC编程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录前言一、前置知识1. 引入依赖2. 认识 url二、JDBC 操作流程1. JDBC 的写操作2. JDBC 的读操作总结前言本文介绍了mysq