606.IO流与网络编程-每天一考

说明流的三种方式
流向:输入流、输出流
数据单位:字节流、字符流
流的单位:节点流、处理流

写出4个IO流中抽象基类,4个文件流,4个缓冲流
抽象基类:InputStream、OutputStream、Reader、Writer
文件流:前面加File
缓冲流:前面加Buffer

字节流与字符流的区别与使用情境
字节流:read(byte[] buffer) / read() 非文本文件
字符流:read(char[] cbuf) / read() 文本文件

转换流是哪两个类,分别的作用是什么?请分别创建两个类的对象。
InputStreamReader:将输入的字节流转换为输入的字符流。 解码
OutputStreamWriter:将输出的字符流转换为输出的字节流。编码

607.IO流与网络编程-复习:IO流概述
608.IO流与网络编程-复习:节点流
609.IO流与网络编程-复习:缓冲流与转换流
610.IO流与网络编程-复习:其它几个处理流

611.IO流与网络编程-对象序列化机制的理解

  • ObjectInputStream和OjbectOutputSteam
    用于存储和读取基本数据类型数据或对象的处理流。它的强大之处就是可 以把Java中的对象写入到数据源中,也能把对象从数据源中还原回来。
  • 序列化:用ObjectOutputStream类保存基本类型数据或对象的机制
    反序列化:用ObjectInputStream类读取基本类型数据或对象的机制
  • ObjectOutputStream和ObjectInputStream不能序列化static和transient修饰的成员变量
  • 对象序列化机制允许把内存中的Java对象转换成平台无关的二进制流,从 而允许把这种二进制流持久地保存在磁盘上,或通过网络将这种二进制流传 输到另一个网络节点。//当其它程序获取了这种二进制流,就可以恢复成原 来的Java对象
  • 序列化的好处在于可将任何实现了Serializable接口的对象转化为字节数据, 使其在保存和传输时可被还原
  • 序列化是 RMI(Remote Method Invoke – 远程方法调用)过程的参数和返 回值都必须实现的机制,而 RMI 是 JavaEE 的基础。因此序列化机制是 JavaEE 平台的基础
    如果需要让某个对象支持序列化机制,则必须让对象所属的类及其属性是可 序列化的,为了让某个类是可序列化的,该类必须实现如下两个接口之一。 否则,会抛出NotSerializableException异常
    Serializable
    Externalizable

612.IO流与网络编程-对象序列化与反序列化字符串操作

import java.io.*;
/*** 对象流的使用* 1.ObjectInputStream 和 ObjectOutputStream* 2.作用:用于存储和读取基本数据类型数据或对象的处理流。它的强大之处就是可以把Java中的对象写入到数据源中,也能把对象从数据源中还原回来。** 3.要想一个java对象是可序列化的,需要满足相应的要求。见Person.java** 4.序列化机制:* 对象序列化机制允许把内存中的Java对象转换成平台无关的二进制流,从而允许把这种* 二进制流持久地保存在磁盘上,或通过网络将这种二进制流传输到另一个网络节点。* 当其它程序获取了这种二进制流,就可以恢复成原来的Java对象。*/
public class ObjectInputOutputStreamTest {/*序列化过程:将内存中的java对象保存到磁盘中或通过网络传输出去使用ObjectOutputStream实现*/@Testpublic void testObjectOutputStream(){ObjectOutputStream oos = null;try {//1.oos = new ObjectOutputStream(new FileOutputStream("object.dat"));//2.oos.writeObject(new String("我爱北京天安门"));oos.flush();//刷新操作oos.writeObject(new Person("王铭",23));oos.flush();oos.writeObject(new Person("张学良",23,1001,new Account(5000)));oos.flush();} catch (IOException e) {e.printStackTrace();} finally {if(oos != null){//3.try {oos.close();} catch (IOException e) {e.printStackTrace();}}}}/*反序列化:将磁盘文件中的对象还原为内存中的一个java对象使用ObjectInputStream来实现*/@Testpublic void testObjectInputStream(){ObjectInputStream ois = null;try {ois = new ObjectInputStream(new FileInputStream("object.dat"));Object obj = ois.readObject();String str = (String) obj;Person p = (Person) ois.readObject();Person p1 = (Person) ois.readObject();System.out.println(str);System.out.println(p);System.out.println(p1);} catch (IOException e) {e.printStackTrace();} catch (ClassNotFoundException e) {e.printStackTrace();} finally {if(ois != null){try {ois.close();} catch (IOException e) {e.printStackTrace();}}}}
}

613.IO流与网络编程-自定义实现序列化与反序列化操作

Person需要满足如下的要求,方可序列化

