Java网络编程详解

目录

网络编程

1、概述

2、网络通信的要素

3、IP

4、端口

5、通信协议

6、TCP

文件上传

Tomcat

7、UDP

单方发送单方接受

双方发送接收

8、URL

URL测试

URL下载网络资源


网络编程

1、概述

信件:

计算机网络:

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

网络编程的目的:

传播交流信息,数据交换,通信

想要达到这个效果需要什么:

  1. 如何准确的定位到一台主机。端口:定位到这个计算机上的某个资源

  2. 找到了这个主机,如何传输数据?

2、网络通信的要素

如何实现网络的通信?

通信双方的地址:

  • ip

  • 端口号

规则:网络通信的协议

TCP/IP参考模型:

形象化记忆:

小结:

  1. 网络编程中有两个主要的问题

    • 如何精准的定位到网络上的一台主机或者多台主机上

    • 找到主机之后如何进行通信

  2. 网络编程中的要素

    • IP和端口号 IP

    • 网络通信协议 UDP,TCP

3、IP

IP地址:InetAddress

  • 唯一定位一台计算机

  • 127.0.0.1:本机的localhost

  • ip地址的分类

    • IPV4/IPV6

      • IPV4127.0.0.1 ,四个字节组成,0~255,有42亿(30亿在北美,亚洲4亿,2011年耗尽)

      • IPV6:128位,8个无符号整数

         2001:0bb2:aaaa:0012:1122:1acd:0000:1213//格式
    • 公网(互联网)-私网(局域网)

      • ABCD类地址

      • 192.168.xx.xx 专门给组织内部使用!

  • 域名:记忆IP问题

    • IP:如www.vip.com

