使用C/S结构实现客户端上传本地文件到服务器
客户端:
package cn.kgc.cs01;
import java.io.*;
import java.net.Socket;
public class Demo01_Client {
public static void main(String[] args) {
try {
//创建客户端socket对象
Socket socket = new Socket("localhost",8888);
//获得网络字节输出流,用来把本地文件写到服务器端内存
OutputStream os = socket.getOutputStream();
//创建本地字节输入流,用来把本地文件读到客户端内存
FileInputStream fis = new FileInputStream("h:\\a.jpg");
//采用数组使读写效率更高
byte[]bytes=new byte[1024];
int len=0;
//当本地字节流在读取完数组中的最后一个元素时,会返回-1
while((len=fis.read(bytes))!=-1){
//网络字节流把读到的文件写到服务器端内存
os.write(bytes,0,len);
}
//关闭服务器端的读写循环
socket.shutdownOutput();
//创建网络字节输入流,来获得服务器端的反馈
InputStream is = socket.getInputStream();
int read = is.read(bytes);
//将读到的字节数组转成字符串输出
System.out.println(new String(bytes,0,read));
//释放资源
is.close();
os.close();
fis.close();
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
服务器端:
package cn.kgc.cs01;
import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Random;
public class Demo01_Server {
public static void main(String[] args) {
try {
//创建服务端的serverSocket对象,提供端口号
ServerSocket server = new ServerSocket(8888);
//创建文件对象,判断本地是否存在该文件,如果没有则创建
File file = new File("h:\\up");
if(!file.exists()){
file.mkdir();
}
//开启线程,提高上传效率
new Thread(new Runnable() {
@Override
public void run() {
while(true){
try{
//通过accept()方法获得客户端socket对象,并监听
Socket socket = server.accept();
//获得网络字节输入流,来读取客户端上传的文件
InputStream is = socket.getInputStream();
/**
* 创建本地字节输出流,把服务器读到的文件写到硬盘里面
* 注意:文件名应该用随机数和当前时间的组合,
* 这样才能保证每次都能把文件写到硬盘里面
*/
FileOutputStream fos = new FileOutputStream("h:\\up\\" + (new Random().nextInt() + System.currentTimeMillis()) + ".jpg");
byte[]bytes=new byte[1024];
int len=0;
while((len=is.read(bytes))!=-1){
//把服务器读到的文件写到内存中
fos.write(bytes,0,len);
}
//获得网络字节输出流,给客户端反馈信息
OutputStream os = socket.getOutputStream();
//把字符串转成字节数组传给客户端
os.write("文件上传成功!".getBytes());
//释放资源
os.close();
fos.close();
is.close();
socket.close();
/**
* 注意:
* 服务器Server的流一定不能关
*/
}catch(IOException e){
e.printStackTrace();
}
}
}
}).start();//千万别忘了调用线程的开始方法
} catch (IOException e) {
e.printStackTrace();
}
}
}

浙公网安备 33010602011771号