Java学习Day25(对象流,网络编程)
对象流
package atguigu.java; import org.junit.Test; import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapters; import java.io.*; /** * 对象流的使用 * 1.ObjectInputStream和ObjectOutputStream * 2.作用:用于存储和读取基本数据类型数据或对象的处理流。它的强大之处就是可 * 以把Java中的对象写入到数据源中,也能把对象从数据源中还原回来。 * 3.要想一个java对象是可序列化的要求: * 3.1 需要实现接口:Serializable * 3.2 当前类提供一个全局常量:serialVersionUID * 3.3 除了当前Person类需要实现Serializable接口之外,还必须保证其内部所有属性可序列化(默认情况下基本数据类型可序列化) * * 补充:static和transient修饰的成员不能序列化 * * * @author xq * @create 2021-01-04-10:25 */ public class ObjectInputOutputStreamTest { /* 序列化过程:将内存中的java对象保存到磁盘中或通过网络传输出去 使用ObjectOutputStream实现 */ @Test public void testObjectOutputStream(){ ObjectOutputStream oos = null; try { oos = new ObjectOutputStream(new FileOutputStream("object.dat")); oos.writeObject(new String("我爱南京")); oos.flush();//刷新操作 } catch (IOException e) { e.printStackTrace(); } finally { if(oos != null) try { oos.close(); } catch (IOException e) { e.printStackTrace(); } } } /* 反序列化:将磁盘文件中的对象还原为内存中的一个java对象 使用ObjectInputStream */ @Test public void testObjectInputStream(){ ObjectInputStream ois = null; try { ois = new ObjectInputStream(new FileInputStream("object.dat")); Object obj = ois.readObject(); String str = (String) obj; System.out.println(str); } catch (IOException e) { e.printStackTrace(); } catch (ClassNotFoundException e) { e.printStackTrace(); } finally { try { ois.close(); } catch (IOException e) { e.printStackTrace(); } } } }
13.10 随机存取文件流(RandomAccessFile类)
package atguigu.java; import org.junit.Test; import java.io.File; import java.io.FileNotFoundException; import java.io.IOException; import java.io.RandomAccessFile; import java.nio.charset.StandardCharsets; /** * RandomAccessFile的使用 * 1.直接继承于java.lang.Object类,实现了DataInput和DataOutput接口 * 2.既可以作为一个输入流,又可以作为一个输出流 * * 3.如果RandomAccessFile作为输出流时,写出到的文件如果不存在,则在执行过程中自动创建 * 如果写出到的文件存在,则会对原有文件内容进行覆盖。(默认情况下,从头覆盖) * * 4.可以通过相关的操作,实现RandomAccessFile"插入"数据的效果 * @author xq * @create 2021-01-04-11:07 */ public class RandomAccessFileTest { @Test public void test1() throws FileNotFoundException { RandomAccessFile raf1 = null; RandomAccessFile raf2 = null; try { raf1 = new RandomAccessFile(new File("object.dat"),"r"); raf2 = new RandomAccessFile(new File("object1.dat"),"rw"); byte[] buffer = new byte[1024]; int len; while ((len = raf1.read(buffer)) != -1){ raf2.write(buffer,0,len); } } catch (IOException e) { e.printStackTrace(); } finally { if(raf1 != null) { try { raf1.close(); } catch (IOException e) { e.printStackTrace(); } } if(raf2 != null) { try { raf2.close(); } catch (IOException e) { e.printStackTrace(); } } } } @Test public void test2() throws IOException { RandomAccessFile raf1 = new RandomAccessFile("hello.txt", "rw"); raf1.seek(3);//将指针调到角标为3的位置 raf1.write("xyz".getBytes()); raf1.close(); } /* 使用RandomAccessFile实现数据的插入效果 */ @Test public void test3() throws IOException { RandomAccessFile raf1 = new RandomAccessFile("hello.txt", "rw"); raf1.seek(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(); } }
13.11 NIO.2中Path、paths、Files类的使用
- Java NIO (New IO,Non-Blocking IO)是从Java 1.4版本开始引入的一套新的IO API,可以替代标准的Java IO API。NIO与原来的IO有同样的作用和目的,但是使用的方式完全不同,NIO支持面向缓冲区的(IO是面向流的)、基于通道的IO操作。NIO将以更加高效的方式进行文件的读写操作。
- Java API中提供了两套NIO,一套是针对标准输入输出NIO,另一套就是网
络编程NIO。
java.nio.channels.Channel
- FileChannel:处理本地文件
- SocketChannel:TCP网络编程的客户端的Channel
- ServerSocketChannel:TCP网络编程的服务器端的Channel
- DatagramChannel:UDP网络编程中发送端和接收端的Channel
第十四章 网络编程
14.1 网络编程概述
- Java是 Internet 上的语言,它从语言级上提供了对网络应用程序的支持,程序员能够很容易开发常见的网络应用程序。
- Java提供的网络类库,可以实现无痛的网络连接,联网的底层细节被隐藏在 Java 的本机安装系统里,由 JVM 进行控制。并且Java 实现了一个跨平台的网络库,程序员面对的是一个统一的网络编程环境。
14.2 网络通信要素概述
一、网络编程中有两个主要的问题:
1.如何准确地定位网络上一台或多台主机;定位主机上特定的应用
2.找到主机后如何可靠高效进行数据传输
二、网络编程中的两个要素:
1.对应问题一:IP和端口号
2.对应问题二:提供网络通信协议:TCP/IP参考模型(应用层、传输层、网络层、物理+数据链路层)
14.3 通信要素1:IP和端口号
通信要素一:IP和端口号
1.IP:唯一的标识 Internet 上的计算机(通信实体)
2.在Java中使用InetAddress类代表IP
3.IP分类:IPv4和IPv6;万维网和局域网
4.域名 www.baidu.com www.mi.com
5.本地回路地址:127.0.0.1 对应着:localhost
6.如何实例化InetAddress:两个方法:getByName(String host)、getLocalHost()
两个常用方法:getHostName() / getHostAddress()
7.端口号:正在计算机上运行的进程
要求:不同的进程有不同的端口号
范围:被规定为一个16位的整数0~65535
8.端口号和IP地址的组合得出一个网络套接字:Socket
14.4 通信要素2:网络协议
TCP协议:
- 使用TCP协议前,须先建立TCP连接,形成传输数据通道
- 传输前,采用“三次握手”方式,点对点通信,是可靠的
- TCP协议进行通信的两个应用进程:客户端、服务端。
- 在连接中可进行大数据量的传输
- 传输完毕,需释放已建立的连接,效率低
UDP协议:
- 将数据、源、目的封装成数据包,不需要建立连接
- 每个数据报的大小限制在64K内
- 发送不管对方是否准备好,接收方收到也不确认,故是不可靠的
- 可以广播发送
- 发送数据结束时无需释放资源,开销小,速度快
14.5 TCP网络编程
例题1
package atguigu.java; import org.junit.Test; 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:客户端发送信息给服务端,服务端将数据显示在控制台上 * * @author xq * @create 2021-01-04-14:46 */ public class TCPTest1 { //客户端 @Test public void client(){ Socket socket = null; OutputStream os = null; try { //1.创建Socket对象,指明服务器端的ip和端口号 InetAddress inet = InetAddress.getByName("127.0.0.1"); socket = new Socket(inet,8899); //2.获取一个输出流,用于输出数据 os = socket.getOutputStream(); //3.写出数据的操作 os.write("你好,我是客户端".getBytes()); } catch (IOException e) { e.printStackTrace(); } finally { //资源的关闭 try { if(os != null) os.close(); } catch (IOException e) { e.printStackTrace(); } try { if(socket != null) socket.close(); } catch (IOException e) { e.printStackTrace(); } } } //服务端 @Test public void server(){ ServerSocket ss = null; Socket socket = null; InputStream is = null; ByteArrayOutputStream baos = null; try { //1.创建服务器端的ServerSocket,指明自己的端口号 ss = new ServerSocket(8899); //2.调用accept()表示接受来自于客户端的socket socket = ss.accept(); //3.获取输入流 is = socket.getInputStream(); //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()); } catch (IOException e) { e.printStackTrace(); } finally { //5.资源的关闭 if(baos != null) 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(); } } } }
例题2
package atguigu.java; import org.junit.Test; import java.io.*; import java.net.InetAddress; import java.net.ServerSocket; import java.net.Socket; /** * * 实现TCP网络编程 * 例题2:客户端发送文件给服务端,服务端将文件保存在本地 * @author xq * @create 2021-01-04-16:00 */ public class TCPTest2 { @Test public 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("chinese.png")); //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(); } @Test public void server() throws IOException { ServerSocket ss = new ServerSocket(9090); Socket socket = ss.accept(); InputStream is = socket.getInputStream(); FileOutputStream fos = new FileOutputStream(new File("chinese1.png")); byte[] buffer = new byte[1024]; int len; while ((len = is.read(buffer)) != -1){ fos.write(buffer,0,len); } fos.close(); is.close(); socket.close(); ss.close(); } }
例题3
package atguigu.java; import org.junit.Test; import java.io.*; import java.net.InetAddress; import java.net.ServerSocket; import java.net.Socket; /** * 实现TCP的网络编程 * 例题3:从客户端发送文件给服务端,服务端保存到本地,并返回“发送成功”给客户端 * 并关闭相应的连接 * @author xq * @create 2021-01-04-16:17 */ public class TCPTest3 { @Test public 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("chinese.png")); //4 byte[] buffer = new byte[1024]; int len; while ((len = fis.read(buffer)) != -1){ os.write(buffer,0,len); } //关闭数据的输出 socket.shutdownOutput(); //接受来自于服务器端的数据,并显示到控制台上 InputStream is = socket.getInputStream(); ByteArrayOutputStream baos = new ByteArrayOutputStream(); byte[] buffer1 = new byte[20]; int len1; while ((len1 = is.read(buffer1)) != -1){ baos.write(buffer1, 0,len1); } System.out.println(baos.toString()); //5 fis.close(); os.close(); socket.close(); baos.close(); } @Test public void server() throws IOException { ServerSocket ss = new ServerSocket(9090); Socket socket = ss.accept(); InputStream is = socket.getInputStream(); FileOutputStream fos = new FileOutputStream(new File("chinese2.png")); byte[] buffer = new byte[1024]; int len; while ((len = is.read(buffer)) != -1){ fos.write(buffer,0,len); } //服务端给与客户端反馈 OutputStream os = socket.getOutputStream(); os.write("你好,照片已收到".getBytes()); fos.close(); is.close(); socket.close(); ss.close(); os.close(); } }
14.6 UDP网络编程
package atguigu.java; import org.junit.Test; import java.io.IOException; import java.net.*; import java.nio.charset.StandardCharsets; /** * UDP协议的网络编程 * @author xq * @create 2021-01-04-16:45 */ public class UDPTest { @Test public 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(); } @Test public 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(); } }
14.7 URL编程
常用方法
package atguigu.java; import java.net.MalformedURLException; import java.net.URL; /** * URL网络编程 * 1.URL:统一资源定位符,对应着互联网的某一资源地址 * 2.格式:<传输协议>://<主机名>:<端口号>/<文件名>#片段名?参数列表 * @author xq * @create 2021-01-04-17:01 */ public class URLTest { public static void main(String[] args) throws MalformedURLException { URL url = new URL("https://meeting.tencent.com/activities/index.html?fromSource=sem2_gwzcw.3894089.3894089.3894089"); // 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()); } }
网络编程实现Tomcat服务端数据
package com.atguigu.java1; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.net.HttpURLConnection; import java.net.URL; /** * @author shkstart * @create 2019 下午 4:54 */ 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(); } } } }