程序运行时,优先运行服务端,因为服务端要开始等待客户端上传图片
服务端线程
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;
import java.util.UUID;
public class ServerThread implements Runnable {
private Socket socket;
private String dir;
public ServerThread(Socket socket, String dir) {
this.socket = socket;
this.dir = dir;
}
@Override
public void run() {
try {
File file = new File(dir);
// 确定文件路径是否存在,如果不存在,创建目录
if (!file.exists()) {
file.mkdirs();
}
// 随机生成一个UUID号,确保保存的图片名字不重复
UUID uuid = UUID.randomUUID();
// 将UUID转换成字符串,并将"-"替换成""空字符串
String name = uuid.toString().replaceAll("-", "");
// 声明字节输出流,用来将接受到的图片输出到指定的位置
FileOutputStream fos = new FileOutputStream(new File(file, name + ".jpg"));
// 声明一个字节读取流,准备客户端发动的数据进行读取
InputStream is = socket.getInputStream();
// 声明一个字节数组,用来存放后面读取到的数据
byte[] buffer = new byte[1024];
// 用来判断读取到字节的长度
int len = -1;
// 循环读取客户端发送的字节数据
while ((len = is.read(buffer)) != -1) {
// 将读取到的数据写入到指定路径下
fos.write(buffer, 0, len);
// 刷新数据
fos.flush();
}
// 关闭字节输出流
fos.close();
//------给客户端返回确认信息------
OutputStream os = socket.getOutputStream();
os.write("上传成功".getBytes());
os.flush();
socket.shutdownOutput();
} catch (IOException e) {
e.printStackTrace();
}
}
}
服务端
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
public class ServerDemo {
public static void main(String[] args) throws IOException {
// 声明端口号为10086的服务器 套接字
ServerSocket serverSocket = new ServerSocket(10086);
while (true) {
Socket socket = serverSocket.accept();// 阻塞方法,等待客户端传输数据
// 创建服务器自定义线程对象
ServerThread serverThread = new ServerThread(socket,"d:\\aaa\\bbb");
// 开启线程
new Thread(serverThread).start();
}
}
}
客户端
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.InetAddress;
import java.net.Socket;
public class ClientDemo {
public static void main(String[] args) throws IOException {
// 此处用的IP地址是本地IP地址
InetAddress address = InetAddress.getByName("192.168.42.105");
// 创建一个客户端 套接字 对象
Socket socket = new Socket(address, 10086);
// 声明一个字节读取流
FileInputStream fis = new FileInputStream(new File("e:\\柳岩.jpg"));
byte[] buffer = new byte[1024];
int len = -1;
// 声明一个字节输出流,用来将读到的数据写入到服务器
OutputStream os = socket.getOutputStream();
// 循环读取"e:\\柳岩.jpg"路径的图片字节
while ((len = fis.read(buffer)) != -1) {
// 将读取到的字节写到服务器
os.write(buffer, 0, len);
// 刷新数据
os.flush();
}
// 关闭字节读取流
fis.close();
socket.shutdownOutput();
// ---接受客户端返回的信息----
InputStream is = socket.getInputStream();
while ((len = is.read(buffer)) != -1) {
System.out.println(new String(buffer, 0, len));
}
socket.close();
}
}