案例模型分析:
基于TCP实现,一个Clinet(发送端)向,一个Server(接收端)上传图片文件的功能。要求,客户端上上传的图片路径,需要从配置文件.properties文件中读取
为了简化并可视结果:客户端和服务端,用本机ip上两个端口模拟即可;
定义Socket的时候,本机端口是OS随机分配的;
发送的文件类型是图片,用字节流(图片可能很大,这里用缓冲流包装)
由于服务器端套接字输入流是一个阻塞方法,客户端发送完数据后,需要用shutdown方法关闭客户端套接字输出流,这样服务端就不会一直阻塞等待新的输入;
客户端:
package netTCP; import java.io.*; import java.net.Socket; public class Clinet { public static void main(String args[]) throws IOException { //获取文本内容,得到目标文件的路径 String filepathtoUpload = getPath(); System.out.println("获得要上传的文件所在路径是: "+filepathtoUpload); //定义客户端端口(目的ip,目的端口) Socket socket = new Socket("127.0.0.1",9991); //定义缓冲输入流,准备读入图片的字节缓冲数组 BufferedInputStream bi = new BufferedInputStream(new FileInputStream(filepathtoUpload)); byte[] buffpic= new byte[1024]; int len; //获取客户端发送流,做包装;一边读图片字节数据,一边发送 OutputStream out = socket.getOutputStream(); BufferedOutputStream bos = new BufferedOutputStream(out); while((len = bi.read(buffpic))!=-1){ bos.write(buffpic,0,len); } bos.flush();//刷新缓存 socket.shutdownOutput();//禁用此套接字的输出流,可以使服务器端的InputStream不在阻塞 //获取客户端输入流,接受文件上传后反馈信息 InputStream in = socket.getInputStream(); byte [] feedBack = new byte[1024]; int lenfeedBack = in.read(feedBack); System.out.println(new String(feedBack,0,lenfeedBack)); //收到反馈信息后,关闭套接字socket socket.close(); bi.close(); } public static String getPath() throws IOException { FileInputStream fileInputStream = new FileInputStream("G:\JavaTestDir\路径有中文\config.properties"); byte[] buffer = new byte[1024]; int len = fileInputStream.read(buffer); String s = new String(buffer,0,len); return s; } }
服务端:
package netTCP; import java.io.*; import java.net.ServerSocket; import java.net.Socket; public class Server { public static void main(String args[]) throws IOException { //定义服务端SeverSocker,并获取服务端连接的socket ServerSocket serverSocket = new ServerSocket(9991); Socket socket = serverSocket.accept(); //获取socket输入流,并用缓存字节流包装; InputStream in = socket.getInputStream(); BufferedInputStream bis = new BufferedInputStream(in); //指定一个路径(这里用默认路径),定义缓冲输出流,用于将图片保存到默认路径 FileOutputStream fo = new FileOutputStream("copy.jpg"); BufferedOutputStream bos = new BufferedOutputStream(fo); //接收客户端的数据,并写到指定位置 byte[] buff = new byte[1024]; int len = 0; while((len = bis.read(buff))!=-1){ bos.write(buff,0,len); } bos.flush(); //获取socket输出流 OutputStream out = socket.getOutputStream(); //返回文件上传结束信息给客户端(中文) String feedbackMessage ="文件上传结束"; out.write(feedbackMessage.getBytes()); //out.close();//可不用,由客户端关闭socket即可 fo.close(); // in.close();//可不用,有客户端关闭socket即可 socket.close(); serverSocket.close();; } }
可以看到运行完,图片被上传到默认路径