【JavaSE】网络编程(606~630)
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需要满足如下的要求,方可序列化
- 需要实现接口:Serializable
- 当前类提供一个全局常量:serialVersionUID
- 除了当前Person类需要实现Serializable接口之外,还必须保证其内部所有属性也必须是可序列化的。(默认情况下,基本数据类型可序列化)
- 补充: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)相关推荐
- JavaSE——网络编程
文章目录 网络通信三要素 要素一.IP地址 IP地址操作类-InetAddress 要素二.端口号 要素三.协议 UDP通信 快速入门 UDP通信:多发多收 UDP通信-广播.组播 TCP通信-快速入 ...
- [javaSE] 网络编程(URLConnection)
获取URL对象,new出来,构造参数:String的路径 调用URL对象的openConnection()方法,获取URLConnection对象 调用URLConnection对象的getInput ...
- [javaSE] 网络编程(浏览器客户端-自定义服务端)
获取ServerSocket对象,new出来构造参数:int类型端口号 调用ServerSocket对象的accept()方法,得到Socket对象 获取PrintWriter对象,new出来,构造参 ...
- 【JavaSe】网络编程篇(一) 网络编程入门
JavaSe·网络编程篇(一) 网络编程入门 1. 软件结构 C/S结构:全称为Client/Server结构,是指客户端和服务器结构.常见程序有QQ.百度网盘等软件 B/S结构 :全称为Browse ...
- JavaSE:网络编程
JavaSE:网络编程 文章目录 前言 一.网络编程概述 二.网络通信的要素 三.IP 四.端口 五.通信协议 六.TCP 1. 发送接收消息 2. 文件上传 3. 初识Tomcat 七.UDP 1. ...
- JavaSE高级 网络编程
JavaSE高级 网络编程 教学目标 能够辨别UDP和TCP协议特点 UDP 无连接,基于数据包,发出去就不管了,性能好,可能丢失数据. TCP有连接,基于通信管道,可靠传输. 能够说出TCP协议下两 ...
- 【JavaSE】之网络编程
[JavaSE]网络编程 前言 一.计算机网络概述 二.网络通信的要素 三.IP地址 四.端口 五.通信协议 六.TCP 1.客户端与服务器通信示例 2.文件上传示例 七.UDP 1.发送消息 2.循 ...
- JavaSE——基础知识回顾18之网络编程部分
文章目录 文章目录 文章目录 前言 一.什么是网络编程 (1)计算机网络 (2)网络编程 (3) 网络三要素与三大协议 3.1网络三要素 3.2网络三大协议 (3)套接字"Socket&qu ...
- 【JavaSE】网络编程 Jpcap的使用
[JavaSE]网络编程 Jpcap的使用 前言:由于之前课程需要做个网络课程设计,题目是IP数据包的捕获与解析,考虑再三之后选择用Java来做(主要是因为Java界面比较好写,个人这么觉得),于是在 ...
最新文章
- 转:MySQL性能优化的最佳20+条经验
- ElementUI中el-upload怎样上传文件并且传递额外参数给Springboot后台进行接收
- Excel制作图表的方法
- C语言获取链表的中间值Middle of the Linked List(附完整源码)
- java分享第十七天-01(封装操作xml类)
- java类型之间的转换_JAVA基本数据类型及之间的转换
- 0918类对象重载,作业2
- Shell工具 cut sed awk sort
- C/C++的memset函数的说明和使用
- 姓名计算机编码,姓名代码
- linux c Make file 的生成
- 怎样建设智慧公厕综合信息管理系统?如何让智慧公厕实现综合信息管理功能?@中期科技ZONTREE智慧厕所
- MySQL数据库应用与开发答案_MySQL数据库应用与开发习题解答与上机指导
- 超级课程表显示服务器出错,不得不说,超级课程表正在流失大学生用户——一位超级课程表粉丝的自白...
- 【Linux】动态防火墙,实现对攻击IP的动态拦截,一定程度上解决云服务器主机经常被境外IP尝试登录,屏蔽指定地区、国家的IP连接
- 计算机缓存设置方法,如何清除电脑缓存?清除电脑缓存方法介绍
- 本地启动本地mysql_通过本地化启动并运行
- OpenGL视角LooAt及Perspective理解
- 【逻辑题】头花是什么颜色
- ES迁移到OpenSearch
热门文章
- 这次一定弄懂完全图、连通图、连通分量、强连通图、强连通分量、极大连通分量、极小联通分量、生成树、生成森林的区别
- 交通分配(MSA_DAIL算法)
- 机智云助力中国电信上线物联网开放平台白色家电行业使能套件
- 1vrms等于多少伏
- hydra.php,Hydra MES
- SUST OJ 1641: 电子狗的心事
- FZU1901 Period II
- MATLAB | 面积图、饼状图、水平柱状图的斜线填充(阴影填充)
- 解决 “已有打开的与此 Command 相关联的 DataReader,必须首先将它关闭”
- 参加“全球敏捷运维峰会(北京站)”有感