网络编程基础

目录

【1】网络编程:

​【2】通信两个重要的要素:IP+PORT 

 【3】设备之间进行传输的时候,必须遵照一定的规则 ---》通信协议:

【4】TCP协议:可靠的

建立连接:  三次握手 ​编辑释放连接:四次挥手 

​编辑【5】UDP协议:不可靠的

 【6】InetAddress,InetSocketAddress

【1】InetAddress   ---》 封装了IP 

​【2】InetSocketAddress  ---》封装了IP,端口号

 【7】网络通信原理之--套接字

【8】基于TCP的网络编程 

功能分解1:单向通信(客户单发送信息到服务器)

功能分解2:双向通信

功能分解3:对象流传送

功能分解4:多线程接收用户请求

【9】基于UDP的网络编程 

发送方:

接收方


【1】网络编程:


把分布在不同地理区域的计算机与专门的外部设备用通信线路互连成一个规模大、功能强的网络系统,从而使众多的计算机可以方便地互相传递信息、共享硬件、软件、数据信息等资源。
设备之间在网络中进行数据的传输,发送/接收数据。

【2】通信两个重要的要素:IP+PORT 

域名:www.baidu.com      ------>DNS服务器解析 ----> IP地址
          www.mashibing.com
          www.sina.com
          www.wanda.com
          www.bbbb.com 

 【3】设备之间进行传输的时候,必须遵照一定的规则 ---》通信协议:

 开发一般只在应用层,离java开发最近的底层协议就是传输层,传输层一般有两个协议,TCP 协议和UDP协议

【4】TCP协议:可靠的

建立连接:  三次握手 
释放连接:四次挥手 

【5】UDP协议:不可靠的

 【6】InetAddress,InetSocketAddress

因为Java是面向对象的语言,喜欢操作对象来处理事情。所以,也定义了InetAddress 类来封装IP,

定义了InetSocketAddress 来对 IP+端口号 做封装

【1】InetAddress   ---》 封装了IP 

public class Test01 {//这是一个main方法,是程序的入口:public static void main(String[] args) throws UnknownHostException {//封装IP://InetAddress ia = new InetAddress();不能直接创建对象,因为InetAddress()被default修饰了。// 对外提供的创建方法InetAddress ia = InetAddress.getByName("192.168.199.217");System.out.println(ia);InetAddress ia2 = InetAddress.getByName("localhost");//localhost指代的是本机的ip地址System.out.println(ia2);InetAddress ia3 = InetAddress.getByName("127.0.0.1");//127.0.0.1指代的是本机的ip地址System.out.println(ia3);InetAddress ia4 = InetAddress.getByName("LAPTOP-CRIVSRRU");//封装计算机名System.out.println(ia4);InetAddress ia5 = InetAddress.getByName("www.mashibing.com");//封装域名System.out.println(ia5);System.out.println(ia5.getHostName());//获取域名System.out.println(ia5.getHostAddress());//获取ip地址}
}


【2】InetSocketAddress  ---》封装了IP,端口号

public class Test02 {//这是一个main方法,是程序的入口:public static void main(String[] args) {InetSocketAddress isa = new InetSocketAddress("192.168.199.217",8080);System.out.println(isa);System.out.println(isa.getHostName());System.out.println(isa.getPort());InetAddress ia = isa.getAddress();System.out.println(ia.getHostName());System.out.println(ia.getHostAddress());}
}

 【7】网络通信原理之--套接字

【8】基于TCP的网络编程 

功能分解1:单向通信(客户单发送信息到服务器)

发送方:

public class TestClient {//客户端//这是一个main方法,是程序的入口:public static void main(String[] args) throws IOException {//1.创建套接字:接受消息方 的ip和端口号:Socket s = new Socket("192.168.199.217",8888);//2.对于程序员来说,向外发送数据 感受 --》利用输出流:OutputStream os = s.getOutputStream();DataOutputStream dos = new DataOutputStream(os);//利用这个OutputStream就可以向外发送数据了,但是没有直接发送String的方法//所以我们又在OutputStream外面套了一个处理流:DataOutputStreamdos.writeUTF("你好");//3.关闭流  +  关闭网络资源:dos.close();os.close();s.close();}
}

