IO流相关的案例:
客户端上传文件给服务器,服务器回写信息给客户
思路:
输出方-->硬盘里文件写入到内存,内存连接另一个用户的内存
接收方-->接收发送对象的文件到内存中,内存写入硬盘
客户端:
1、创建客户端对象Socket,指定需要连接的服务器ip地址和端口号
2、创建字节输入流,关联数据源文件路径
3、通过Socket对象获得字节输出流,关联连接通道
4、定义一个byte数组,存储读取到的字节数据
5、定义int变量,存储读取到的字节个数
6、写字节数据
7、关闭流,释放资源
服务器:
1、创建Serversocket对象,指定服努器的端口号
2、创建Serversocket对象,指定服努器的端口号
3、通过Socket对象获得字节输入流,关联连按通道
4、创建字节输出流对象,关联目的地文件踏径
5、定义一个byte数组,用来存储读取到的字节数据
6、定义-个int变量,用来存储读取到的字节个数
7、写字节数据
8、关闭流,释放资涯
注意:我是一台电脑操作所以关联的服务器地址是自己的设置的127.0.0.1,有需要可以自行
优化:1:文件名自动生成不重复
2:服务器只能接收客户端上传一次文件---->改成服务器循环接收
3:效率问题---->目前是单线程会影响效率,改成多线程
客户端1发送文件
import java.io.FileInputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;
public class Client {
//需求:客户端传文件给服务器
/*优化 1:文件名自动生成不重复
2:服务器只能接收客户端上传一次文件---->改成服务器循环接收
3:效率问题---->目前是单线程会影响效率,改成多线程
*/
public static void main(String[] args) throws Exception {
//创建socket对象,指定需要关联的服务器的ip地址和端口号
Socket socket = new Socket("127.0.0.1", 9999);
//创建文件字节输入流对象,关联数据源文件路径
FileInputStream file1 = new FileInputStream("day0806\\Client\\mm.jpg");
//通过socket对象创建字节输出流对象关联连接通道
OutputStream op = socket.getOutputStream();
//创建一个byte数组,用来存储读取的字节数据
byte[] by1 = new byte[8192];
//创建一个变量用来存储读取到的字节个数
int b;
//循环读取字节数据
while ((b = file1.read(by1)) != -1) {
//写字节数据
op.write(by1,0,b);
}
//禁用通过socket获得的输出流
socket.shutdownOutput();
//通过socket获取字节输入流,并关联连接通道
InputStream in = socket.getInputStream();
int read = in.read(by1);
System.out.println(new String(by1, 0, read));
//关闭流
socket.close();
file1.close();
}
}
服务器
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;
public class Server {
public static void main(String[] args) throws Exception {
//创建ServerSocket对象,指定服务器端口
ServerSocket ser = new ServerSocket(9999);
//创建while循环,在连接之前,如果在连接之后会使一个连接无限循环,不停
while (true) {
//接收请求创建连接,调用accept方法
Socket acc = ser.accept();//阻塞
//创建多线程使得传输大文件也可以连接其他客户端
new Thread(new Runnable() {
@Override
public void run() {
FileOutputStream file1 = null;
InputStream in = null;
try {
//使用ServerSocket创建文件字节输入流对象
in = acc.getInputStream();
//创建文件字节输出流对象,接收文件
file1 = new FileOutputStream("day0806\\Server\\" + System.currentTimeMillis() + "mmcop.jpg");
System.out.println("服务器开始接收文件。。。");
//接收文件
//创建一个字节数组存储读取到的字节
byte[] byt = new byte[8192];
//定义一个变量存储读取到的字节个数
int b;
//循环读取字节数据
while ((b = in.read(byt)) != -1) {
file1.write(byt, 0, b);
}
System.out.println("文件接收完毕。。。");
//回写socket对象获得字节输出流,关联连接通道
OutputStream out = acc.getOutputStream();
out.write("文件上传成功".getBytes());
} catch (Exception e) {
System.out.println(e.getMessage());
} finally {
//关闭流
//ser.close();
try {
file1.close();
} catch (Exception e) {
System.out.println(e.getMessage());
}
try {
in.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}).start();
}
}
}
客户端2发送文件
package demo7_文件上传案例3;
import java.io.FileInputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;
public class Client2 {
//需求:客户端传文件给服务器
public static void main(String[] args) throws Exception {
//创建socket对象,指定需要关联的服务器的ip地址和端口号
Socket socket = new Socket("127.0.0.1", 9999);
//创建文件字节输入流对象,关联数据源文件路径
FileInputStream file1 = new FileInputStream("day0806\\Client2\\mm.jpg");
//通过socket对象创建字节输出流对象关联连接通道
OutputStream op = socket.getOutputStream();
//创建一个byte数组,用来存储读取的字节数据
byte[] by1 = new byte[8192];
//创建一个变量用来存储读取到的字节个数
int b;
//循环读取字节数据
while ((b = file1.read(by1)) != -1) {
//写字节数据
op.write(by1,0,b);
}
//禁用通过socket获得的输出流
socket.shutdownOutput();
//通过socket获取字节输入流,并关联连接通道
InputStream in = socket.getInputStream();
int read = in.read(by1);
System.out.println(new String(by1, 0, read));
//关闭流
socket.close();
file1.close();
}
}