将客户端c:\a.jpg 上传到e:\公司名称+6位随机数.jpg 这样为了不断开连接客户端每次上传的图片名字不重名覆盖,验证之用
这里需要注意的是Socket的终止客户端的输入方法 shutdownOutput,如果不关闭发送服务器的输出流,线程就会阻塞,就没法接下去
接受服务发来的输入入流。
package demo04; import java.io.FileInputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.net.Socket; /* * 实现TCP图片上传客户端 * 实现步骤: * 1.Socket套接字连接服务器 * 2.通过Socket获取字节输出流,写图片 * 3.使用自己的流对象,读取图片数据源 * FileInputSteam * 4.读取图片,使用字节输出流,将图片写到服务器 * 采用字节数组进行缓冲 * 5.通过Socket套接字获取字节输入流 * 读取服务器发回来的上传成功 * 6.关闭资源 */ public class TCPClient { public static void main(String[] args) throws IOException { Socket socket=new Socket("127.0.0.1",8000); //获取字节输出流,图片写到服务器 OutputStream out=socket.getOutputStream(); //创建字节输入流,读取本机上的数据源图片 FileInputStream fis=new FileInputStream("c:\a.jpg"); //开始读写字节数组 int len=0; byte[] bytes=new byte[1024]; while((len=fis.read(bytes))!=-1){ out.write(bytes,0,len); } //给服务器写终止序列, socket.shutdownOutput(); //获取字节输入流,读取服务器的上传成功 InputStream in=socket.getInputStream(); len=in.read(bytes);//如果读完会处于一直等待,进入阻塞状态 System.out.println(new String(bytes,0,len)); fis.close(); socket.close(); } }
服务端的代码 实现runnale接口方式
package demo04; import java.io.File; import java.io.FileOutputStream; import java.io.InputStream; import java.net.Socket; import java.util.Random; public class Upload implements Runnable{ private Socket socket; public Upload(Socket socket){this.socket=socket;} public void run() { try{ //通过客户端连接对象,获取字节输入流,读取客户端图片 InputStream in=socket.getInputStream(); //将母的文件夹封装发哦File对象 File upload=new File("e:\upload"); if(!upload.exists()) upload.mkdirs(); //创建字节输出流,将图片写入到母的文件中 //规则:域名+毫秒值+6位随机数 String filename="albb"+System.currentTimeMillis()+new Random().nextInt(999999)+".jpg"; //创建字节输出流,将图片写入到目的文件夹中 FileOutputStream fos=new FileOutputStream(upload+File.separator+filename);//separator跨平台的文件分隔符方法 byte[] bytes=new byte[1024]; int len=0; while((len=in.read(bytes))!=-1){ fos.write(bytes,0,len); } //通过客户端对象获取字节输出流 //上传成功写回客户端 socket.getOutputStream().write("上传成功".getBytes()); fos.close(); socket.close(); }catch(Exception e){ } } }
开启多线程的代码
package demo04; import java.io.IOException; import java.net.ServerSocket; import java.net.Socket; public class TCPThreadServer { public static void main(String[] args) throws IOException{ ServerSocket server=new ServerSocket(8000); while(true){ //获取到一个客户端,必须开启新线程 Socket socket=server.accept(); new Thread(new Upload(socket)).start(); } } }