接收方:

public class TestServer {//服务器//这是一个main方法,是程序的入口:public static void main(String[] args) throws IOException {//1.创建套接字: 指定服务器的端口号ServerSocket ss = new ServerSocket(8888);// 服务器知道自己IP,不用指定//2.等着客户端发来的信息:Socket s = ss.accept();//阻塞方法:等待接收客户端的数据,什么时候接收到数据,什么时候程序继续向下执行。//accept()返回值为一个Socket,这个Socket其实就是客户端的Socket//接到这个Socket以后,客户端和服务器才真正产生了连接,才真正可以通信了//3.感受到的操作流:InputStream is = s.getInputStream();DataInputStream dis = new DataInputStream(is);//4.读取客户端发来的数据:String str = dis.readUTF();System.out.println("客户端发来的数据为:"+str);//5.关闭流+关闭网络资源:dis.close();is.close();s.close();ss.close();}
}

功能分解2:双向通信

服务器端:

package com.msb.test02;import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;/*** @author : msb-zhaoss*/
public class TestServer {//服务器//这是一个main方法,是程序的入口:public static void main(String[] args) throws IOException {//1.创建套接字: 指定服务器的端口号ServerSocket ss = new ServerSocket(8888);//2.等着客户端发来的信息:Socket s = ss.accept();//阻塞方法:等待接收客户端的数据,什么时候接收到数据,什么时候程序继续向下执行。//accept()返回值为一个Socket,这个Socket其实就是客户端的Socket//接到这个Socket以后,客户端和服务器才真正产生了连接,才真正可以通信了//3.感受到的操作流:InputStream is = s.getInputStream();DataInputStream dis = new DataInputStream(is);//4.读取客户端发来的数据:String str = dis.readUTF();System.out.println("客户端发来的数据为:"+str);//向客户端输出一句话:---》操作流---》输出流OutputStream os = s.getOutputStream();DataOutputStream dos = new DataOutputStream(os);dos.writeUTF("你好,我是服务器端,我接受到你的请求了");//5.关闭流+关闭网络资源:dos.close();os.close();dis.close();is.close();s.close();ss.close();}
}

客户端:

package com.msb.test02;import java.io.*;
import java.net.Socket;/*** @author : msb-zhaoss*/
public class TestClient {//客户端//这是一个main方法,是程序的入口:public static void main(String[] args) throws IOException {//1.创建套接字:指定服务器的ip和端口号:Socket s = new Socket("192.168.199.217",8888);//2.对于程序员来说,向外发送数据 感受 --》利用输出流:OutputStream os = s.getOutputStream();DataOutputStream dos = new DataOutputStream(os);//利用这个OutputStream就可以向外发送数据了,但是没有直接发送String的方法//所以我们又在OutputStream外面套了一个处理流:DataOutputStreamdos.writeUTF("你好");//接收服务器端的回话--》利用输入流:InputStream is = s.getInputStream();DataInputStream dis = new DataInputStream(is);String str = dis.readUTF();System.out.println("服务器端对我说:"+str);//3.关闭流  +  关闭网络资源:dis.close();is.close();dos.close();os.close();s.close();}
}

功能分解3:对象流传送

用户名,密码封装的User类:

package com.msb.test03;import java.io.Serializable;/*** @author : msb-zhaoss*/
public class User implements Serializable {private static final long serialVersionUID = 9050691344308365540L;private String name;private String pwd;public String getName() {return name;}public void setName(String name) {this.name = name;}public String getPwd() {return pwd;}public void setPwd(String pwd) {this.pwd = pwd;}public User(String name, String pwd) {this.name = name;this.pwd = pwd;}
}

客户端:

