5.4 利用tcp实现文件传输 信息工程系 向模军 Tel: Email: QQ: 13684285460 xmj.cn@163.com 156638267
1 任务引入 在基于UDP的通讯模式中,通讯双方有时需要可靠的通讯(例如:文件传输)。由于UDP协议不保证通讯可靠性,因此在要求保障通讯可靠性的应用中,采用TCP协议。 TCP协议的通讯模式是客户/服务方式。服务端打开一个TCP端口监听连接,客户端与服务端建立TCP连接,并在连接期间传输文件名称及文件内容信息。 2/16
2 任务讨论 定义客户端和服务端在传输文件时的“通讯协议”,使得服务端获知通讯流中哪一些是文件信息,哪一些是文件内容。 3/16
3 I/O流概述 大部分程序都需要输入/输出处理,比如从键盘读取数据、向屏幕中输出数据、从文件中读或者向文件中写数据、在一个网络连接上进行读写操作等。在Java中,把这些不同类型的输入、输出源抽象为流(Stream),而其中输入或输出的数据则称为数据流(Data Stream),用统一的接口来表示,从而使程序设计简单明了。 4/16
3 字节流 字节流基本类 Java中每一种字节流的基本功能依赖于基本类InputStream和OutputStream,它们是抽象类,不能直接使用。 属于InputStream类的方法有: read():从流中读入数据 skip():跳过流中若干字节数 available():返回流中可用字节数 mark():在流中标记一个位置 reset():返回标记过的位置 markSupport():是否支持标记和复位操作 close():关闭流 属于OutputStream类的方法有: write(int b):将一个整数输出到流中(只输出低位字节,为抽象方法) write(byte b[]):将字节数组中的数据输出到流中 write(byte b[], int off, int len):将数组b中从off指定的位置开始,长度为len的数据输出到流中 flush():刷空输出流,并将缓冲区中的数据强制送出 close():关闭流 5/16
3 字节流 文件流 在I/O处理中,最常见的就是对文件的操作。java.io包中所提供的文件操作类包括: File、FileDescriptor描述本地文件系统中的文件或目录 FilenameFilter:接口,主要用于实现文件名查找模式的匹配。 RandomAccessFile:提供对本地文件系统中文件的随机访问支持。 FileInputStream、FileOutputStream用于读写本地文件系统中的文件 FileInputStream类用来打开一个输入文件,若要打开的文件不存在,则会产生例外FileNotFoundException,这是一个非运行时例外,必须捕获或声明抛弃; FileOutputStream类用来打开一个输出文件,若要打开的文件不存在,则会创建一个新的文件,否则原文件的内容会被新写入的内容所覆盖。 在进行文件的读/写操作时,会产生非运行时例外IOException,必须捕获或声明抛弃(其它的输入/输出流处理时也同样需要进行输入/输出例外处理)。 6/16
3 字节流 过滤流 java.io中提供类FilterInputStream和FilterOutputStream分别对其他输入/输出流进行特殊处理,它们在读/写数据的同时可以对数据进行特殊处理。另外还提供了同步机制,使得某一时刻只有一个线程可以访问一个输入/输出流。 7/16
3 字节流 缓冲流 类BufferedInputStream和BufferedOutputStream实现了带缓冲的过滤流,它提供了缓冲机制,把任意的I/O流“捆绑”到缓冲流上,可以提高该I/O流的读取效率。 8/16
3 字节流 数据流 接口DataInput和DataOutput,设计了一种较为高级的数据输入输出方式:除了可处理字节和字节数组外,还可以处理int、float、boolean等基本数据类型,这些数据在文件中的表示方式和它们在内存中的一样,无须转换,如read(), readInt(), readByte() …;write(), writeChar(), writeBoolean()…。此外,还可以用readLine()方法读取一行信息。 数据流类 DataInputStream和DataOutputStream的处理对象除了是字节或字节数组外,还可以实现对文件的不同数据类型的读写,分别实现了DataInput和DataOutput接口。在提供了字节流的读写手段的同时,以统一的通用的形式向输入流中写入boolean,int,long,double等基本数据类型,并可以在次把基本数据类型的值读取回来。提供了字符串读写的手段。 9/16
3 字符流 同类InputStream和OutputStream一样,Reader和Writer也是抽象类,只提供了一系列用于字符流处理的接口。它们的方法与类InputStream和OutputStream类似,只不过其中的参数换成字符或字符数组。 基类:Reader主要方法 void close() void mark(int readAheadLimit) boolean markSupported() : int read() int read(char[] cbuf) int read(char[] cbuf, int off, int len) boolean ready() void reset() long skip(long n) 基类 :Writer主要方法 void close() void flush() void write(char[] cbuf) void write(char[] cbuf, int off, int len) void write(int c) void write(String str) void write(String str, int off, int len) 10/16
3 文件操作/随机访问文件 文件操作主要涉及的类包括: File:以文件路径名的形式代表一个文件 FileDescriptor:代表一个打开文件的文件描述 FileFilter & FilenameFilter:用于列出满足条件的文件 FileInputStream & FileReader:顺序读文件 FileOutputStream & FileWriter:顺序写文件 RandomAccessFile:提供对文件的随机访问支持。 11/16
4 任务实施 在JBuilder中新建项目。在项目中建立以下2个包(服务器端,客户端)。 服务器端: “连接监听”tcpServer类(线程),在指定地址、端口监听客户端的连接请求,并创建Socket套接口,创建、启动tcpreceive线程 。 “文件接收服务 ” tcpreceive类(线程),利用Socket套接口,负责接收文件,完成客户、服务端之间的文件传输,在传输文件前,与客户端协商获取文件名称,文件长度信息,最后传输文件内容。 “服务端主程序”mainThread类,负责启动和停止tcpServer线程。 客户端: “客户端文件传输 ” tcpfiletransmit类(线程),负责创建到指定地址、端口的Socket,并通过Socket发送指定的文件 。 “客户端主控程序” mainThread类,启动tcpfiletransmit线程 。 12/16
5 任务点评 客户端在正式发送文件前,应向服务端正确发送文件名称,文件长度信息,否则服务端无法正确接收文件。 客户端通过缓冲区在读文件的同时,发送缓存区数据,反复直到文件结尾。 服务端通过缓冲区在接收数据的同时,将缓冲区数据写入到文件中,直到接收到指定长度的信息。 13/16
6 试一试 练一练 改写项目,利用两个Socket,一个用于交换文件信息和控制传输,另一个用于传输文件内容。 14/16
7 课外拓展 分析FTP工作原理。 15/16
Thank You !