Java——网络编程

网络编程基础类

InetAddress类

  • java.net.InetAddress类用来封装计算机的IP地址和DNS(没有端口信息),它包括一个主机名和一个ip地址,是java对IP地址的高层表示。大多数其他网络类都要用到这个类,包括Sorket、ServerSocker、URL、DatagramSorket、DatagramPacket等
  • 常用静态方法
    • getLocalHost()得到本机的InetAddress对象,其中封装了IP地址和主机名
    • getByName(String host)传入目标主机的名字或IP地址得到对应的InetAddress对象,其中封装了IP地址和主机名(底层会自动连接DNS服务器进行域名解析)
  • 常用实例方法
    • getHostAddress() 获取IP地址
    • getHostName() 获取主机名/域名
public class Test01 {public static void main(String[] args) throws UnknownHostException {//获取本机InetAddress对象(包含ip地址和封装对象)InetAddress ia = InetAddress.getLocalHost();//获取本机ip地址String ip = ia.getHostAddress();//获取本机主机名String hostName = ia.getHostName();System.out.println(ip + " -> " + hostName); //10.6.43.36 -> DESKTOP-D4BI28V//通过getByName(String host) 获取指定地址的InetAddress对象InetAddress baidu = InetAddress.getByName("baidu.com");System.out.println(baidu.getHostAddress()); //39.156.66.10System.out.println(baidu.getHostName()); //baidu.com}
}

URL类

  • URL由4部分组长城:协议、存放资源的主机域名、端口号、资源文件名。未指定端口号则使用协议默认的端口
  • 标准格式 <协议>://<域名/IP>:<端口号>/<路径>
    • <协议>://<域名/IP>是必须的
    • <端口号>/<路径>有时可省略
  • 为了方便程序员编程,JDK中提供了URL类,该类的全名是java.net.URL,该类封装了大量复杂的涉及从远程站点获取信息的细节,可以使用它的各种方法来对URL对象进行分割、合并等处理
    • 构造方法
      • Url url = new URL(String url);
    • 常用方法
      • 获取协议
        • url.getPtotocol()
      • 获取域名
        • url.getHost()
      • 获取默认端口
        • url.getDefaultPort()
      • 获取端口
        • url.getPort()
      • 获取路径
        • url.getPath()
      • 获取资源
        • url.getFile()
      • 获取数据
        • url.getQuery()
      • 获取锚点
        • url.getRef()
public class Test01 {public static void main(String[] args) throws UnknownHostException, MalformedURLException {URL url = new URL("https://www.baidu.com/s?wd=%E5%BC%A0%E4%B8%89&rsv_spt=1&rsv_iqid=0x901ef519004b0a02&issp=1&f=8&rsv_bp=1&rsv_idx=2&ie=utf-8&rqlang=&tn=baiduhome_pg&ch=&rsv_enter=1&rsv_btype=i&rsv_dl=ib&inputT=2117");//获取协议String protocol = url.getProtocol();System.out.println("协议" + protocol);//获取域名String host = url.getHost();System.out.println("域名" + host);//获取默认端口int defaultPort = url.getDefaultPort();System.out.println("默认端口" + defaultPort);//获取端口int port = url.getPort();System.out.println("端口" + port);//获取路径String path = url.getPath();System.out.println("路径" + path);//获取资源String file = url.getFile();System.out.println("资源" + file);//获取数据String query = url.getQuery();System.out.println("数据" + query);//获取锚点String ref = url.getRef();System.out.println("锚点" + ref);}
}
    • 使用URL类的openStream()方法可以打开到此URL的连接并返回一个用于从该链接读入的InputStream,实现最简单的网络爬虫
public class Test01 {public static void main(String[] args){//获取URL对象指向tianqi.qq.comURL url = null;InputStream is = null;BufferedReader br = null;try {url = new URL("https://tianqi.qq.com/");//获取简单输入流is = url.openStream();//通过转换流获取包装流br = new BufferedReader(new InputStreamReader(is));String str = null;while ((str = br.readLine()) != null) {System.out.println(str);}} catch (MalformedURLException e) {throw new RuntimeException(e);} catch (IOException e) {throw new RuntimeException(e);}finally {//关闭流if (is != null) {try {is.close();} catch (IOException e) {throw new RuntimeException(e);}}if (br != null) {try {br.close();} catch (IOException e) {throw new RuntimeException(e);}}}}
}

TCP协议用到的类

Socket套接字类
  • 我们开发的网络应用程序位于应用层,TCP和UDP属于传输层协议,在应用层如何使用传输层的服务呢?在应用层和传输层之间,则是使用套接Socket来进行分离。
  • 套接字就像是传输层为应用层开的一个小口,应用程序通过这个小口向远程发送数据,或者接收远程发来的数据。而这个小口以内,也就是数据进入这个口之后,或者数据从这个口出来之前,是不知道也不需要知道的,也不会关心它如何传输,这属于网络其它层次工作。
  • Socket实际是传输层供给应用层的编程接口。Socket就是应用层与传输层之间的桥梁。使用Socket编程可以开发客户机和服务器应用程序,可以在本地网络上进行通信,也可通过Internet在全球范围内通信。