package com.msb.test03;import java.io.*;
import java.net.Socket;
import java.util.Scanner;/*** @author : msb-zhaoss*/
public class TestClient {//客户端//这是一个main方法,是程序的入口:public static void main(String[] args) throws IOException {//1.创建套接字:指定服务器的ip和端口号:Socket s = new Socket("192.168.199.217",8888);//录入用户的账号和密码:Scanner sc = new Scanner(System.in);System.out.println("请录入您的账号:");String name = sc.next();System.out.println("请录入您的密码:");String pwd = sc.next();//将账号和密码封装为一个User的对象:User user = new User(name,pwd);//2.对于程序员来说,向外发送数据 感受 --》利用输出流:OutputStream os = s.getOutputStream();ObjectOutputStream oos = new ObjectOutputStream(os);oos.writeObject(user);//接收服务器端的回话--》利用输入流:InputStream is = s.getInputStream();DataInputStream dis = new DataInputStream(is);boolean b = dis.readBoolean();if(b){System.out.println("恭喜,登录成功");}else{System.out.println("对不起,登录失败");}//3.关闭流  +  关闭网络资源:dis.close();is.close();oos.close();os.close();s.close();}
}

服务端:

package com.msb.test03;import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;/*** @author : msb-zhaoss*/
public class TestServer {//服务器//这是一个main方法,是程序的入口:public static void main(String[] args) throws IOException, ClassNotFoundException {//1.创建套接字: 指定服务器的端口号ServerSocket ss = new ServerSocket(8888);//2.等着客户端发来的信息:Socket s = ss.accept();//阻塞方法:等待接收客户端的数据,什么时候接收到数据,什么时候程序继续向下执行。//accept()返回值为一个Socket,这个Socket其实就是客户端的Socket//接到这个Socket以后,客户端和服务器才真正产生了连接,才真正可以通信了//3.感受到的操作流:InputStream is = s.getInputStream();ObjectInputStream ois = new ObjectInputStream(is);//4.读取客户端发来的数据:User user = (User)(ois.readObject());//对对象进行验证:boolean flag = false;if(user.getName().equals("娜娜")&&user.getPwd().equals("123123")){flag = true;}//向客户端输出结果:---》操作流---》输出流OutputStream os = s.getOutputStream();DataOutputStream dos = new DataOutputStream(os);dos.writeBoolean(flag);//5.关闭流+关闭网络资源:dos.close();os.close();ois.close();is.close();s.close();ss.close();}
}

功能分解4:多线程接收用户请求

遗留问题:服务器针对一个请求服务,之后服务器就关闭了(程序自然结束了)

现在需要解决:服务器必须一直在监听 ,一直开着,等待客户端的请求

在当前代码中,客户端不用动了

更改服务器代码:

package com.msb.test03;import java.io.*;
import java.net.Socket;/*** @author : msb-zhaoss*/
public class ServerThread extends Thread {//线程:专门处理客户端的请求InputStream is = null;ObjectInputStream ois = null;OutputStream os = null;DataOutputStream dos = null;Socket s = null;public ServerThread(Socket s){this.s = s;}@Overridepublic void run() {try{//2.等着客户端发来的信息:is = s.getInputStream();ois = new ObjectInputStream(is);//4.读取客户端发来的数据:User user = (User)(ois.readObject());//对对象进行验证:boolean flag = false;if(user.getName().equals("娜娜")&&user.getPwd().equals("123123")){flag = true;}//向客户端输出结果:---》操作流---》输出流os = s.getOutputStream();dos = new DataOutputStream(os);dos.writeBoolean(flag);}catch (IOException | ClassNotFoundException e) {e.printStackTrace();}finally {try {if(dos!=null){dos.close();}} catch (IOException e) {e.printStackTrace();}try {if(os!=null){os.close();}} catch (IOException e) {e.printStackTrace();}try {if(ois!=null){ois.close();}} catch (IOException e) {e.printStackTrace();}try {if(is!=null){is.close();}} catch (IOException e) {e.printStackTrace();}}}
}

