目录
在日常当中,特别是在大学当中,班级群当中发送的什么文件呀,什么东西都是非常多的,今天我们就来简单说一下关于我们用户上传图片到本地的那么一个过程。
首先是客户端这一块的(毕竟是从客户端发送到服务端上的)
客户端
1、首先是客户端需要和服务端相连接
Socket socket = new Socket("localhost",6666);
System.out.println("已经连接到服务器");//表示已经连接
2、准备需要发送用到的文件(Java中一般用此类方式读取本地文件)
File file = new File("Image/1.jpg");
FileInputStream fis = new FileInputStream(file);//传入文件
3、将数据写入缓冲区ByteArrayOutputStream中
ByteArrayOutputStream baos = new ByteArrayOutputStream();//将数据写入字节数组中
byte [] buffer = new byte[1024];
由于传输的时候,传输的块的大小是1024(设定成1024速度会快一些),如果大小不一会影响传输效率,所以需要统一一个固定的传输数据包的大小,可以根据实际情况而定,不是必须1024,
为什么要将数据写入缓冲区呢,如果需要读取的数据量很大并且数量很多的时候,不写入缓冲区,会导致中途等待时间可能过长,所以这里我们用缓冲区的方式进行处理
4、将处理完毕的字节数组中的所有数据发送给服务器
//发送图片到服务器
OutputStream os= socket.getOutputStream();//获取当前socket对象输出流
os.write(data,0,data.length);//把最终处理成字节数组的所有数据传输给服务器
os.flush();//刷新输出流
值得一提的是,在第3步中,写入缓冲区的数据并不会直接发送给服务器,而是需要第4步才是发送给客户端
5、关闭流
如果记不住的话可以写在异常处理的finally当中,保证一定能够执行
try{
//......
}
catch(IOException e){
e.printStackTrace();
}finally{
baos.close();
fis.close();
os.close();
}
服务器
1、服务器开启服务
ServerSocket server = new ServerSocket(6666);//端口号 - 需要和客户端保持一致
System.out.println("服务器启动成功,等待客户端连接...");
2、处理客户端对于服务端的访问请求(需要循环 因为此处只是示范单个客户端连接,实际情况的话会有多个客户端进行连接)
while (true) {
// 等待客户端连接
Socket client = server.accept();//服务器处理客户端连接请求,并创建一个Socket对象处理客户端和服务端的任务
System.out.println("客户端已连接,IP地址为:" + client.getInetAddress().getHostAddress());
3、读取客户端发送的数据
// 读取客户端发送的图像数据
InputStream in = client.getInputStream();
4、使用ByteArrayOutputStream处理为byte数组到缓冲区(此处和客户端同理)
ByteArrayOutputStream baos = new ByteArrayOutputStream();
byte[] buffer = new byte[1024];
int len;
while ((len = in.read(buffer)) != -1) {
baos.write(buffer, 0, len);
}
5、把处理完毕的数据存入本地文件中
// 将图像数据保存到文件中
File file = new File("image.jpg");
//这三行代码相当于在电脑上创建一个文本的过程 先创建文件,在把文件写入文件当中
FileOutputStream fos = new FileOutputStream(file);
fos.write(data, 0, data.length);
以下是代码的全部内容
客户端
import java.io.*;
import java.net.Socket;
public class ImageClient01 {
public static void main(String[] args) {
try {
Socket socket = new Socket("localhost",6666);
System.out.println("已经连接到服务器,准备图像数据传输:");
//读取本地图像文件
File file = new File("Image/1.jpg");
FileInputStream fis = new FileInputStream(file);//传入文件
ByteArrayOutputStream baos = new ByteArrayOutputStream();//将数据写入字节数组中
byte [] buffer = new byte[1024];
//由于传输的时候,如果大小不一会影响传输效率,所以需要统一一个固定的传输数据包的大小,可以根据实际情况而定,不是必须1024
int len;
while((len = fis.read()) != -1){//长度不为-1循环
baos.write(buffer,0,len);
//将读取到的数据写入ByteArrayOutputStream缓冲区当中
}
byte [] data = baos.toByteArray();
//toByteArray方法具有检查缓冲区是否有数据的功能,
//如果有,返回缓冲区的所有数据,
//否则缓冲一个空数组,和ByteArrayOutputStream对象中的数据转换成字节数组
baos.close();
fis.close();
//发送图片到服务器
OutputStream os= socket.getOutputStream();//获取当前对象输出流
os.write(data,0,data.length);//把最终处理成字节数组的所有数据传输给服务器
os.flush();
os.close();
System.out.println("图像传输成功!");
} catch (IOException e) {
e.printStackTrace();
}
}
}
服务端
import java.io.*;
import java.net.*;
public class ImageServer {
public static void main(String[] args) {
try {
// 创建一个 ServerSocket 对象,监听 8888 端口
ServerSocket server = new ServerSocket(8888);
System.out.println("服务器已启动,等待客户端连接...");
while (true) {
// 等待客户端连接
Socket client = server.accept();
//服务器处理客户端连接请求,并创建一个Socket对象处理客户端和服务端的任务
System.out.println("客户端已连接,IP地址为:" + client.getInetAddress().getHostAddress());
// 读取客户端发送的图像数据
InputStream in = client.getInputStream();
ByteArrayOutputStream baos = new ByteArrayOutputStream();
byte[] buffer = new byte[1024];
int len;
while ((len = in.read(buffer)) != -1) {
baos.write(buffer, 0, len);
}
byte[] data = baos.toByteArray();
baos.close();
in.close();
// 将图像数据保存到文件中
File file = new File("image.jpg");
//这三行代码相当于在电脑上创建一个文本的过程 先创建文件,在把文件写入文件当中
FileOutputStream fos = new FileOutputStream(file);
fos.write(data, 0, data.length);
fos.flush();
fos.close();
System.out.println("图像保存成功!");
}
} catch (IOException e) {
e.printStackTrace();
}
}
}