  1. 需要实现接口:Serializable
  2. 当前类提供一个全局常量:serialVersionUID
  3. 除了当前Person类需要实现Serializable接口之外,还必须保证其内部所有属性也必须是可序列化的。(默认情况下,基本数据类型可序列化)
  4. 补充:ObjectOutputStream和ObjectInputStream不能序列化static和transient修饰的成员变量

614.IO流与网络编程-seriaVersionUID的理解

  • 凡是实现Serializable接口的类都有一个表示序列化版本标识符的静态变量:
    private static final long serialVersionUID;
    serialVersionUID用来表明类的不同版本间的兼容性。简言之,其目的是以序列化对象 进行版本控制,有关各版本反序列化时是否兼容。
    如果类没有显示定义这个静态常量,它的值是Java运行时环境根据类的内部细节自 动生成的。若类的实例变量做了修改,serialVersionUID 可能发生变化。故建议, 显式声明。
  • 简单来说,Java的序列化机制是通过在运行时判断类的serialVersionUID来验 证版本一致性的。在进行反序列化时,JVM会把传来的字节流中的 serialVersionUID与本地相应实体类的serialVersionUID进行比较,如果相同 就认为是一致的,可以进行反序列化,否则就会出现序列化版本不一致的异常。(InvalidCastException)
  • 谈谈你对java.io.Serializable接口的理解,我们知道它用于序列化, 是空方法接口,还有其它认识吗?
  • 实现了Serializable接口的对象,可将它们转换成一系列字节,并可在以后 完全恢复回原来的样子。这一过程亦可通过网络进行。这意味着序列化机 制能自动补偿操作系统间的差异。换句话说,可以先在Windows机器上创 建一个对象,对其序列化,然后通过网络发给一台Unix机器,然后在那里 准确无误地重新“装配”。不必关心数据在不同机器上如何表示,也不必 关心字节的顺序或者其他任何细节。
  • 由于大部分作为参数的类如String、Integer等都实现了 java.io.Serializable的接口,也可以利用多态的性质,作为参数使接口更 灵活。

615.IO流与网络编程-自定义类可序列化的其它要求

616.IO流与网络编程-RandomAccessFile实现数据的读写操作