package com.msb.test03;import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;/*** @author : msb-zhaoss*/
public class TestServer {//服务器//这是一个main方法,是程序的入口:public static void main(String[] args) {System.out.println("服务器启动了");//1.创建套接字: 指定服务器的端口号ServerSocket ss = null;Socket s = null;int count = 0;//定义一个计数器,用来计数  客户端的请求try {ss = new ServerSocket(8888);while(true){//加入死循环,服务器一直监听客户端是否发送数据s = ss.accept();//阻塞方法:等待接收客户端的数据,什么时候接收到数据,什么时候程序继续向下执行。//每次过来的客户端的请求 靠 线程处理:new ServerThread(s).start();count++;//输入请求的客户端的信息:System.out.println("当前是第"+count+"个用户访问我们的服务器,对应的用户是:"+s.getInetAddress());}} catch (IOException  e) {e.printStackTrace();}}
}

【9】基于UDP的网络编程 

TCP:

客户端:Socket                                      

程序感受到的 使用流  :输出流

服务器端:  ServerSocket --->Socket     程序感受到的 使用流  :输入流

(客户端和服务器端地位不平等。)

UDP:

发送方:DatagramSocket   发送:数据包  DatagramPacket

接收方:DatagramSocket   接收:数据包  DatagramPacket

(发送方和接收方的地址是平等的。)

UDP案例:  完成网站的咨询聊天

发送方:

package com.msb.test04;import java.io.IOException;
import java.net.*;
import java.util.Scanner;/*** @author : msb-zhaoss*/
public class TestSend {//发送方://这是一个main方法,是程序的入口:public static void main(String[] args)  {System.out.println("学生上线。。。");//1.准备套接字: 指定发送方的端口号DatagramSocket ds = null;try {ds = new DatagramSocket(8888);while(true){//2.准备数据包Scanner sc = new Scanner(System.in);System.out.print("学生:");String str = sc.next();byte[] bytes = str.getBytes();/*需要四个参数:1.指的是传送数据转为Z字节数组2.字节数组的长度3.封装接收方的ip4.指定接收方的端口号*/DatagramPacket dp = new DatagramPacket(bytes,bytes.length, InetAddress.getByName("localhost"),9999);//发送:ds.send(dp);if(str.equals("byebye")){System.out.println("学生下线。。");break;}//接收老师发送回来的信息:byte[] b = new byte[1024];DatagramPacket dp2 = new DatagramPacket(b,b.length);ds.receive(dp2);//接收完以后 dp2里面就填充好内容了//取出数据:byte[] data = dp2.getData();String s = new String(data,0,dp2.getLength());//dp.getLength()数组包中的有效长度System.out.println("老师对我说:"+s);}} catch (SocketException e) {e.printStackTrace();} catch (UnknownHostException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();} finally {//关闭资源ds.close();}}
}

接收方

package com.msb.test04;import java.io.IOException;
import java.net.*;
import java.util.Scanner;/*** @author : msb-zhaoss*/
public class TestReceive {//接收方//这是一个main方法,是程序的入口:public static void main(String[] args){System.out.println("老师上线了。。");//1.创建套接字:指定接收方的端口DatagramSocket ds = null;try {ds = new DatagramSocket(9999);while(true){//2.有一个空的数据包,打算用来接收  对方传过来的数据包:byte[] b = new byte[1024];DatagramPacket dp = new DatagramPacket(b,b.length);//3.接收对方的数据包,然后放入我们的dp数据包中填充ds.receive(dp);//接收完以后 dp里面就填充好内容了//4.取出数据:byte[] data = dp.getData();String s = new String(data,0,dp.getLength());//dp.getLength()数组包中的有效长度System.out.println("学生对我说:"+s);if(s.equals("byebye")){System.out.println("学生已经下线了,老师也下线。。。");break;}//老师进行回复:Scanner sc = new Scanner(System.in);System.out.print("老师:");String str = sc.next();byte[] bytes = str.getBytes();//封装数据,并且指定学生的ip和端口号DatagramPacket dp2 = new DatagramPacket(bytes,bytes.length, InetAddress.getByName("localhost"),8888);//发送:ds.send(dp2);}} catch (SocketException e) {e.printStackTrace();} catch (UnknownHostException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();} finally {//5.关闭资源:ds.close();}}
}

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

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

