使用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(); } } }