文章目录
- 前言
- 一、客户端
- 二、服务接受端
前言
传送门——源教程地址:狂神说版文件上传实现
一、客户端
最开始我们可以选择电脑上面的任意张图片拖到Idea中。
新建一个TcpClient类,创建socket连接。只要设计到上传、传输、下载啥的都是和IO流扯上关系的。互联网上的一切东西都离不开流。然而下一步就必须创建一个输出流,接着new
一个文件输入流。
代码如下:
// 创建一个socket连接。
Socket socket = new Socket(InetAddress.getByName("127.0.0.1"), 9000);
// 创建一个输出流
OutputStream os = socket.getOutputStream();
// 读取文件
FileInputStream fis = new FileInputStream(new File("C:\\Users\\admin\\Desktop\\lesson02\\src\\fdb.jpg"));
// 写出文件
写出文件:
byte[] buffer = new byte[1024];
int len;
while ((len = fis.read(buffer)) != -1) {
os.write(buffer, 0, len);
}
通知服务器,我已经结束了。
socket.shutdownOutput(); // 我已经结束了,传输完了。
确定服务器接受完毕,才能够断开连接。
InputStream inputStream = socket.getInputStream();
ByteArrayOutputStream baos = new ByteArrayOutputStream();
byte[] buffer2 = new byte[1024];
int len2;
while ((len2 = inputStream.read(buffer2)) != -1) {
baos.write(buffer2, 0, len2);
}
System.out.println(baos.toString());
关闭资源。
fis.close();
inputStream.close();
baos.close();
os.close();
socket.close();
客户端完整代码:
package com.company.LessionStudy;
import java.io.*;
import java.net.InetAddress;
import java.net.Socket;
public class TcpClientDemo02 {
public static void main(String[] args) throws Exception {
// 创建一个socket连接。
Socket socket = new Socket(InetAddress.getByName("127.0.0.1"), 9000);
// 创建一个输出流
OutputStream os = socket.getOutputStream();
// 读取文件
FileInputStream fis = new FileInputStream(new File("C:\\Users\\admin\\Desktop\\lesson02\\src\\fdb.jpg"));
// 写出文件
byte[] buffer = new byte[1024];
int len;
while ((len = fis.read(buffer)) != -1) {
os.write(buffer, 0, len);
}
// 通知服务器,我已经结束了。
socket.shutdownOutput(); // 我已经结束了,传输完了。
// 确定服务器接受完毕,才能够断开连接
InputStream inputStream = socket.getInputStream();
ByteArrayOutputStream baos = new ByteArrayOutputStream();
byte[] buffer2 = new byte[1024];
int len2;
while ((len2 = inputStream.read(buffer2)) != -1) {
baos.write(buffer2, 0, len2);
}
System.out.println(baos.toString());
// 关闭资源
fis.close();
inputStream.close();
baos.close();
os.close();
socket.close();
}
}
二、服务接受端
同样的道理,接受图片也需要创建ServerSocket
服务端口号设置为9000
,调用服务的accept()
方法监听客户端的连接。紧接着获取输入流。
文件输出的pathname
可以自定义,比如我们的就是receive.jpg
自定义命名。那么接受到图片也会默认为此名字。
FileOutputStream fos = new FileOutputStream(new File("receive.jpg"));
最后就是写烂的代码:
byte[] buffer = new byte[1024];
int len;
while ((len = is.read(buffer)) != -1) {
fos.write(buffer, 0, len);
}
最后的最后关闭资源(关流)。
服务器TcpServer类完整代码:
package com.company.LessionStudy;
import java.io.File;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;
public class TcpServerDemo02 {
public static void main(String[] args) throws Exception {
// 创建服务
ServerSocket serverSocket = new ServerSocket(9000);
// 监听客户端的连接。
Socket socket = serverSocket.accept();
// 获取输入流。
InputStream is = socket.getInputStream();
// 文件输出
FileOutputStream fos = new FileOutputStream(new File("receive.jpg"));
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();
serverSocket.close();
}
}
运行结果:先运行服务器端,再运行客户端。
这个世界并不在乎你的自尊,只在乎你做出来的成绩,然后再去强调你的感受。——比尔·盖茨