相关文章

Python生成图片和音频验证码

captcha是pyhton的一个模块,用来生成图片和音频验证码。 安装 pip install captcha使用 from captcha.audio import AudioCaptcha from captcha.image import ImageCaptcha# 加载声音和字体 audio AudioCaptcha(voicedir/path/to/voices) image ImageCaptcha(…

【洛谷 P4017】最大食物链计数 题解(深度优先搜索+动态规划+邻接表+记忆化搜索+剪枝)

最大食物链计数 题目背景 你知道食物链吗?Delia 生物考试的时候,数食物链条数的题目全都错了,因为她总是重复数了几条或漏掉了几条。于是她来就来求助你,然而你也不会啊!写一个程序来帮帮她吧。 题目描述 给你一个…

蓝牙耳机哪个品牌质量最好最耐用?五大口碑最佳机型,硬核推荐

​在快节奏的都市生活中,无线蓝牙耳机成为了我们摆脱线缆束缚、随时随地享受音乐的完美伴侣。面对市场上琳琅满目的品牌和型号,挑选一款合适的耳机似乎是一项挑战。因此,我精心挑选了几款性能卓越的蓝牙耳机,希望我的分享能为你提…

Vue学习笔记(一)

1. 绑定事件按按键修饰符 <!DOCTYPE html> <html lang"en"><head><meta charset"utf-8"><title>绑定事件和按键修饰符</title> </head><body> <div id"app">{{ person }}<hr/><…

【Linux】开始了解重定向

送给大家一句话&#xff1a; 人真正的名字是&#xff1a;欲望。所以你得知道&#xff0c;消灭恐惧最有效的办法&#xff0c;就是消灭欲望。 – 史铁生 《我与地坛》 开始了解重定向 1 前言2 重定向与缓冲区2.1 文件描述符分配规则2.2 重定向的现象2.3 重定向的理解2.4 缓冲区…

突破传统RAG限制!Adaptive-RAG实现高效复杂查询处理

参考文章&#xff1a;突破传统RAG限制&#xff01;Adaptive-RAG实现高效复杂查询处理 在人工智能领域&#xff0c;大型语言模型&#xff08;LLMs&#xff09;的发展日新月异&#xff0c;它们在多种任务中展现出了卓越的性能。然而&#xff0c;尽管LLMs在处理问题时表现出色&…

MongoDB数据库转换为表格文件的Python实现

目录 一、引言 二、转换工具与库的选择 三、转换过程详解 安装必要的库 连接MongoDB数据库 查询并处理数据 将数据写入CSV文件 四、进阶技巧与注意事项 五、总结 一、引言 在当今大数据时代&#xff0c;数据的存储、处理与共享显得尤为重要。MongoDB作为一个面向文档…

如何更换网络IP地址,简单几步轻松搞定

在数字化日益普及的今天&#xff0c;网络IP地址作为设备在网络中的标识&#xff0c;扮演着极其重要的角色。有时&#xff0c;出于安全考虑、网络布局调整或解决特定问题的需要&#xff0c;我们可能需要更换网络IP地址。虎观代理将详细介绍如何更换网络IP地址&#xff0c;帮助用…

Android 输入法框架

输入法属于输入系统的一部分&#xff0c;区别于输入系统只能向系统产生时间&#xff0c;输入法能向系统输入具体的内容&#xff0c;下面来认识输入法的大体框架&#xff0c;以下内容参考清华大学出版社出版的《Android图形显示系统》。 输入法框架包含3个组件&#xff0c;各组件…

k8s集群node节点状态为Not Ready

目录 一、Node节点Not Ready状态的可能原因 二、排查node节点状态为Not Ready的原因 一、Node节点Not Ready状态的可能原因 node节点状态为Not Ready可能的原因有&#xff1a; 1.网络插件出问题 有过安装经验的小伙伴应该很熟悉未安装网络插件的情况下node节点在集群中的状…

