服务端
import java.io.DataInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
public class TestDataServer {
private static ServerSocket server;
private static Socket client;
private static DataInputStream dis;
public static void main(String[] args) throws IOException {
try {
//创建服务端并监听5454端口
server = new ServerSocket(5454);
} catch (IOException e) {
e.printStackTrace();
}
while (true) {
//阻塞循环,直到收到客户端的连接
client = server.accept();
//得到input流用于数据的获取
dis = new DataInputStream(client.getInputStream());
//得到客户端写入的文件名
String name = dis.readUTF();
//得到文件的字节数组
byte[] bytes = dis.readAllBytes();
//创建一个output流用于保存文件
FileOutputStream fos = new FileOutputStream("C:\\Users\\pc\\Desktop\\myproject\\temp\\" + name);
//将文件的字节数组写入output流中
fos.write(bytes);
//关闭相应的流
fos.close();
dis.close();
System.out.println("文件:"+name+"上传成功!");
}
}
}
客户端
import java.io.DataOutputStream;
import java.io.FileInputStream;
import java.io.IOException;
import java.net.Socket;
public class TestDataClient {
public static void main(String[] args) throws IOException {
//以需要上传的文件的绝对路径作为参数创建客户端上传对象
new ClientUpPicture("C:\\Users\\pc\\Desktop\\a.jpg");
}
}
class ClientUpPicture implements Runnable{
private static Socket client;
private static FileInputStream fis;
private static DataOutputStream dos;
private static String filename;
public ClientUpPicture(){}
public ClientUpPicture(String filename){
this.filename=filename;
this.run();
}
@Override
public void run() {
try {
//创建socket指向指定的地址
client=new Socket("127.0.0.1", 5454);
} catch (IOException e) {
e.printStackTrace();
}
try {
//创建文件input流
fis = new FileInputStream(filename);
//得到socket的output用于数据写入
dos = new DataOutputStream(client.getOutputStream());
//写入字符串作为服务端的文件名
dos.writeUTF(dealName(filename));
//写入文件inputt流
dos.write(fis.readAllBytes());
//关闭相应的流
dos.close();
fis.close();
System.out.println("文件:"+dealName(filename)+"上传成功!");
} catch (IOException e) {
e.printStackTrace();
}
}
//将一个完整的文件路径处理得到文件名
public String dealName(String filename){
return filename.split("\\\\")[filename.split("\\\\").length-1];
}
}
注意:相关流在使用完毕后一定要关闭,否则可能出现问题,例如在使用FileOutputStream写数据进入文件时,如果不关闭则会造成文件无法正常写入的问题。仔细想想,就好像你打开一个文档,写了一大堆情话,却忘记保存就关闭了。