  • RandomAccessFile 声明在java.io包下,但直接继承于java.lang.Object类。并 且它实现了DataInput、DataOutput这两个接口,也就意味着这个类既可以读也 可以写。
  • RandomAccessFile 类支持 “随机访问” 的方式,程序可以直接跳到文件的任意地方来读、写文件
    支持只访问文件的部分内容
    可以向已存在的文件后追加内容
    RandomAccessFile 对象包含一个记录指针,用以标示当前读写处的位置。
  • RandomAccessFile 类对象可以自由移动记录指针:
    long getFilePointer():获取文件记录指针的当前位置
    void seek(long pos):将文件记录指针定位到 pos 位置
import java.io.File;
import java.io.IOException;
import java.io.RandomAccessFile;
/*** RandomAccessFile的使用* 1.RandomAccessFile直接继承于java.lang.Object类,实现了DataInput和DataOutput接口* 2.RandomAccessFile既可以作为一个输入流,又可以作为一个输出流** 3.如果RandomAccessFile作为输出流时,写出到的文件如果不存在,则在执行过程中自动创建。*   如果写出到的文件存在,则会对原有文件内容进行覆盖。(默认情况下,从头覆盖)** 4. 可以通过相关的操作,实现RandomAccessFile“插入”数据的效果*/
public class RandomAccessFileTest {@Testpublic void test1() {RandomAccessFile raf1 = null;RandomAccessFile raf2 = null;try {//1.raf1 = new RandomAccessFile(new File("爱情与友情.jpg"),"r");raf2 = new RandomAccessFile(new File("爱情与友情1.jpg"),"rw");//2.byte[] buffer = new byte[1024];int len;while((len = raf1.read(buffer)) != -1){raf2.write(buffer,0,len);}} catch (IOException e) {e.printStackTrace();} finally {//3.if(raf1 != null){try {raf1.close();} catch (IOException e) {e.printStackTrace();}}if(raf2 != null){try {raf2.close();} catch (IOException e) {e.printStackTrace();}}}}@Testpublic void test2() throws IOException {RandomAccessFile raf1 = new RandomAccessFile("hello.txt","rw");raf1.seek(3);//将指针调到角标为3的位置raf1.write("xyz".getBytes());//raf1.close();}
}

617.IO流与网络编程-RandomAccessFile实现数据的插入

/*使用RandomAccessFile实现数据的插入效果*/@Testpublic void test3() throws IOException {RandomAccessFile raf1 = new RandomAccessFile("hello.txt","rw");raf1.seek(3);//将指针调到角标为3的位置//保存指针3后面的所有数据到StringBuilder中StringBuilder builder = new StringBuilder((int) new File("hello.txt").length());byte[] buffer = new byte[20];int len;while((len = raf1.read(buffer)) != -1){builder.append(new String(buffer,0,len)) ;}//调回指针,写入“xyz”raf1.seek(3);raf1.write("xyz".getBytes());//将StringBuilder中的数据写入到文件中raf1.write(builder.toString().getBytes());raf1.close();//思考:将StringBuilder替换为ByteArrayOutputStream}

618.IO流与网络编程-NIO介绍及NIO2中Path、Paths、Files的介绍


NIO. 2
随着 JDK 7 的发布,Java对NIO进行了极大的扩展,增强了对文件处理和文件系统特性的支持,以至于我们称他们为 NIO.2。 因为 NIO 提供的一些功能,NIO已经成为文件处理中越来越重要 的部分。

  • Path 常用方法:
    String toString() : 返回调用 Path 对象的字符串表示形式
    boolean startsWith(String path) : 判断是否以 path 路径开始
    boolean endsWith(String path) : 判断是否以 path 路径结束
    boolean isAbsolute() : 判断是否是绝对路径
    Path getParent() :返回Path对象包含整个路径,不包含 Path 对象指定的文件路径
    Path getRoot() :返回调用 Path 对象的根路径
    Path getFileName() : 返回与调用 Path 对象关联的文件名
    int getNameCount() : 返回Path 根目录后面元素的数量
    Path getName(int idx) : 返回指定索引位置 idx 的路径名称
    Path toAbsolutePath() : 作为绝对路径返回调用 Path 对象
    Path resolve(Path p) :合并两个路径,返回合并后的路径对应的Path对象
    File toFile(): 将Path转化为File类的对象

  • Files 类
    java.nio.file.Files 用于操作文件或目录的工具类。
    Files常用方法:
    Path copy(Path src, Path dest, CopyOption … how) : 文件的复制
    Path createDirectory(Path path, FileAttribute<?> … attr) : 创建一个目录 Path createFile(Path path, FileAttribute<?> … arr) : 创建一个文件
    void delete(Path path) : 删除一个文件/目录,如果不存在,执行报错
    void deleteIfExists(Path path) : Path对应的文件/目录如果存在,执行删除
    Path move(Path src, Path dest, CopyOption…how) : 将 src 移动到 dest 位置
    long size(Path path) : 返回 path 指定文件的大小

  • Files常用方法:用于判断
    boolean exists(Path path, LinkOption … opts) : 判断文件是否存在
    boolean isDirectory(Path path, LinkOption … opts) : 判断是否是目录
    boolean isRegularFile(Path path, LinkOption … opts) : 判断是否是文件
    boolean isHidden(Path path) : 判断是否是隐藏文件
    boolean isReadable(Path path) : 判断文件是否可读
    boolean isWritable(Path path) : 判断文件是否可写
    boolean notExists(Path path, LinkOption … opts) : 判断文件是否不存在

  • Files常用方法:用于操作内容
    SeekableByteChannel newByteChannel(Path path, OpenOption…how) : 获取与指定文件的连 接,how 指定打开方式。
    DirectoryStream newDirectoryStream(Path path) : 打开 path 指定的目录
    InputStream newInputStream(Path path, OpenOption…how):获取 InputStream 对象
    OutputStream newOutputStream(Path path, OpenOption…how) : 获取 OutputStream 对象

619.IO流与网络编程-使用第三方jar包实现数据读写

导入jar包
D:\学习\尚硅谷\1.JavaSE\课件\尚硅谷_宋红康_第13章_IO流\apache-common包\commons-io-2.5\commons-io-2.5.jar

620.IO流与网络编程-网络编程概述

Java提供的网络类库,可以实现无痛的网络连接,联网的底层 细节被隐藏在 Java 的本机安装系统里,由 JVM 进行控制。并且 Java 实现了一个跨平台的网络库,程序员面对的是一个统一的网络编程环境。

网络编程的目的:直接或间接地通过网络协议与其它计算机实现数据交换,进行通讯。
网络编程中有两个主要的问题
如何准确地定位网络上一台或多台主机;定位主机上的特定的应用
找到主机后如何可靠高效地进行数据传输

通信双方地址:IP、端口号
一定的规则(即:网络通信协议。有两套参考模型)
OSI参考模型:模型过于理想化,未能在因特网上进行广泛推广
TCP/IP参考模型(或TCP/IP协议):事实上的国际标准。

621.IO流与网络编程-IP理解与InetAddress类的实例化

IP 地址:InetAddress

  • 唯一的标识 Internet 上的计算机(通信实体)
  • 本地回环地址(hostAddress):127.0.0.1 主机名(hostName):localhost
  • IP地址分类方式1:IPV4 和 IPV6
    IPV4:4个字节组成,4个0-255。大概42亿,30亿都在北美,亚洲4亿。2011年初已经用尽。以点分十进制表示,如192.168.0.1
    IPV6:128位(16个字节),写成8个无符号整数,每个整数用四个十六进制位表示, 数之间用冒号(:)分开,如:3ffe:3201:1401:1280:c8ff:fe4d:db39:1984
  • IP地址分类方式2:公网地址(万维网使用)和私有地址(局域网使用)。192.168. 开头的就是私有址址,范围即为192.168.0.0–192.168.255.255,专门为组织机 构内部使用
  • 特点:不易记忆
import java.net.InetAddress;
import java.net.UnknownHostException;
/*** 一、网络编程中有两个主要的问题:* 1.如何准确地定位网络上一台或多台主机;定位主机上的特定的应用* 2.找到主机后如何可靠高效地进行数据传输** 二、网络编程中的两个要素:* 1.对应问题一:IP和端口号* 2.对应问题二:提供网络通信协议:TCP/IP参考模型(应用层、传输层、网络层、物理+数据链路层)** 三、通信要素一:IP和端口号** 1. IP:唯一的标识 Internet 上的计算机(通信实体)* 2. 在Java中使用InetAddress类代表IP* 3. IP分类:IPv4 和 IPv6 ; 万维网 和 局域网* 4. 域名:   www.baidu.com   www.mi.com  www.sina.com  www.jd.com*            www.vip.com* 5. 本地回路地址:127.0.0.1 对应着:localhost** 6. 如何实例化InetAddress:两个方法:getByName(String host) 、 getLocalHost()*        两个常用方法:getHostName() / getHostAddress()** 7. 端口号:正在计算机上运行的进程。* 要求:不同的进程有不同的端口号* 范围:被规定为一个 16 位的整数 0~65535。** 8. 端口号与IP地址的组合得出一个网络套接字:Socket* @author shkstart* @create 2019 下午 2:30*/
public class InetAddressTest {public static void main(String[] args) {try {//File file = new File("hello.txt");InetAddress inet1 = InetAddress.getByName("192.168.10.14");System.out.println(inet1);InetAddress inet2 = InetAddress.getByName("www.atguigu.com");System.out.println(inet2);InetAddress inet3 = InetAddress.getByName("127.0.0.1");System.out.println(inet3);//获取本地ipInetAddress inet4 = InetAddress.getLocalHost();System.out.println(inet4);//getHostName()System.out.println(inet2.getHostName());//getHostAddress()System.out.println(inet2.getHostAddress());} catch (UnknownHostException e) {e.printStackTrace();}}
}

622.IO流与网络编程-端口号的理解

端口号标识正在计算机上运行的进程(程序)

  • 不同的进程有不同的端口号
  • 被规定为一个 16 位的整数 0~65535。
  • 端口分类:
    公认端口:0~1023。被预先定义的服务通信占用(如:HTTP占用端口80,FTP占用端口21,Telnet占用端口23)
    注册端口:1024~49151。分配给用户进程或应用程序。(如:Tomcat占用端口8080,MySQL占用端口3306,Oracle占用端口1521等)。
    动态/私有端口:49152~65535。
  • 端口号与IP地址的组合得出一个网络套接字:Socket。

623.IO流与网络编程-TCP和UDP网络通讯协议对比

  • 网络通信协议
    计算机网络中实现通信必须有一些约定,即通信协议,对速率、传输代码、代码结构、传输控制步骤、出错控制等制定标准。
  • 问题:网络协议太复杂
    计算机网络通信涉及内容很多,比如指定源地址和目标地址,加密解密,压缩解压缩,差错控制,流量控制,路由控制,如何实现如此复杂的网络协议呢?
  • 通信协议分层的思想
    在制定协议时,把复杂成份分解成一些简单的成份,再将它们复合起来。最常用的复合方式是层次方式,即同层间可以通信、上一层可以调用下一层,而与再下一层不发生关系。各层互不影响,利于系统的开发和扩展。
  • 传输层协议中有两个非常重要的协议:
    传输控制协议TCP(Transmission Control Protocol)
    用户数据报协议UDP(User Datagram Protocol)。
  • TCP/IP 以其两个主要协议:传输控制协议(TCP)和网络互联协议(IP)而得名,实际上是一组协议,包括多个具有不同功能且互为关联的协议。
  • IP(Internet Protocol)协议是网络层的主要协议,支持网间互连的数据通信。
  • TCP/IP协议模型从更实用的角度出发,形成了高效的四层体系结构,即物理链路层、IP层、传输层和应用层。

TCP协议:

  • 使用TCP协议前,须先建立TCP连接,形成传输数据通道
  • 传输前,采用“三次握手”方式,点对点通信,是可靠的
  • TCP协议进行通信的两个应用进程:客户端、服务端。
  • 在连接中可进行大数据量的传输
  • 传输完毕,需释放已建立的连接,效率低
  • 生活案例:打电话

UDP协议:

  • 将数据、源、目的封装成数据包,不需要建立连接
  • 每个数据报的大小限制在64K内
  • 发送不管对方是否准备好,接收方收到也不确认,故是不可靠的
  • 可以广播发送
  • 发送数据结束时无需释放资源,开销小,速度快
  • 生活案例:发短信、发电报

624.IO流与网络编程-TCP网络编程例题1

import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.InetAddress;
import java.net.ServerSocket;
import java.net.Socket;
/*** 实现TCP的网络编程* 例子1:客户端发送信息给服务端,服务端将数据显示在控制台上*/
public class TCPTest1 {//客户端@Testpublic void client()  {Socket socket = null;OutputStream os = null;try {//1.创建Socket对象,指明服务器端的ip和端口号InetAddress inet = InetAddress.getByName("192.168.14.100");socket = new Socket(inet,8899);//2.获取一个输出流,用于输出数据os = socket.getOutputStream();//3.写出数据的操作os.write("你好,我是客户端mm".getBytes());} catch (IOException e) {e.printStackTrace();} finally {//4.资源的关闭if(os != null){try {os.close();} catch (IOException e) {e.printStackTrace();}}if(socket != null){try {socket.close();} catch (IOException e) {e.printStackTrace();}}}}//服务端@Testpublic void server()  {ServerSocket ss = null;Socket socket = null;InputStream is = null;ByteArrayOutputStream baos = null;try {//1.创建服务器端的ServerSocket,指明自己的端口号ss = new ServerSocket(8899);//2.调用accept()表示接收来自于客户端的socketsocket = ss.accept();//3.获取输入流is = socket.getInputStream();//不建议这样写,可能会有乱码
//        byte[] buffer = new byte[1024];
//        int len;
//        while((len = is.read(buffer)) != -1){//            String str = new String(buffer,0,len);
//            System.out.print(str);
//        }//4.读取输入流中的数据baos = new ByteArrayOutputStream();byte[] buffer = new byte[5];int len;while((len = is.read(buffer)) != -1){baos.write(buffer,0,len);}System.out.println(baos.toString());System.out.println("收到了来自于:" + socket.getInetAddress().getHostAddress() + "的数据");} catch (IOException e) {e.printStackTrace();} finally {if(baos != null){//5.关闭资源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(ss != null){try {ss.close();} catch (IOException e) {e.printStackTrace();}}}}
}

625.IO流与网络编程-TCP网络编程例题2

import java.io.*;
import java.net.InetAddress;
import java.net.ServerSocket;
import java.net.Socket;
/*** 实现TCP的网络编程* 例题2:客户端发送文件给服务端,服务端将文件保存在本地。*/
public class TCPTest2 {/*这里涉及到的异常,应该使用try-catch-finally处理*/@Testpublic void client() throws IOException {//1.Socket socket = new Socket(InetAddress.getByName("127.0.0.1"),9090);//2.OutputStream os = socket.getOutputStream();//3.FileInputStream fis = new FileInputStream(new File("beauty.jpg"));//4.byte[] buffer = new byte[1024];int len;while((len = fis.read(buffer)) != -1){os.write(buffer,0,len);}//5.fis.close();os.close();socket.close();}/*这里涉及到的异常,应该使用try-catch-finally处理*/@Testpublic void server() throws IOException {//1.ServerSocket ss = new ServerSocket(9090);//2.Socket socket = ss.accept();//3.InputStream is = socket.getInputStream();//4.FileOutputStream fos = new FileOutputStream(new File("beauty1.jpg"));//5.byte[] buffer = new byte[1024];int len;while((len = is.read(buffer)) != -1){fos.write(buffer,0,len);}//6.fos.close();is.close();socket.close();ss.close();}
}

626.IO流与网络编程-TCP网络编程例题3

import java.io.*;
import java.net.InetAddress;
import java.net.ServerSocket;
import java.net.Socket;
/*** 实现TCP的网络编程* 例题3:从客户端发送文件给服务端,服务端保存到本地。并返回“发送成功”给客户端。* 并关闭相应的连接。*/
public class TCPTest3 {/*这里涉及到的异常,应该使用try-catch-finally处理*/@Testpublic void client() throws IOException {//1.Socket socket = new Socket(InetAddress.getByName("127.0.0.1"),9090);//2.OutputStream os = socket.getOutputStream();//3.FileInputStream fis = new FileInputStream(new File("beauty.jpg"));//4.byte[] buffer = new byte[1024];int len;while((len = fis.read(buffer)) != -1){os.write(buffer,0,len);}//关闭数据的输出socket.shutdownOutput();//5.接收来自于服务器端的数据,并显示到控制台上InputStream is = socket.getInputStream();ByteArrayOutputStream baos = new ByteArrayOutputStream();byte[] bufferr = new byte[20];int len1;while((len1 = is.read(buffer)) != -1){baos.write(buffer,0,len1);}System.out.println(baos.toString());//6.fis.close();os.close();socket.close();baos.close();}/*这里涉及到的异常,应该使用try-catch-finally处理*/@Testpublic void server() throws IOException {//1.ServerSocket ss = new ServerSocket(9090);//2.Socket socket = ss.accept();//3.InputStream is = socket.getInputStream();//4.FileOutputStream fos = new FileOutputStream(new File("beauty2.jpg"));//5.byte[] buffer = new byte[1024];int len;while((len = is.read(buffer)) != -1){fos.write(buffer,0,len);}System.out.println("图片传输完成");//6.服务器端给予客户端反馈OutputStream os = socket.getOutputStream();os.write("你好,美女,照片我已收到,非常漂亮!".getBytes());//7.fos.close();is.close();socket.close();ss.close();os.close();}
}

627.IO流与网络编程-浏览器访问Tomcat服务器资源操作

628.IO流与网络编程-UDP网络编程举例

  • 类 DatagramSocket 和 DatagramPacket 实现了基于 UDP 协议网络程序。
  • UDP数据报通过数据报套接字 DatagramSocket 发送和接收,系统不保证UDP数据报一定能够安全送到目的地,也不能确定什么时候可以抵达。
  • DatagramPacket 对象封装了UDP数据报,在数据报中包含了发送端的IP 地址和端口号以及接收端的IP地址和端口号。
  • UDP协议中每个数据报都给出了完整的地址信息,因此无须建立发送方和 接收方的连接。如同发快递包裹一样。
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
/*** UDPd协议的网络编程*/
public class UDPTest {//发送端@Testpublic void sender() throws IOException {DatagramSocket socket = new DatagramSocket();String str = "我是UDP方式发送的导弹";byte[] data = str.getBytes();//转化为字节数组InetAddress inet = InetAddress.getLocalHost();DatagramPacket packet = new DatagramPacket(data,0,data.length,inet,9090);socket.send(packet);socket.close();}//接收端@Testpublic void receiver() throws IOException {DatagramSocket socket = new DatagramSocket(9090);byte[] buffer = new byte[100];DatagramPacket packet = new DatagramPacket(buffer,0,buffer.length);socket.receive(packet);System.out.println(new String(packet.getData(),0,packet.getLength()));socket.close();}
}

629.IO流与网络编程-URL类的理解与实例化

  • URL(Uniform Resource Locator):统一资源定位符,它表示 Internet 上某一资源的地址。

  • 它是一种具体的URI,即URL可以用来标识一个资源,而且还指明了如何locate这个资源。

  • 通过 URL 我们可以访问 Internet 上的各种网络资源,比如最常见的 www,ftp站点。浏览器通过解析给定的 URL 可以在网络上查找相应的文件或其他资源。

  • URL的基本结构由5部分组成:
    <传输协议>://<主机名>:<端口号>/<文件名>#片段名?参数列表
    例 如 : http://192.168.1.100:8080/helloworld/index.jsp#a?username=shkstart&password=123
    #片段名:即锚点,例如看小说,直接定位到章节
    参数列表格式:参数名=参数值&参数名=参数值…

一个URL对象生成后,其属性是不能被改变的,但可以通过它给定的 方法来获取这些属性:
public String getProtocol( )获取该URL的协议名
public String getHost( )获取该URL的主机名
public String getPort( )获取该URL的端口号
public String getPath( )获取该URL的文件路径
public String getFile( )获取该URL的文件名
public String getQuery( )获取该URL的查询名

import java.net.MalformedURLException;
import java.net.URL;
/*** URL网络编程* 1.URL:统一资源定位符,对应着互联网的某一资源地址* 2.格式:*  http://localhost:8080/examples/beauty.jpg?username=Tom*  协议   主机名    端口号  资源地址           参数列表*/
public class URLTest {public static void main(String[] args) {try {URL url = new URL("http://localhost:8080/examples/beauty.jpg?username=Tom");
//            public String getProtocol(  )     获取该URL的协议名System.out.println(url.getProtocol());
//            public String getHost(  )           获取该URL的主机名System.out.println(url.getHost());
//            public String getPort(  )            获取该URL的端口号System.out.println(url.getPort());
//            public String getPath(  )           获取该URL的文件路径System.out.println(url.getPath());
//            public String getFile(  )             获取该URL的文件名System.out.println(url.getFile());
//            public String getQuery(   )        获取该URL的查询名System.out.println(url.getQuery());} catch (MalformedURLException e) {e.printStackTrace();}}
}

630.IO流与网络编程-URL网络编程实现Tomcat服务端数据下载

import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.URL;
public class URLTest1 {public static void main(String[] args) {HttpURLConnection urlConnection = null;InputStream is = null;FileOutputStream fos = null;try {URL url = new URL("http://localhost:8080/examples/beauty.jpg");urlConnection = (HttpURLConnection) url.openConnection();urlConnection.connect();//获取连接is = urlConnection.getInputStream();fos = new FileOutputStream("day10\\beauty3.jpg");byte[] buffer = new byte[1024];int len;while((len = is.read(buffer)) != -1){fos.write(buffer,0,len);}System.out.println("下载完成");} catch (IOException e) {e.printStackTrace();} finally {//关闭资源if(is != null){try {is.close();} catch (IOException e) {e.printStackTrace();}}if(fos != null){try {fos.close();} catch (IOException e) {e.printStackTrace();}}if(urlConnection != null){urlConnection.disconnect();}}}
}

【JavaSE】网络编程(606~630)相关推荐

  1. JavaSE——网络编程

    文章目录 网络通信三要素 要素一.IP地址 IP地址操作类-InetAddress 要素二.端口号 要素三.协议 UDP通信 快速入门 UDP通信:多发多收 UDP通信-广播.组播 TCP通信-快速入 ...

  2. [javaSE] 网络编程(URLConnection)

    获取URL对象,new出来,构造参数:String的路径 调用URL对象的openConnection()方法,获取URLConnection对象 调用URLConnection对象的getInput ...

  3. [javaSE] 网络编程(浏览器客户端-自定义服务端)

    获取ServerSocket对象,new出来构造参数:int类型端口号 调用ServerSocket对象的accept()方法,得到Socket对象 获取PrintWriter对象,new出来,构造参 ...

  4. 【JavaSe】网络编程篇(一) 网络编程入门

    JavaSe·网络编程篇(一) 网络编程入门 1. 软件结构 C/S结构:全称为Client/Server结构,是指客户端和服务器结构.常见程序有QQ.百度网盘等软件 B/S结构 :全称为Browse ...

  5. JavaSE:网络编程

    JavaSE:网络编程 文章目录 前言 一.网络编程概述 二.网络通信的要素 三.IP 四.端口 五.通信协议 六.TCP 1. 发送接收消息 2. 文件上传 3. 初识Tomcat 七.UDP 1. ...

  6. JavaSE高级 网络编程

    JavaSE高级 网络编程 教学目标 能够辨别UDP和TCP协议特点 UDP 无连接,基于数据包,发出去就不管了,性能好,可能丢失数据. TCP有连接,基于通信管道,可靠传输. 能够说出TCP协议下两 ...

  7. 【JavaSE】之网络编程

    [JavaSE]网络编程 前言 一.计算机网络概述 二.网络通信的要素 三.IP地址 四.端口 五.通信协议 六.TCP 1.客户端与服务器通信示例 2.文件上传示例 七.UDP 1.发送消息 2.循 ...

  8. JavaSE——基础知识回顾18之网络编程部分

    文章目录 文章目录 文章目录 前言 一.什么是网络编程 (1)计算机网络 (2)网络编程 (3) 网络三要素与三大协议 3.1网络三要素 3.2网络三大协议 (3)套接字"Socket&qu ...

  9. 【JavaSE】网络编程 Jpcap的使用

    [JavaSE]网络编程 Jpcap的使用 前言:由于之前课程需要做个网络课程设计,题目是IP数据包的捕获与解析,考虑再三之后选择用Java来做(主要是因为Java界面比较好写,个人这么觉得),于是在 ...

最新文章

  1. 转:MySQL性能优化的最佳20+条经验
  2. ElementUI中el-upload怎样上传文件并且传递额外参数给Springboot后台进行接收
  3. Excel制作图表的方法
  4. C语言获取链表的中间值Middle of the Linked List(附完整源码)
  5. java分享第十七天-01(封装操作xml类)
  6. java类型之间的转换_JAVA基本数据类型及之间的转换
  7. 0918类对象重载,作业2
  8. Shell工具 cut sed awk sort
  9. C/C++的memset函数的说明和使用
  10. 姓名计算机编码,姓名代码
  11. linux c Make file 的生成
  12. 怎样建设智慧公厕综合信息管理系统?如何让智慧公厕实现综合信息管理功能?@中期科技ZONTREE智慧厕所
  13. MySQL数据库应用与开发答案_MySQL数据库应用与开发习题解答与上机指导
  14. 超级课程表显示服务器出错,不得不说,超级课程表正在流失大学生用户——一位超级课程表粉丝的自白...
  15. 【Linux】动态防火墙,实现对攻击IP的动态拦截,一定程度上解决云服务器主机经常被境外IP尝试登录,屏蔽指定地区、国家的IP连接
  16. 计算机缓存设置方法,如何清除电脑缓存?清除电脑缓存方法介绍
  17. 本地启动本地mysql_通过本地化启动并运行
  18. OpenGL视角LooAt及Perspective理解
  19. 【逻辑题】头花是什么颜色
  20. ES迁移到OpenSearch

热门文章

  1. 这次一定弄懂完全图、连通图、连通分量、强连通图、强连通分量、极大连通分量、极小联通分量、生成树、生成森林的区别
  2. 交通分配(MSA_DAIL算法)
  3. 机智云助力中国电信上线物联网开放平台白色家电行业使能套件
  4. 1vrms等于多少伏
  5. hydra.php,Hydra MES
  6. SUST OJ 1641: 电子狗的心事
  7. FZU1901 Period II
  8. MATLAB | 面积图、饼状图、水平柱状图的斜线填充(阴影填充)
  9. 解决 “已有打开的与此 Command 相关联的 DataReader,必须首先将它关闭”
  10. 参加“全球敏捷运维峰会(北京站)”有感