基于java+springboot+vue实现的西安旅游系统(文末源码+Lw)23-265

摘 要 如今社会上各行各业&#xff0c;都喜欢用自己行业的专属软件工作&#xff0c;互联网发展到这个时候&#xff0c;人们已经发现离不开了互联网。新技术的产生&#xff0c;往往能解决一些老技术的弊端问题。因为传统西安旅游系统信息管理难度大&#xff0c;容错率低&#…

3-1 AUTOSAR RTE概述

返回总目录->返回总目录<- 一、概念 1.1 虚拟总线VFB 若从整车级别去看待整车上所有的功能模块,即软件组件的架构,它们之间的通信形式主要涉及以下两种: 在单个ECU内部的通信(Intra-ECU Communication);在多个ECU之间的通信(Inter-ECU Communication)。 …

java实现TCP交互

服务器端 import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.io.PrintWriter; import java.net.ServerSocket; import java.net.Socket; import java.util.PriorityQueue; import java.util.Scanner;public class TCP_Serv…

【嵌入式学习】ARM day04.11

一、思维导图 二、练习 实现三个灯闪烁 汇编代码 .text .global _start _start: 使能GPIOE和F时钟LDR r0,0x50000A28LDR r1,[R0]ORR R1,R1,#(0X3<<4)STR R1,[R0]配置GPIOE和F的MODER寄存器LDR r0,0x50006000 GPIOELDR R1,0X50007000 G…

golangci-lint 报错

File is not gci-ed with --skip-generated -s standard,default (gci) golangci-lint 报错上面的错解决办法&#xff1a; 1. 文件换行需要换成"LF" 而不是"CRLF" ---->>> 我用的goland IDE&#xff0c;随便在这个文件删除一个空行&#xff…

Docker部署SpringBoot+Vue前后端分离项目

文章目录 1. 安装Docker1. 1 卸载旧版Docker1.2 配置yum仓库1.3 安装Docker1.4 添加自启动配置1.5 配置阿里云镜像加速1.6 测试 2. 安装Nginx2.1 拉取镜像2.2 安装Nginx2.3 测试 3. 安装MySQL3.1 拉取镜像3.2 安装MySQL3.3 连接MySQL 4. 部署SpringBoot项目4.1 Maven打包4.2 编…

qt 打印日志

在 Qt Creator 中&#xff0c;将 QDebug、QInfo、QWarning、QCritical 和 QFatal 打印的日志输出到指定文件&#xff0c;需要设置 Qt 的消息处理机制。这通常涉及到安装一个自定义的消息处理器&#xff0c;该处理器将日志消息重定向到文件。以下是一个基本的步骤指南&#xff1…

R-Tree原理及朴素实现代码

R树是用于空间访问方法的树数据结构&#xff0c;即用于索引多维信息&#xff0c;例如地理坐标、矩形或多边形。 NSDT工具推荐&#xff1a; Three.js AI纹理开发包 - YOLO合成数据生成器 - GLTF/GLB在线编辑 - 3D模型格式在线转换 - 可编程3D场景编辑器 - REVIT导出3D模型插件 -…

使用ROCm的HIP API向量加法程序

一、向量加法程序 Radeon Open Compute (ROCm) 是一个开源平台&#xff0c;用于加速高性能计算 (HPC) 和机器学习应用程序。它支持包括GPUs在内的多种硬件&#xff0c;并提供HIP (Heterogeneous-compute Interface for Portability) 作为CUDA代码的便捷转换工具。为了提供一个…

蓝桥杯算法题:栈(Stack)

这道题考的是递推动态规划&#xff0c;可能不是很难&#xff0c;不过这是自己第一次靠自己想出状态转移方程&#xff0c;所以纪念一下&#xff1a; 要做这些题目&#xff0c;首先要把题目中会出现什么状态给找出来&#xff0c;然后想想他们的状态可以通过什么操作转移&#xf…