Java-day18(网络编程)

网络编程

1.概述

  • Java提供跨平台的网络类库,可以实现无痛的网络连接,程序员面对的是一个统一的网络编程环境

  • 网络编程的目的:直接或间接地通过网络协议与其他计算机进行通信

  • 网络编程的两个主要问题:

    • 1.如何准确定位网络上一台或多台计算机

      • 通信双方地址

      • 一定的规则
        TCP/IP参考模型(现实中运用)
        OSI参考模型(太过理想化,未广泛推广)

    • 2.找到主机后如何可靠高效地进行数据传输

      • TCP 可靠性高,每次传输数据多
      • UDP 速度快,可靠性低

2.要素

  • IP和端口号

    • IP: 唯一标识Internet上的计算机(回环:127.0.0.1;主机:localhost

    • 端口号: 标识正在计算机上运行的进程(程序);不同的进程有不同的端口号;端口号为0~2^16-1,0~1023被预先定义,1024~65535支持用户定义(默认数据库MySQL:3306,http:80)

    • 端口号与IP地址的组合得出一个网络套接字
      在这里插入图片描述

  • 网络通信协议

    • 计算机网络中实现通信必须有的一些约定,及网络通信协议

    • 计算机各层之间互不影响

    • TCP/IP协议簇:包含多个具有不同功能且相互关联的一组协议(以传输控制协议(TCP)和网络互联协议(IP)为主)

3.InetAddress类

InetAddress:位于java.net

  1. InetAddress用来代表IP地址,一个InetAddress的对象就代表一个IP地址
  2. 创建InetAddress类对象:getByName(String host)
  3. 获取IP地址:getHostAddress() 获取IP地址对应的域名:getHostName()

例:

import java.net.InetAddress;
import java.net.UnknownHostException;public class Test1 {public static void main(String[] args) throws Exception {                         //创建InetAddress对象InetAddress inet = InetAddress.getByName("www.bilibili.com");		//inet = InetAddress.getByName("61.240.206.10");//也可以用IP地址System.out.println(inet);//www.bilibili.com/112.83.140.13System.out.println(inet.getHostAddress());System.out.println(inet.getHostName());System.out.println();//获取本机的用户名与IPInetAddress inet1 = InetAddress.getLocalHost();System.out.println(inet1);System.out.println(inet1.getHostAddress());System.out.println(inet1.getHostName());}}

4.TCP网络通信

传输控制协议要点
  • 使用TCP协议前,须先建立TCP连接,形成传输数据通道
  • 传输前,采用“三次握手”方式,可靠
  • TCP协议进行通信的两个应用进程:客户端,服务端
  • 在连接中可进行大数据量的传输
  • 传输完成,需释放已建立的连接,效率低
    例1
package com.end.java;import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.InetAddress;
import java.net.ServerSocket;
import java.net.Socket;
import java.net.UnknownHostException;import org.junit.Test;//客户端给服务器发送信息,服务端输送此信息到控制台
public class TestTCP1 {@Test//客户端public void client() {Socket socket = null;OutputStream os = null;try {//1.创建一个Socket的对象,通过构造器指明服务器的IP地址及接收端口socket = new Socket(InetAddress.getByName("127.0.0.1"),9090);//2.getOutputStream(),发送数据,方法返回OutputStream的对象os = socket.getOutputStream();//3.具体的输出过程os.write("我是客户端,请多多关照!".getBytes());} catch (IOException e) {e.printStackTrace();}finally {//4.关闭相应的流与Socketif(os != null) {try {os.close();} catch (IOException e) {e.printStackTrace();}}if(socket != null) {try {socket.close();} catch (IOException e) {e.printStackTrace();}}}}@Test//服务端public void server() {ServerSocket ss = null;Socket s = null;InputStream is = null;try {//1.创建ServerSocket的对象,通过构造器指明自身的接收端口ss = new ServerSocket(9090);//2.调用accept()方法,返回Socket的对象()s = ss.accept();//3.调用Socket的getInputStream(): 接收从客户端发送过来的数据输入流is = s.getInputStream();//4.对获取的输入流进行操作byte[] b = new byte[20];int len;while((len = is.read(b)) != -1) {String str = new String(b,0,len);System.out.print(str);}System.out.println("收到来自" + s.getInetAddress().getHostName() + "的消息");} catch (IOException e) {e.printStackTrace();}finally {//5.关闭相应的流与Socketif(is != null) {try {is.close();} catch (IOException e) {e.printStackTrace();}}if(s != null) {try {s.close();} catch (IOException e) {e.printStackTrace();}}if(ss != null) {try {ss.close();} catch (IOException e) {e.printStackTrace();}}}}
}

例2

package com.end.java;import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.InetAddress;
import java.net.ServerSocket;
import java.net.Socket;
import java.net.UnknownHostException;import org.junit.Test;//客户端给服务器发送信息,服务端输送此信息到控制台,同向客户端发送“收到信息”
public class TestTCP2 {@Test//客户端public void client() {Socket socket = null;OutputStream os = null;InputStream is = null;try {socket = new Socket(InetAddress.getByName("127.0.0.1"),8081);os = socket.getOutputStream();os.write("我是客户端".getBytes());//shutdownOutput():告诉服务端消息已发送完毕socket.shutdownOutput();is = socket.getInputStream();byte[] b = new byte[20];int len;while((len = is.read(b)) != -1) {String str = new String(b,0,len);System.out.print(str);}} catch (Exception e) {e.printStackTrace();}finally {if(is != null) {try {is.close();} catch (IOException e) {e.printStackTrace();}}if(os != null) {try {os.close();} catch (IOException e) {e.printStackTrace();}}if(socket != null) {try {socket.close();} catch (IOException e) {e.printStackTrace();}}}}@Test//服务端public void server() {ServerSocket ss = null;Socket s = null;InputStream is = null;OutputStream os = null;try {ss = new ServerSocket(8081);s = ss.accept();is = s.getInputStream();byte[] b = new byte[20];int len;while((len = is.read(b)) != -1) {String str = new String(b,0,len);System.out.print(str);}os = s.getOutputStream();os.write("我已收到".getBytes());} catch (IOException e) {e.printStackTrace();}finally {if(os != null) {try {os.close();} catch (Exception e) {e.printStackTrace();}}if(is != null) {try {is.close();} catch (IOException e) {e.printStackTrace();}}if(s != null) {try {s.close();} catch (IOException e) {e.printStackTrace();}}if(ss != null) {try {ss.close();} catch (IOException e) {e.printStackTrace();}}}}
}

例3

package com.end.java; import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.InetAddress;
import java.net.ServerSocket;
import java.net.Socket;import org.junit.Test;//从客户端发送给服务器,服务端保存到本地,并返回“发送成功”给客户端,并关闭相应的连接
//处理异常时,必须使用try-catch-finally!本例仅为书写方便
public class TestTCP3 {@Testpublic void client() throws Exception{//客户端//1.创建对象Socket socket = new Socket(InetAddress.getByName("127.0.0.1"),9898);//2.本地获取文件发送给服务端OutputStream os = socket.getOutputStream();FileInputStream fis = new FileInputStream(new File("1.webp"));byte[] b = new byte[20];int len;while((len = fis.read(b)) != -1) {os.write(b,0,len);}socket.shutdownOutput();//3.读取服务端发送的数据InputStream is = socket.getInputStream();byte[] b1 = new byte[1024];int len1;while((len1 = is.read(b1)) != -1) {String str = new String(b1,0,len1);System.out.print(str);}//4.关闭相应的流os.close();is.close();fis.close();socket.close();}@Test//服务器public void server() throws Exception{//1.创建对象ServerSocket ss = new ServerSocket(9898);//2.接受/读取客户端请求或数据,保存到本地Socket s = ss.accept();InputStream is = s.getInputStream();FileOutputStream fos = new FileOutputStream(new File("2.webp"));byte[] b = new byte[1024];int len;while((len = is.read(b)) != -1) {fos.write(b,0,len);}System.out.println("收到来自" + s.getInetAddress().getHostName() + "的文件");//3.向客户端发送信息OutputStream os = s.getOutputStream();os.write("你发送的图片已接收成功".getBytes());//4.关闭相应的流os.close();is.close();fos.close();ss.close();s.close();}
}

5.UDP网络通信

用户数据报协议要点
  • 将数据,源,目的地址封装成数据包,不需要建立连接
  • 每个数据报的大小限制在64K
  • 因无需连接,故不可靠
  • 发送数据结束时无需释放资源,速度快
package com.end.java;  import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException;
import java.net.UnknownHostException;import org.junit.Test;//发送端给服务器发送信息,服务端输送此信息到控制台
//DatagramSocket(数据报的发送和接收) 和 DatagramPacket(对象封装UDP数据报中数据)实现基于UDP协议网络程序
public class TestUDP {@Test//发送端public void send() {DatagramSocket ds= null;try {ds = new DatagramSocket();byte[] b = "hello,world!".getBytes();//创建数据报,每个数据报不能大于64K,都记录着数据,发送端IP,端口,及接收端IP,端口DatagramPacket pack = new DatagramPacket(b,0,b.length,InetAddress.getByName("127.0.0.1"),9090);ds.send(pack);} catch (SocketException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (UnknownHostException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}finally {if(ds != null) {ds.close();}}}@Test//接收端public void rceive() {DatagramSocket ds = null;try {ds = new DatagramSocket(9090);byte[] b = new byte[1024];DatagramPacket pack = new DatagramPacket(b,0,b.length);ds.receive(pack);String str = new String(pack.getData(),0,pack.getLength());System.out.println(str);} catch (IOException e) {e.printStackTrace();}finally {if(ds != null) {ds.close();}}}
}
练习
package com.end.java;import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.InetAddress;
import java.net.ServerSocket;
import java.net.Socket;
import java.net.UnknownHostException;
import java.util.Scanner;import org.junit.Test;//TCP编程练习:客户端给服务端发送文本,服务端将文本转成大写返回给客户端
public class TCPTest {@Testpublic void client() {Socket socket = null;OutputStream os = null;Scanner scanner = null;//4.接收来自服务端的数据InputStream is = null;try {socket = new Socket(InetAddress.getByName("127.0.0.1"),9090);os = socket.getOutputStream();System.out.println("请输入多个字符: ");scanner = new Scanner(System.in);String str = scanner.next();os.write(str.getBytes());socket.shutdownOutput();is = socket.getInputStream();byte[] b = new byte[1024];int len;while((len = is.read(b)) != -1) {String str1 = new String(b,0,len);System.out.println(str1);}} catch (UnknownHostException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}finally {//5.关闭流if(is != null) {try {is.close();} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}}if(scanner != null) {scanner.close();}if(os != null) {try {os.close();} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}}if(socket != null) {try {socket.close();} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}}}}@Testpublic void server() {ServerSocket ss = null;Socket s = null;InputStream is = null;OutputStream os = null;try {ss = new ServerSocket(9090);s = ss.accept();//3.接收客户端信息is = s.getInputStream();byte[] b = new byte[10];int len;String str = new String();while((len = is.read(b)) != -1) {String str1 = new String(b,0,len);str += str1;}String strUpperCase = str.toUpperCase();//返回客户端信息os = s.getOutputStream();os.write(strUpperCase.getBytes());} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}finally {//关闭流if(os != null) {try {os.close();} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}}if(is != null) {try {is.close();} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}}if(s != null) {try {s.close();} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}}if(ss != null) {try {ss.close();} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}}}}
}

6.URL编程

  • 统一资源定位符,一个URL的对象,就对应着互联网上的一个资源
  • 可以通过URL的对象调用相应的方法,将此资源读取(“下载”)
  • 组成:<传输协议>://<主机号>:<端口号>/<文件名> 如:http://127.0.0.1:8080/index.html
    在这里插入图片描述

openStream()是将服务端的资源读取进来,如果希望输出数据,那就需要使用URLConnection
当需要与URL建立连接时,首先需要对象URL通过调用openConnection()生成的URLConnection对象,连接失败,将产生IOException异常

package com.end.java;      import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLConnection;//URL编程
public class TestURL {public static void main(String[] args) throws Exception {//1.创建URL对象URL url = new URL("http://127.0.0.1:8080//examples/index.html?about");//		//获取URL的协议名
//		System.out.println("协议名:" + url.getProtocol());
//		//获取URL的主机名
//		System.out.println("主机名:" + url.getHost());
//		//获取URL的端口号
//		System.out.println("端口号:" + url.getPort());
//		//获取URL的文件路径
//		System.out.println("文件路径:" + url.getPath());
//		//获取URL的文件名
//		System.out.println("文件名:" + url.getFile());
//		//获取URL的相对路径
//		System.out.println("文件相对路径:" + url.getRef());
//		//获取URL的查询名
//		System.out.println("查询名:" + url.getQuery());//将服务端的资源读取进来InputStream is = url.openStream();byte[] b = new byte[20];int len;while((len = is.read(b)) != -1) {String str = new String(b,0,len);System.out.println(str);}is.close();//既有数据的输入,又有数据的输出,考虑使用URLConnectionURLConnection urlConn = url.openConnection();InputStream is1 = urlConn.getInputStream();FileOutputStream fos = new FileOutputStream(new File("abc.txt"));byte[] b1 = new byte[20];int len1;while((len1 = is1.read(b1)) != -1) {fos.write(b1,0,len1);}fos.close();is.close();}
}

感谢大家的支持,关注,评论,点赞!
参考资料:
尚硅谷宋红康20天搞定Java基础下部

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

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

相关文章

Blender 之创建一个简单的笔筒

文章目录 成品图实现步骤 你是不是想创建一个笔筒捏&#xff1f; follow me! 成品图 实现步骤 先添加一个柱体 选中柱体&#xff0c;然后按tab 进入编辑模式 切换到面模式 &#xff08;可以按主键盘的 3 键&#xff09; 分别选中上下面&#xff0c;鼠标右键&#xff0c;选…

Spring Boot 3.0:构建下一代Java应用的新方法

文章目录 Spring Boot 3.0&#xff1a;一览1. **模块化应用程序**2. **更强大的自动化工具**3. **更强大的安全性**4. **更好的性能和扩展性** 如何开始使用Spring Boot 3.01. 安装Spring Boot CLI2. 创建新项目3. 配置应用程序4. 编写业务逻辑5. 测试应用程序6. 构建和部署 结…

2023-09-27 LeetCode每日一题(餐厅过滤器)

2023-09-27每日一题 一、题目编号 1333. 餐厅过滤器二、题目链接 点击跳转到题目位置 三、题目描述 给你一个餐馆信息数组 restaurants&#xff0c;其中 restaurants[i] [idi, ratingi, veganFriendlyi, pricei, distancei]。你必须使用以下三个过滤器来过滤这些餐馆信息…

window.print()打印及出现的问题

<template><transition name"el-zoom-in-center"><div class"JNPF-preview-main"><div class"JNPF-common-page-header"><el-page-header back"goBack" :content"打印通知书" /><div clas…

游戏创业小知识:游戏运营的步骤和流程

游戏运营是确保游戏在持续运行中保持活跃和成功的过程。以下是游戏运营的一般步骤流程&#xff1a; 1.游戏发布前准备 游戏选择&#xff1a;了解并熟悉游戏的核心概念、目标受众和游戏玩法。 开发团队&#xff1a;组建开发团队&#xff0c;包括程序员、设计师、艺术家和声音设…

Oracle物化视图(Materialized View)

与Oracle普通视图仅存储查询定义不同&#xff0c;物化视图&#xff08;Materialized View&#xff09;会将查询结果"物化"并保存下来&#xff0c;这意味着物化视图会消耗存储空间&#xff0c;物化的数据需要一定的刷新策略才能和基表同步&#xff0c;在使用和管理上比…

系统集成|第十二章(笔记)

目录 第十二章 沟通管理12.1 沟通的基本概念12.2 主要过程12.2.1 规划沟通管理12.2.2 管理沟通12.2.3 控制沟通 12.3 常见问题 上篇&#xff1a;第十一章、项目人力资源管理 下篇&#xff1a;第十三章、干系人管理 第十二章 沟通管理 沟通管理在项目计划、执行、监控过程中具有…

【性能测试】jmeter连接数据库jdbc

一、下载第三方工具包驱动数据库   1. 因为JMeter本身没有提供链接数据库的功能&#xff0c;所以我们需要借助第三方的工具包来实现。 &#xff08;有这个jar包之后&#xff0c;jmeter可以发起jdbc请求&#xff0c;没有这个jar包&#xff0c;也有jdbc取样器&#xff0c;但不能…

JavaScript中的代理对象(proxy)

聚沙成塔每天进步一点点 ⭐ 专栏简介⭐ 创建代理对象⭐ 使用代理对象⭐ 写在最后 ⭐ 专栏简介 前端入门之旅&#xff1a;探索Web开发的奇妙世界 欢迎来到前端入门之旅&#xff01;感兴趣的可以订阅本专栏哦&#xff01;这个专栏是为那些对Web开发感兴趣、刚刚踏入前端领域的朋友…

手机能搜到某个wifi,电脑搜不到解决方法(也许有用)

方法一&#xff1a;更新驱动 下载驱动大师、驱动精灵等等驱动软件&#xff0c;更新网卡驱动 方法二 按 win 键&#xff0c;打开菜单 搜索 查看网络连接&#xff08;win11版本是搜这个名字&#xff09; 点击打开是这样式的 然后对 WLAN右击->属性->配置->高级 这…

apifox怎么测试API,你学会了吗?

背景 由其他的team做的项目&#xff0c;配置到一个新的环境下。由于项目需要与别的公司的项目接连&#xff0c;所以需要创建公开的API接口&#xff0c;利用apifox来进行测试&#xff08;postman&#xff0c;jmeter都可以&#xff09;。此次利用apifox来创建测试API接口的测试 …

112. 路径总和

力扣题目链接(opens new window) 给定一个二叉树和一个目标和&#xff0c;判断该树中是否存在根节点到叶子节点的路径&#xff0c;这条路径上所有节点值相加等于目标和。 说明: 叶子节点是指没有子节点的节点。 示例: 给定如下二叉树&#xff0c;以及目标和 sum 22&#xf…

JS实现节流和防抖公共函数

一、防抖 原理&#xff1a;在事件被触发n秒后再执行回调&#xff0c;如果在这n秒内又被触发&#xff0c;则重新计时。 二、节流 原理&#xff1a;规定在一个单位时间内&#xff0c;只能触发一次函数&#xff0c;如果这个单位时间内触发多次函数&#xff0c;只有一次生效。

大数据分析就业班项目介绍

大数据分析就业班专业培养企业级刚需人才&#xff0c;拥有完善的独家的课程体系&#xff0c;采用项目式教学&#xff0c;专属导师全程伴学&#xff0c;最后帮助学生推荐就业。 大数据分析培训的适学人员包括&#xff1a; 1、大三大四应届学生 数学类、统计类、计算…

面试打底稿⑤ 项目一的第一部分

简历原文 抽查部分 项目描述 该项目旨在服务广州地区的快递物流&#xff0c;实现了下单、快递员取派件、订单转运单、线路规划、网点设置等功能。 责任描述 登录系统优化&#xff0c;双token三验证模式实现设置token状态、提高登录安全性的效果 模拟问答 1.能简单介绍一下…

skywalking源码本地编译运行经验总结

前言 最近工作原因在弄skywalking&#xff0c;为了进一步熟悉拉了代码下来准备debug&#xff0c;但是编译启动项目我就费了老大劲了&#xff0c;所以准备写这篇&#xff0c;帮兄弟们少踩点坑。 正确步骤 既然是用开源的东西&#xff0c;那么最好就是按照人家的方式使用&…

【C++杂货店】类和对象(上)

【C杂货店】类和对象&#xff08;上&#xff09; 一、面向过程和面向对象初步认识二、类的引入三、类的定义四、类的访问限定符及封装4.1 访问限定符4.2 封装 五、类的作用域六、类的实例化七、类对象模型7.1 类对象的存储规则7.2 例题7.3结构体内存对齐规则 八、this指针8.2 t…

知识分享 钡铼网关功能介绍:使用SSLTLS 加密,保证MQTT通信安全

背景 为了使不同的设备或系统能够相互通信&#xff0c;让旧有系统和新的系统可以集成&#xff0c;通信更加灵活和可靠。以及将数据从不同的来源收集并传输到不同的目的地&#xff0c;实现数据的集中管理和分发。 通信网关完美克服了这一难题&#xff0c;485或者网口的设备能通过…

【ACL2023】Event Extraction as Question Generation and Answering

论文题目&#xff1a;Event Extraction as Question Generation and Answering 论文来源&#xff1a;ACL2023 论文链接&#xff1a;Event Extraction as Question Generation and Answering - ACL Anthology 代码链接&#xff1a;GitHub - dataminr-ai/Event-Extraction-as-…

pycharm中恢复原始界面布局_常用快捷键_常用设置

文章目录 1 恢复默认布局1 .1直接点击file→Manage IDE Settings→Restore Default Settings&#xff08;如下图所示&#xff09;&#xff1a;1.2 直接点击Restore and Restart&#xff0c; 然后Pycharm就会自动重启&#xff0c;重启之后的界面就是最原始的界面了 2 改变主题2.…