  • TCP协议和UDP协议是传输层的两种协议。Socket是传输层供给应用层的编程接口,所以Socket编程就分为TCP编程和UDP编程两类。
构造方法
  • public Socket(InetAddress a,int p)
    • 创建套接字并连接到指定IP地址的端口号
  • public Socket(String ip,int p)
    • 创建套接字并连接到指定IP地址的端口号
实例方法
    • getInetAddress()
      • 返回此Socket对象连接到的ip地址
    • getInputStream()
      • 返回此Soket对象的输入流(接收网络消息)
    • getOutputStream()
      • 返回此Soket对象的输出流(发送网络消息)
    • shutdownInput()
      • 禁用此Soket对象的输入流
    • shutdownOutput()
      • 禁用此Soket对象的输出流
    • close()
      • 关闭此Soket对象(默认会关闭IO流)
ServerSocket类
  • ServerSocket类用于实现服务器套接字(Server服务端)。服务器套接字等待请求通过网络传入。它基于该请求执行某些操作,然后可能向请求者返回结果
构造方法
    • public ServerSocket(int port)
实例方法
    • accept()
      • 侦听要连接此Socket并接受它
    • getInetAddress()
      • 返回此服务器套接字的本地地址
    • close()
      • 关闭此套接字

UDP协议用到的的类

DatagramPacket类
  • DatagramSocket类作为基于UDP协议的Socket,使用DatagramSocket类可以用于接收和发送数据,同时创建接收端时还需指定端口号
  • 构造方法
    • DatagramSocket()
      • 创建发送端的数据报套接字
    • DatagramSocket(int port)
      • 创建接收端的数据报套接字并指定端口号
  • 实例方法
    • send(DatagramPacket p)
      • 发送数据报
    • receive(DatagramPacket p)
      • 接收数据报
    • close()
      • 关闭数据报套接字
DatagramPacket类
  • DatagramPacket类负责把发送的数据打包(打包的数据为byte类型的数组),并且创建发送端时需指定接收端的IP地址和端口
  • 构造方法
    • DatagramPacket(byte bufp[],int offset,int length)
      • 创建接收端的数据
    • DatagramPacket(byte bufp[],int offset,int length,InetAddress address,int port)
      • 创建发送端的数据
  • 实例方法
    • public synchronized byte[] getDate()
      • 返回数据报中存储的数据
    • public synchronized int getLength()
      • 获得发送或接收数据报中的长度

基于TCP协议的程序

服务端与客户端的单项通讯(client -> server)

public class Server {public static void main(String[] args) {//新建ServerSocket对象ServerSocket server = null;Socket client = null;BufferedReader br = null;try {int port = 8888;server = new ServerSocket(port);System.out.println("服务器启动成功,端口号为" + port);//服务端开始侦听并接收请求,获取到来自服务端的Socket对象client = server.accept();System.out.println("已经与" + client.getInetAddress() + ':' + client.getPort() + "建立连接");//获取服务端输入流br = new BufferedReader(new InputStreamReader(client.getInputStream()));System.out.println(br);String str = null;while ((str = br.readLine()) != null) {System.out.println("客户端:");System.out.println(str);}} catch (IOException e) {throw new RuntimeException(e);} finally {if (br != null) {try {br.close();} catch (IOException e) {throw new RuntimeException(e);}}if (server != null) {try {server.close();} catch (IOException e) {throw new RuntimeException(e);}}if (client != null) {try {client.close();} catch (IOException e) {throw new RuntimeException(e);}}}}
}
public class Client {public static void main(String[] args) {//创建客户端Socket对象Socket client = null;BufferedWriter bw = null;try {InetAddress localHost = InetAddress.getLocalHost();client = new Socket(localHost,8888);//client = new Socket("127.0.0.1",8888); 传ip地址也可以//转换为增强字符流bw = new BufferedWriter(new OutputStreamWriter(client.getOutputStream()));Scanner sc = new Scanner(System.in);//发送内容while (true) {bw.write(sc.next() + '\n');bw.flush();Thread.sleep(1000L);}} catch (IOException e) {throw new RuntimeException(e);} catch (InterruptedException e) {throw new RuntimeException(e);} finally {if (client != null) {try {client.close();} catch (IOException e) {throw new RuntimeException(e);}}if (bw != null) {try {bw.close();} catch (IOException e) {throw new RuntimeException(e);}}}}
}
  • 细节:readLine()是读一行,因此必须有换行符才能连续读取

服务端客户端双向通信(客户端--->服务端-->客户端)

public class Server {public static void main(String[] args) {ServerSocket serverSocket = null;Socket clientSocket = null;BufferedInputStream bis = null;BufferedOutputStream bos = null;BufferedWriter bw = null;try {//新建服务器对象serverSocket = new ServerSocket(8888);//开始侦听8888端口接受连接并返回Socket套接字对象clientSocket = serverSocket.accept();System.out.println("已经连接到" + clientSocket.getInetAddress() + ':' + clientSocket.getPort());//获取缓冲字节输入/出流,缓冲字符输出流bis = new BufferedInputStream(clientSocket.getInputStream());bos = new BufferedOutputStream(new FileOutputStream("C:\\temp\\temp2.png"));bw = new BufferedWriter(new OutputStreamWriter(clientSocket.getOutputStream()));byte[] bytes = new byte[1024];int i = 0;int len = 0;while ((len = bis.read(bytes)) != -1) {bos.write(bytes,0,len);//刷新缓冲流bos.flush();}bw.write("传输成功");//传输完成,返回信息bw.flush();} catch (IOException e) {throw new RuntimeException(e);} finally {if (serverSocket == null) {try {serverSocket.close();} catch (IOException e) {throw new RuntimeException(e);}}if (clientSocket != null) {try {clientSocket.close();} catch (IOException e) {throw new RuntimeException(e);}}if (bis != null) {try {bis.close();} catch (IOException e) {throw new RuntimeException(e);}}if (bos != null) {try {bos.close();} catch (IOException e) {throw new RuntimeException(e);}}if (bw != null) {try {bw.close();} catch (IOException e) {throw new RuntimeException(e);}}}}
}
public class Client {public static void main(String[] args) {Socket clientSocket = null;BufferedOutputStream bos = null;BufferedInputStream bis = null;BufferedReader br = null;try {//创建客户端SocketclientSocket = new Socket(InetAddress.getLocalHost(),8888);//获取缓冲输出/入字节流,缓冲字符输入流bis = new BufferedInputStream(new FileInputStream(new File("C:\\temp\\temp1.png")));bos = new BufferedOutputStream(clientSocket.getOutputStream());br = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));byte[] bytes = new byte[1024];//发送图片int len = 0;while ((len = bis.read(bytes)) != -1) {//发送图片bos.write(bytes,0,len);//刷新缓冲流bos.flush();len = bis.read(bytes);}//输出结束,Server端停止接收数据clientSocket.shutdownOutput();String str = null;//等待接收消息while ((str = br.readLine()) != null) {System.out.println(str);}} catch (UnknownHostException e) {throw new RuntimeException(e);} catch (IOException e) {throw new RuntimeException(e);} finally {if (clientSocket != null) {try {clientSocket.close();} catch (IOException e) {throw new RuntimeException(e);}}if (bos != null) {try {bos.close();} catch (IOException e) {throw new RuntimeException(e);}}if (bis != null) {try {bis.close();} catch (IOException e) {throw new RuntimeException(e);}}if (br != null) {try {br.close();} catch (IOException e) {throw new RuntimeException(e);}}}}
}
  • 细节
    • 服务端的输入流是从客户端得到的,客户端while循环结束后,服务器仍在监听客户端,等待客户端发送消息,因此客户端不会继续往下执行,必须调用shutdownOutput()方法,声明输出流已停止输出,客户端才会继续往下执行

基于UDP协议的程序

public class Recive {public static void main(String[] args) {DatagramSocket recive = null;DatagramPacket datagramPacket = null;try {//新建接收端DatagramSocket对象recive = new DatagramSocket(8888);//创建数据包byte[] bytes = new byte[1024];datagramPacket = new DatagramPacket(bytes,0,bytes.length);//接收数据报recive.receive(datagramPacket);//转实际长度System.out.println(new String(bytes,0,datagramPacket.getLength()));} catch (SocketException e) {throw new RuntimeException(e);} catch (IOException e) {throw new RuntimeException(e);} finally {if (recive != null) {recive.close();}}}
}
public class Send {public static void main(String[] args) {DatagramSocket send = null;DatagramPacket datagramPacket = null;try {//新建发送端DatagramSocket对象send = new DatagramSocket();//准备要发送的数据byte[] bytes = "Hello,world".getBytes();//创建发送包datagramPacket = new DatagramPacket(bytes,0,bytes.length,InetAddress.getByName("127.0.0.1"),8888);//发送数据send.send(datagramPacket);} catch (SocketException e) {throw new RuntimeException(e);} catch (UnknownHostException e) {throw new RuntimeException(e);} catch (IOException e) {throw new RuntimeException(e);} finally {if (send != null) {send.close();}}}
}

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

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

相关文章

15.7k stars一个实用型OCR,支持80多种语言

一个实用型 OCR,支持 80 多种语言和所有流行的书写脚本&#xff0c;包括&#xff1a;拉丁文、中文、阿拉伯文、梵文、西里尔文等。 特点 支持本地或云/API部署 准确度提高到 99% 以上 完全可定制,支持 80 多种语言 支持表格识别 二维码/条码提取识别 GitHub数据 15.7k s…

鸿蒙Harmony应用开发—ArkTS声明式开发(容器组件:Column)

沿垂直方向布局的容器。 说明&#xff1a; 该组件从API Version 7开始支持。后续版本如有新增内容&#xff0c;则采用上角标单独标记该内容的起始版本。 子组件 可以包含子组件。 接口 Column(value?: {space?: string | number}) 从API version 9开始&#xff0c;该接口…

unity学习(57)——选择角色界面--删除角色2

1.客户端添加点击按钮所触发的事件&#xff0c;在selectMenu界面中增加myDelete函数&#xff0c;当点击“删除角色”按钮时触发该函数的内容。 public void myDelete() {string message nowPlayer.id;//string m Coding<StringDTO>.encode(message);NetWorkScript.get…

Docker 学习笔记一

一、什么是docker Docker 是一个基于轻量级虚拟化技术的容器&#xff0c;整个项目基于Go语言开发&#xff1b;Docker是一个C/S架构&#xff0c;后端众多模块各司其职&#xff0c;docker的daemon是运行在主机上通过client可以进行通信。 docker 由三部分组成&#xff1a;镜像(…

使用Seata实现分布式事务真香!

之前分享了六种分布式事务方案&#xff1a; 本地消息表&#xff1a;如何通过本地消息表实现分布式事务 最大努力通知&#xff1a;如何使用最大努力通知实现分布式事务&#xff1f;与本地消息表区别&#xff1f; XA模式&#xff1a;用二阶段三阶段提交实现分布式事务 TCC模式…

解析编程中不可或缺的基础:深入了解结构体类型

精琢博客&#xff0c;希望可以给大家带来收获~ 博主主页&#xff1a;17_Kevin-CSDN博客 收录专栏&#xff1a;《C语言》 引言 在编程中&#xff0c;结构体是一种自定义的数据类型&#xff0c;它允许开发人员将不同类型的数据组合在一起&#xff0c;并为其定义相关属性和行为。…

uniapp 跳转返回携带参数(超好用)

天梦星服务平台 (tmxkj.top)https://tmxkj.top/#/ 1.返回界面 uni.$emit(enterPeople, this.entryList)uni.navigateBack({delta: 1}) 2.返回到的界面&#xff08;接收数据界面&#xff09; onShow() {let that thisuni.$on(enterPeople,function(enterPeopledata){console.…

YOLOv8 | 添加注意力机制报错KeyError:已解决,详细步骤

目录 添加注意力机制报错 报错的原因 注意事项 解决错误流程 代码分享 ⭐欢迎大家订阅我的专栏一起学习⭐ &#x1f680;&#x1f680;&#x1f680;订阅专栏&#xff0c;更新及时查看不迷路&#x1f680;&#x1f680;&#x1f680; YOLOv5涨点专栏&#xff1a;h…

重学SpringBoot3-ServletWebServerFactoryAutoConfiguration类

更多SpringBoot3内容请关注我的专栏&#xff1a;《SpringBoot3》 期待您的点赞&#x1f44d;收藏⭐评论✍ 重学SpringBoot3-ServletWebServerFactoryAutoConfiguration类 工作原理关键组件以TomcatServletWebServerFactory为例ServletWebServerFactory会创建webServer的时机关键…

25考研数据结构复习·3.2队列

队列&#xff08;Queue&#xff09;基本概念 定义 队列&#xff08;Queue&#xff09;时只允许在一端进行插入&#xff0c;在另一端删除的线性表。 特点&#xff1a;先进入队列的元素先出队 先进先出 First In First Out(FIFO) 重要术语 队头、队尾、空队列 基本操作 创、销 I…

页面配置、网络数据请求

1. 页面配置文件的作用 小程序中&#xff0c;每个页面都有自己的 .json 配置文件&#xff0c;用来对当前页面的窗口外观、页面效果等进行配置。 2. 页面配置和全局配置的关系 小程序中&#xff0c; app.json 中的 window 节点&#xff0c;可以全局配置小程序中每个页面的窗口…

网络编程-套接字相关基础知识

1.1. Socket简介 套接字&#xff08;socket&#xff09;是一种通信机制&#xff0c;凭借这种机制&#xff0c; 客户端<->服务器 模型的通信方式既可以在本地设备上进行&#xff0c;也可以跨网络进行。 Socket英文原意是“孔”或者“插座”的意思&#xff0c;在网络编程…

Java初阶数据结构二叉树实现+练习完整(工程文件后序会进行上传)

i1.二叉树的概念 1.二叉树的定义 &#xff08;1&#xff09;二叉树可以是一个节点的有限集合 &#xff08;2&#xff09;可以为空 &#xff08;3&#xff09;或者是由一个根节点加上两棵分别称为左子树和右子树的二叉树组成的 &#xff08;4&#xff09;二叉树的每一个节点…

python爬虫实战——抖音

目录 1、分析主页作品列表标签结构 2、进入作品页前 判断作品是视频作品还是图文作品 3、进入视频作品页面&#xff0c;获取视频 4、进入图文作品页面&#xff0c;获取图片 5、完整参考代码 6、获取全部作品的一种方法 本文主要使用 selenium.webdriver&#xff08;Firef…

手机网络连接性能API接口:查询手机网络连接性能状态

手机在网状态查询服务是一项非常方便的服务&#xff0c;可以帮助我们随时了解一个手机号码的在网状态。不论是查询自己的手机号码&#xff0c;还是查询他人的手机号码&#xff0c;这个服务都可以帮助我们获取准确的信息。今天&#xff0c;我想和大家介绍一个非常好用的手机在网…

力扣100题—持续更新

目录 LC141环形列表(easy)题目描述方法1&#xff1a;快慢指针&#xff08;1&#xff09;思路&#xff08;2&#xff09;python代码&#xff08;3&#xff09;复杂度分析 LC881救生艇&#xff08;medium&#xff09;题目描述方法1&#xff1a;双指针-对撞指针&#xff08;1&…

柚见第十二期(随机匹配)

随机匹配 目的 为了帮大家更快地发现和自己兴趣相同的朋友 问题 匹配 1 个还是匹配多个&#xff1f; 答&#xff1a;匹配多个&#xff0c;并且按照匹配的相似度从高到低排序 怎么匹配&#xff1f;&#xff08;根据什么匹配&#xff09; 答&#xff1a;标签 tags 还可以根据 us…

分享一下自己总结的7万多字java面试笔记和一些面试视频,简历啥的,已大厂上岸

分享一下自己总结的7万多字java面试笔记和一些面试视频&#xff0c;简历啥的&#xff0c;已大厂上岸 自己总结的面试简历资料&#xff1a;https://pan.quark.cn/s/8b602fe53b58 文章目录 SSMspringspring 的优点&#xff1f;IoC和AOP的理解**Bean 的生命周期****列举一些重要…

一命通关差分

本章节是前缀和的延申 一命通关前缀和-CSDN博客https://blog.csdn.net/qq_74260823/article/details/136530291?spm1001.2014.3001.5501 一命通关前缀和 公交车 引入 还是利用我们在前缀和中所采用的例子——公交车。 有一辆公交车&#xff0c;一共上下了N批乘客&#xff1a…

【Vue3】源码解析-Runtime

文章目录 系列文章packages/runtime-dom/src/index.ts初始化创建renderermount \src\runtime-core\component.jsh.tspackages/runtime-core/src/renderer.ts挂载及卸载DOM节点render packages/runtime-dom/src/nodeOps.tspackages/runtime-core/src/apiCreateApp.ts创建appmoun…