- 整体思路其实和使用IO流进行文件拷贝类似,只不过这次涉及的流更多。
- 1、图片属于二进制文件,所以采用字节流处理
- 2、源图片文件位于客户端主机的磁盘,所以我们需要通过本地IO,将其输入到内存(本地IO)
- 3、然后将读入内存的文件通过socket的输出流输出到管道(网络IO)
- 4、在服务器端通过socket的输入流读取管道内的文件到内存
- 5、把读入内存中的文件写入本地src目录下(本地IO)
- 6、和文件拷贝类似,整个过程都是“一边读一边写”的,而不是整个读完才写
服务器端代码: Server.java
package socket.tcp.uploadpic;
import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;
/**
* 任务:客户端向服务器上传一张图片,图片在D:/TestFile/mypic.jpg,要求上传到服务的src/下
* 服务器收到后向客户端回复
* 客户端收到回复后退出
*/
public class Server {
public static void main(String[] args) throws IOException {
ServerSocket serverSocket = new ServerSocket(9999);
System.out.println("服务器已启动,等待连接中...");
Socket socket = serverSocket.accept();
System.out.println("客户端连接成功!");
//开始接收数据
InputStream inputStream = socket.getInputStream();
BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("src/backa2.jpg"));
byte[] buf = new byte[1024];
int readLen = 0;
while ( (readLen = inputStream.read(buf)) != -1 ) {
bos.write(buf,0,readLen);
}
System.out.println("文件写入完毕");
//给客户端回复一下
OutputStream outputStream = socket.getOutputStream();
outputStream.write("图片已收到!辛苦了".getBytes());
socket.shutdownOutput();
inputStream.close();
bos.close();
socket.close();
serverSocket.close();
}
}
客户端代码:Client.java
package socket.tcp.uploadpic;
import java.io.*;
import java.net.InetAddress;
import java.net.Socket;
public class Client {
public static void main(String[] args) throws IOException {
Socket socket = new Socket(InetAddress.getLocalHost(), 9999);
System.out.println("服务器连接成功!");
BufferedInputStream bis = new BufferedInputStream(new FileInputStream("D:/TestFile/mypic.jpg"));
OutputStream outputStream = socket.getOutputStream(); //获取socket输出流
int readLen = 0;
byte[] buf = new byte[1024];
while( (readLen = bis.read(buf)) != -1 ) {
outputStream.write(buf,0,readLen);
}
socket.shutdownOutput();
System.out.println("图片已上传。。。");
//发送完接收来自服务端的回复
InputStream inputStream = socket.getInputStream();
byte[] b = new byte[512];
int len = 0;
len = inputStream.read(b);
System.out.println(new String(b,0,len));
inputStream.close();
bis.close();
outputStream.close();
socket.close();
}
}