InetAddress类:

 package com.study.lesson01;​import java.net.Inet4Address;import java.net.InetAddress;import java.net.UnknownHostException;​public class TestInetAddress {​public static void main(String[] args) {try {//查询本机地址InetAddress inetAddress1 = InetAddress.getByName("127.0.0.1");System.out.println(inetAddress1);InetAddress inetAddress3 = InetAddress.getByName("localhost");System.out.println(inetAddress3);InetAddress inetAddress4 = InetAddress.getLocalHost();System.out.println(inetAddress4);​//查询网站IP地址InetAddress inetAddress2 = InetAddress.getByName("www.baidu.com");System.out.println(inetAddress2);​//常用方法//System.out.println(inetAddress2.getAddress());System.out.println(inetAddress2.getCanonicalHostName());//规范的名字System.out.println(inetAddress2.getHostAddress());//ipSystem.out.println(inetAddress2.getHostName());//域名,或者自己电脑的名字​} catch (UnknownHostException e) {e.printStackTrace();}}}

4、端口

端口表示计算机上一个程序的进程:

  • 不同的进程有不同端口号~用来区分软件

  • 被规定0~65536

  • TCP,UDP:65535*2 单个协议下,端口号不能冲突!

  • 端口分类

    • 公有端口 0~1023

      • HTTP :80

      • HTTPS :443

      • FTP :21

      • Telent :23

    • 程序注册端口:1024~49151,分配用户或者程序

      • Tomcat:8080

      • MySQL :3306

      • Oracle:1521

    • 动态、私有:49152~65535

       netstat -ano #查看所有的端口netstat -ano|findstr "5900" #查看指定窗口tasklist|findstr "8696" #查看指定端口的进程Ctrl+shift+ESC #任务管理器快捷键
    •  package com.study.lesson01;​import java.net.InetSocketAddress;​public class TestInetSocketAddress {​public static void main(String[] args) {InetSocketAddress socketAddress = new InetSocketAddress("127.0.0.1", 8080);InetSocketAddress socketAddress2 = new InetSocketAddress("localhost", 8080);System.out.println(socketAddress);System.out.println(socketAddress2);​System.out.println(socketAddress.getAddress());System.out.println(socketAddress.getHostName());//地址System.out.println(socketAddress.getPort());//端口​}}

5、通信协议

协议:约定,就好比我们现在说的普通话~

网络通信协议:速率,传输码率,代码结构,传输控制...

TCP/IP协议簇:实际上是一组协议

重要:

  • TCP:用户传输协议

  • UDP:用户数据报协议

出名的协议:

  • TCP:用户传输协议

  • IP:网络互连协议

TCP、UDP 对比:

TCP:打电话

  • 连接稳定

  • 三次握手 四次挥手

     最少需要三次,保证稳定连接A:你瞅啥?B:瞅你咋的?A:干一场!​A:我要走了~B:你真的要走了吗?B:你真的真的要走了吗?A:我真的要走了~

    三次握手、四次挥手

  • 客户端、服务端

  • 传输完成、释放连接

  • 效率低

UDP:发短信

  • 不连接、不稳定

  • 客户端、服务端:没有明确的界限

  • 不管是否准备好,都可以发送

  • DDOS:洪水攻击!(饱和攻击)

6、TCP

客户端

  1. 连接服务器Socket-->socket = new Socket(serverIp,port);

  2. 发送消息-->os = socket.getOutputStream(); os.write("欢迎来到网络编程".getBytes());

 package com.study.lesson02;​import java.io.IOException;import java.io.OutputStream;import java.net.InetAddress;import java.net.Socket;import java.net.UnknownHostException;import java.nio.charset.StandardCharsets;​//客户端public class TcpClientDemo01 {public static void main(String[] args) {​Socket socket = null;OutputStream os = null;try {//1.要知道服务器的地址,端口号InetAddress serverIp = InetAddress.getByName("127.0.0.1");int port = 9999;//2.创建一个socket连接socket = new Socket(serverIp,port);//3.发送消息IO流os = socket.getOutputStream();os.write("欢迎来到网络编程".getBytes());​} catch (Exception e) {e.printStackTrace();​}finally {if(os!=null){try {os.close();} catch (IOException e) {e.printStackTrace();}}if(socket!=null){try {socket.close();} catch (IOException e) {e.printStackTrace();}}}}}

服务器

  1. 建立服务的端口ServiceSocket-->serverSocket = new ServerSocket(9999);

  2. 等待用户的连接 accept-->socket = serverSocket.accept();

  3. 接受用户的消息-->is = socket.getInputStream();

  4. 管道流存储输出-->baos = new ByteArrayOutputStream(); byte[] buffer = new byte[1024]; int len; while((len=is.read(buffer))!=-1){ baos.write(buffer,0,len); } System.out.println(baos.toString());

 package com.study.lesson02;​import java.io.ByteArrayOutputStream;import java.io.IOException;import java.io.InputStream;import java.net.ServerSocket;import java.net.Socket;​//服务端public class TcpServeDemo01 {public static void main(String[] args) {​ServerSocket serverSocket = null;Socket socket =null;InputStream is = null;ByteArrayOutputStream baos = null;​try {//1.我得有一个地址serverSocket = new ServerSocket(9999);​while (true){//2.等待客户端连接过来socket = serverSocket.accept();//3。读取客户端消息is = socket.getInputStream();​//管道流baos = new ByteArrayOutputStream();byte[] buffer = new byte[1024];int len;while((len=is.read(buffer))!=-1){baos.write(buffer,0,len);}System.out.println(baos.toString());}​/*byte[] buffer = new byte[1024];int len;while((len=is.read(buffer))!=-1){String msg = new String(buffer,0,len);System.out.println(msg);}* */​​} catch (IOException e) {e.printStackTrace();}finally {//关闭资源if(baos!=null){try {baos.close();} catch (IOException e) {e.printStackTrace();}}if(is!=null){try {is.close();} catch (IOException e) {e.printStackTrace();}}if(socket!=null){try {socket.close();} catch (IOException e) {e.printStackTrace();}}if(serverSocket!=null){try {serverSocket.close();} catch (IOException e) {e.printStackTrace();}}​}}}

文件上传

服务器

 package com.study.lesson02;​import java.io.*;import java.net.ServerSocket;import java.net.Socket;​public class TcpServeDemo02 {public static void main(String[] args) throws Exception {//1.创建服务ServerSocket serverSocket = new ServerSocket(9000);//2.监听客户端的连接Socket socket = serverSocket.accept();//阻塞式监听,会一直等待客户端的连接//3.获取输入流InputStream is = socket.getInputStream();​//4.文件输出FileOutputStream fos = new FileOutputStream(new File("receive.jpg"));byte[] buffer = new byte[1024];int len;while((len=is.read(buffer))!=-1){fos.write(buffer,0,len);}//通知客户端我接受完毕了OutputStream os = socket.getOutputStream();os.write("我接收完毕了~可以断开~".getBytes());​//关闭资源fos.close();is.close();socket.close();serverSocket.close();}}

客户端

 package com.study.lesson02;​import java.io.*;import java.net.InetAddress;import java.net.Socket;import java.net.UnknownHostException;​public class TcpClientDemo02 {public static void main(String[] args) throws Exception {​//1.创建一个socket连接Socket socket = new Socket(InetAddress.getByName("127.0.0.1"), 9000);//2.创建一个输出流OutputStream os = socket.getOutputStream();​//3.读取文件FileInputStream fis = new FileInputStream(new File("Zombatar_1.jpg"));//4.写出文件byte[] buffer = new byte[1024];int len;while((len=fis.read(buffer))!=-1){os.write(buffer,0,len);}//通知服务器,我已经结束了socket.shutdownOutput();//我已经传输完毕~​//确定服务器接收完毕,才能够断开连接InputStream inputStream = socket.getInputStream();//String byte[]ByteArrayOutputStream baos = new ByteArrayOutputStream();​byte[] buffer2 = new byte[1025];int len2;while((len2=inputStream.read(buffer2))!=-1){baos.write(buffer2,0,len2);}System.out.println(baos.toString());​//5.关闭资源fis.close();os.close();socket.close();}}

Tomcat

服务端

  • 自定义-->S

  • Tomcat服务器-->S

客户端

  • 自定义-->C

  • 浏览器-->B

7、UDP

发短信:不用连接。需要知道对方的地址!


单方发送单方接受

发送消息

 package com.study.lesson03;​import java.net.DatagramPacket;import java.net.DatagramSocket;import java.net.InetAddress;import java.net.SocketException;​public class UdpClientDemo01 {public static void main(String[] args) throws Exception {//1.建立一个SocketDatagramSocket socket = new DatagramSocket();​//2.建个包String msg = "你好啊!服务器!";InetAddress localhost = InetAddress.getByName("localhost");int port = 9090;​//数据,数据的长度起始,,发送给谁DatagramPacket packet = new DatagramPacket(msg.getBytes(), 0, msg.getBytes().length, localhost, port);​//3.发送包socket.send(packet);​//4.关闭流socket.close();​}}

接收消息、

 package com.study.lesson03;​import java.net.DatagramPacket;import java.net.DatagramSocket;import java.net.SocketException;​public class UdpServeDemo01 {public static void main(String[] args) throws Exception {//开放端口DatagramSocket socket = new DatagramSocket(9090);//接收数据包byte[] buffer = new byte[1024];DatagramPacket packet = new DatagramPacket(buffer, 0, buffer.length);​socket.receive(packet);//阻塞接受System.out.println(packet.getAddress().getHostAddress());System.out.println(new String(packet.getData(),0,packet.getLength()));​​//关闭连接socket.close();​}}

循环发送

 package com.study.ChatDemo01;​import java.io.BufferedReader;import java.io.InputStreamReader;import java.net.DatagramPacket;import java.net.DatagramSocket;import java.net.InetSocketAddress;import java.net.SocketException;​public class UdpSenderDemo01 {public static void main(String[] args) throws Exception {​DatagramSocket socket = new DatagramSocket(8888);​//准备数据,控制台读取System.inBufferedReader reader = new BufferedReader(new InputStreamReader(System.in));​while(true){String data = reader.readLine();byte[] datas = data.getBytes();DatagramPacket packet = new DatagramPacket(datas, 0, datas.length, new InetSocketAddress("localhost", 6666));​socket.send(packet);if (data.equals("bye")){break;}}socket.close();}}

循环接收

 package com.study.ChatDemo01;​import java.net.DatagramPacket;import java.net.DatagramSocket;import java.net.SocketException;import java.nio.charset.StandardCharsets;​public class UdpReceiveDemo01 {public static void main(String[] args) throws Exception {DatagramSocket socket = new DatagramSocket(6666);​while(true){​//准备接受的包裹byte[] container = new byte[1024];DatagramPacket packet = new DatagramPacket(container, 0, container.length);socket.receive(packet);//阻塞式接受包裹​//断开连接 byebyte[] data = packet.getData();String receiveData = new String(data,0, data.length);​System.out.println(receiveData);​if (receiveData.equals("bye")){break;}}socket.close();}}
双方发送接收

在线咨询:两个人都可以是发送方,也可以是接收方!

发送端:

 package com.study.ChatDemo01;​import java.io.BufferedReader;import java.io.IOException;import java.io.InputStreamReader;import java.net.DatagramPacket;import java.net.DatagramSocket;import java.net.InetSocketAddress;​public class TalkSend implements Runnable{DatagramSocket socket = null;BufferedReader reader = null;​private int fromPort;private String toIp;private int toPort;​public TalkSend(int fromPort, String toIp, int toPort) {this.fromPort = fromPort;this.toIp = toIp;this.toPort = toPort;​try {socket = new DatagramSocket(fromPort);reader = new BufferedReader(new InputStreamReader(System.in));} catch (Exception e) {e.printStackTrace();}}​@Overridepublic void run() {​while(true){try {String data = reader.readLine();byte[] datas = data.getBytes();DatagramPacket packet = new DatagramPacket(datas, 0, datas.length, new InetSocketAddress(this.toIp, this.toPort));​socket.send(packet);if (data.equals("bye")){break;}} catch (IOException e) {e.printStackTrace();}}​​socket.close();}}

接收端

 package com.study.ChatDemo01;​import java.io.IOException;import java.net.DatagramPacket;import java.net.DatagramSocket;import java.net.SocketException;​public class TalkReceive implements Runnable{DatagramSocket socket = null;​private int port;private String msgFrom;​public TalkReceive(int port,String msgFrom) {this.port = port;this.msgFrom = msgFrom;try {socket = new DatagramSocket(port);} catch (SocketException e) {e.printStackTrace();}}​@Overridepublic void run() {while(true){​try {//准备接受的包裹byte[] container = new byte[1024];DatagramPacket packet = new DatagramPacket(container, 0, container.length);socket.receive(packet);//阻塞式接受包裹​//断开连接 byebyte[] data = packet.getData();String receiveData = new String(data,0, data.length);​System.out.println(msgFrom +":"+receiveData);​if (receiveData.equals("bye")){break;}} catch (IOException e) {e.printStackTrace();}}socket.close();}}​

学生端:

 package com.study.ChatDemo01;​public class TalkStudent {public static void main(String[] args) {//开启两个线程new Thread(new TalkSend(7777,"localhost",9999)).start();new Thread(new TalkReceive(8888,"老师")).start();}}

老师端:

 package com.study.ChatDemo01;​public class TalkTeacher {public static void main(String[] args) {new Thread(new TalkSend(5555,"localhost",8888)).start();new Thread(new TalkReceive(9999,"学生")).start();}}

8、URL

统一资源定位符:定位互联网上某一个资源~


 协议://ip地址:端口/项目名/资源
URL测试
 package com.study.lesson04;​import java.net.MalformedURLException;import java.net.URL;​public class URLDemo01 {public static void main(String[] args) throws MalformedURLException {URL url = new URL("http://localhost:8080/helloworld/index.jsp?username=kuangshen&password=123");System.out.println(url.getProtocol());//协议System.out.println(url.getHost());//主机ipSystem.out.println(url.getPort());//端口System.out.println(url.getPath());//文件System.out.println(url.getFile());//全路径System.out.println(url.getQuery());//参数}}
URL下载网络资源
 package com.study.lesson04;​import java.io.FileOutputStream;import java.io.InputStream;import java.net.HttpURLConnection;import java.net.MalformedURLException;import java.net.URL;import java.net.URLConnection;​public class URLDown {public static void main(String[] args) throws Exception {//1.下载地址URL url = new URL("https://m701.music.126.net/20240310184733/9ca3dc22ed39dd04044ede9b4ce9f672/jdyyaac/obj/w5rDlsOJwrLDjj7CmsOj/32103516877/3532/074b/bdea/4f512dfb86fec567b51062cc17695e22.m4a");​//2.连接到这个资源 HTTPHttpURLConnection urlConnection = (HttpURLConnection) url.openConnection();​InputStream inputStream = urlConnection.getInputStream();​FileOutputStream fos = new FileOutputStream("a.m4a");​byte[] buffer = new byte[1024];int len;while((len=inputStream.read(buffer))!=-1){fos.write(buffer,0,len);//写出这个数据}fos.close();inputStream.close();urlConnection.disconnect();}}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/737457.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

WPF —— TextBlock、LineBreak RadioButton控件详解

一:TextBlock 1&#xff1a;TextBlock 简介 <LineBreak/> 换行 显示文本 标签内容和content属性共存 2、TextBlock 常用的属性 Foreground&#xff1a;TextBlock的文本内容的颜色。 Background&#xff1a;背景&#xff0c;获取或设置要用于填充内容区域背景的 Brush…

冒泡排序的理解与实现【C语言、C++、java】

冒泡排序介绍 冒泡排序(Bubble Sort)&#xff0c;又被称为气泡排序或泡沫排序。 它是一种较简单的排序算法。它会遍历若干次要排序的数列&#xff0c;每次遍历时&#xff0c;它都会从前往后依次的比较相邻两个数的大小&#xff1b;如果前者比后者大&#xff0c;则交换它们的位…

一体机电脑辐射超标整改

电脑一体机是目前台式机和笔记本电脑之间的一个新型的市场产物&#xff0c;它将主机部分、显示器部分整合到一起的新形态电脑&#xff0c;该产品的创新在于内部元件的高度集成。随着无线技术的发展&#xff0c;电脑一体机的键盘、鼠标与显示器可实现无线链接&#xff0c;机器只…

美国站群服务器使用技巧与注意事项

美国站群服务器使用技巧与注意事项有哪些?RAKsmart小编为您整理发布美国站群服务器使用技巧与注意事项&#xff0c;希望对您有帮助。 美国站群服务器的使用技巧主要包括远程管理、灵活配置和备份还原&#xff0c;具体如下&#xff1a; 1. **远程管理**&#xff1a;用户可以通过…

计算机网络-第5章 运输层(2)

5.6 TCP可靠传输实现 以字节为单位的滑动窗口。 发送窗口已满&#xff0c;停止发送。 发送和接收的数据都来自缓存。 超时重传时间RTO选择&#xff1a;自适应算法&#xff0c; 选择确认SACK&#xff1a;只传送缺少的数据。大多数实现还是重传所有未被确认的数据块。 5.7 TCP的…

LLM 推理优化

LLM 推理服务重点关注两个指标&#xff1a;吞吐量和时延&#xff1a; 吞吐量&#xff1a;主要从系统的角度来看&#xff0c;即系统在单位时间内能处理的 tokens 数量。计算方法为系统处理完成的 tokens个数除以对应耗时&#xff0c;其中 tokens 个数一般指输入序列和输出序列长…

掌握Mongodb,看完这篇文章就够了

目录 1.概念 2.操作 2.1数据库操作 2.2集合操作 2.3数据操作 3.查询 4.常用技术 5.python与MongoDB 1.概念 MongoDB是一种非关系型数据库&#xff08;NoSQL&#xff09;&#xff0c;它以灵活的文档存储格式&#xff08;BSON&#xff09;和强大的查询能…

MinGW-w64的下载与安装

文章目录 1 下载2 安装3 配置环境变量4 验证 1 下载 官网地址&#xff1a;https://www.mingw-w64.org/github地址&#xff1a;https://github.com/niXman/mingw-builds-binaries/releases windows下载 跳转github下载 版本号选择&#xff1a;13.2.0是GCC的版本号&#xff1b…

如何避免MYSQL主从延迟带来的读写问题?

在MYSQL 部署架构选型上&#xff0c;许多公司都会用到主从读写分离的架构&#xff0c;如下是一个一主一从的架构&#xff0c;主库master负责写入&#xff0c;从库slave进行读取。 但是既然是读写分离&#xff0c;必然会面临这样一个问题&#xff0c;当在主库上进行更新后&#…

QML | 在QML中导入JavaScript资源、导入JavaScript资源、包含一个JavaScript 资源

01 在QML中导入JavaScript资源 JavaScript资源可以被QML文档和其他JavaScript通过相对或者绝对路径进行导入。如果使用相对路径,位置解析需要相对于包含import语句的QML文档或JavaScript资源的位置。如果JavaScript需要从网络资源中进行获取,组件的status属性会被设置为Loadi…

PyCM:Python中的混淆矩阵库

PyCM&#xff1a;Python中的混淆矩阵库 在机器学习和数据科学领域&#xff0c;评估模型的性能是至关重要的。混淆矩阵是一种常用的评估工具&#xff0c;用于可视化和量化分类模型的预测结果。PyCM是一个开源的Python库&#xff0c;提供了丰富的功能来计算和分析混淆矩阵。本文将…

【C++】STL(二) string容器

一、string基本概念 1、本质 string是C风格的字符串&#xff0c;而string本质上是一个类 string和char * 区别&#xff1a; char * 是一个指针 string是一个类&#xff0c;类内部封装了char*&#xff0c;管理这个字符串&#xff0c;是一个char*型的容器。 2、特点 1、stri…

R语言绘制桑基图教程

原文链接&#xff1a;R语言绘制桑基图教程 写在前面 在昨天3月10日&#xff0c;我们在知乎、B站等分享了功能富集桑基气泡图的绘制教程。相关链接&#xff1a;NC|高颜值功能富集桑基气泡图&#xff0c;桑基气泡组合图。 确实&#xff0c;目前这个图在文章中出现的频率相对比较…

Wilson威尔逊平滑

1、威尔逊平滑引入的动机 在曝光很少的情况下&#xff0c;计算出的CTR并不真实可靠&#xff0c;而样本数越大&#xff0c;CTR的比例才越准确&#xff0c;更能反应真实情况。 为了衡量样本数对于CTR信区间的影响&#xff0c;我们引入"威尔逊&#xff08;Wilson&#xff0…

地球系统模式(CESM)

目前通用地球系统模式&#xff08;Community Earth System Model&#xff0c;CESM&#xff09;在研究地球的过去、现在和未来的气候状况中具有越来越普遍的应用。CESM由美国NCAR于2010年07月推出以来&#xff0c;一直受到气候学界的密切关注。近年升级的CESM2.0在大气、陆地、海…

STM32CubeMX 配置 STM32F103 工程:通过DAC输出正弦波

说明&#xff1a;STM32CubeMX 配置 STM32F103 工程&#xff0c;通过DAC输出正弦波&#xff0c;参考代码可自动计算频率&#xff0c;自动计算正弦数据。 先参考这篇文章配置时钟、工程输出的设置&#xff1a; STM32CubeMX 配置 STM32F103 工程&#xff1a;通过DAC生成三角波、…

关于遗传力常见的误解

大家好&#xff0c;我是邓飞&#xff0c;今天看了一篇非常好的文章&#xff0c;介绍了遗传力相关概念和计算方法&#xff0c;里面提到了常见的误解&#xff0c;这里汇总一下。 文献链接&#xff1a;https://excellenceinbreeding.org/sites/default/files/manual/EiB-M2_Herit…

STM32CubeMX学习笔记20——SD卡FATFS文件系统

1. FATFS文件系统简介 文件系统是操作系统用于明确存储设备或分区上的文件的方法和数据结构&#xff08;即在存储设备上组织文件的方法&#xff09;。操作系统中负责管理和存储文件信息的软件机构称为文件管理系统&#xff0c;简称文件系统&#xff1b;不带文件系统的SD卡仅能…

seo js转码工具

js转码工具作用 用于把js加密 如果不想让别人看到自己的js 代码就可以使用这个方法 js工具网址 https://tool.chinaz.com/js.aspx 效果

【大厂AI课学习笔记NO.74】人工智能产业技术架构

包括基础层、技术层和应用层。 人工智能的产业技术架构是一个多层次、多维度的复杂系统&#xff0c;它涵盖了从基础硬件和软件设施到高级算法和应用技术的全过程。这个架构通常可以分为三个主要层次&#xff1a;基础层、技术层和应用层。下面我将详细论述这三个层次及其细分内…