上传任意文件到 服务器
文件名及类型 客户端传送
文件数据 客户端传送
多客户 同时 向服务端 上传文件
服务端
这个服务端 有个局限性。当A客户端连接上以后。被服务器获取到,服务端执行具体流程
这时B客户端连接,只有等待
因为服务端还没有处理完A客户端的请求,还没有循环回来执行下一次accept方法。
所以获取不到B客户端对象
那么为了可以让多个客户端同时访问服务端
那么服务端最好就是将每个客户端都封装到一个单独的线程中,这样,就可以同时处理多个客户端请求
import java.net.*; import java.io.*; class sendFs { public static void main(String[] args) { try { Socket s = new Socket("127.0.0.1",13000); //读取 文件(字符?字节?) File f = new File("D:\\黑-马-程-序-员-面-试-技-巧.doc");// //如果不是一个文件的话 报错 if(!f.isFile()) { System.out.println("抱歉,这不是标准文件无法上传"); return; } //传送流 OutputStream out = s.getOutputStream(); //获取文件名 发送文件名 String name = f.getName(); System.out.println(name); int dex = name.lastIndexOf("."); String na = name.substring(dex); System.out.println(na); out.write(name.getBytes()); FileInputStream is = new FileInputStream(f); //读取本地文件 byte[] buf = new byte[1024]; int len = 0; while ((len=is.read(buf))!=-1) { out.write(buf,0,len);//文件数据写入输出流 通过网络传送 } s.shutdownOutput();//告诉服务端 文件读取完毕 让服务端的的读取方法返回-1或null结束循环 //接收客户端的反馈 InputStream in = s.getInputStream(); byte[]bf = new byte[1024]; int le = in.read(bf); System.out.println(new String(bf,0,le)); //关闭资源 s.close(); is.close(); } catch (Exception e) { throw new RuntimeException("发送出错"); } } } //由于要连接 多客户端 所以 服务端需要一直开启 等待接收连接 //一个客户端连接到服务端 服务端则获取一个客户端对象 只能响应一个客户端 //之后才连接另一个客户端 那么客户端必须一个一个访问服务端 //需要 同时服务多个客户端那么 就需要开启多线程 //连入一个客户端 则开启一个线程 创建一个客户端对象 class receFs implements Runnable { Socket s; receFs(Socket s) { this.s = s; } public void run() { try { InputStream in = s.getInputStream(); //复制的文件存放 String IP = s.getInetAddress().getHostAddress(); System.out.println(IP+",,,连接成功"); String name = null; int count = 1; if(count == 1) { byte[]bf = new byte[1024]; int le = in.read(bf); name=new String(bf,0,le); } int dex = name.lastIndexOf("."); String na = name.substring(dex); name = name.substring(0,dex); System.out.println(name); System.out.println(na); File f = new File("F:\\0123",name+"(上传)"+na); while(f.exists()) f = new File("F:\\0123",name+"(上传)("+(count++)+")"+na); //将数据写入到文件中 FileOutputStream os = new FileOutputStream(f); //获取数据 byte[]buf = new byte[1024]; int len = 0; while ((len=in.read(buf))!=-1) { os.write(buf,0,len); //os.flush(); 可以不用刷新到文件 os流关闭的时候会刷入文件 } OutputStream out = s.getOutputStream(); out.write((f.getName()+"上传完成").getBytes()); //关闭资源 os.close(); s.close(); } catch (Exception e) { throw new RuntimeException("接收出错"); } } public static void main(String[] args) { try { ServerSocket ss = new ServerSocket(13000); while (true) { Socket s = ss.accept();//阻塞方法 new Thread(new receFs(s)).start(); } } catch (Exception e) { throw new RuntimeException("服务器连接失败"); } } }