图片文件的上传和下载

在服务器端

 1 public class ServesDemo {
 2     public static void main(String[] args) throws IOException {
 3         System.out.println("等待。。");
 4         // 服务器端的ServerSocket 参数是 :port
 5         ServerSocket serverSocket = new ServerSocket(6666);
 6         // 服务器端等待 客户端的请求
 7         Socket socket =  serverSocket.accept();
 8         /*1. 将客户端发来的请求当作是一个输入流,
 9         * 2. 读取发送给服务器的输入流(之前的方法)
10         * */
11         InputStream inputStream =  socket.getInputStream();
12         byte[] bytes = new byte[1024];
13         int readInt = inputStream.read(bytes);
14          String s = new String(bytes,0,readInt);
15         System.out.println("接收到客户端信息");
16          System.out.println(s);
17          // 把接收完信息的的消息用socket的方式发送(输出)给客户端
18          OutputStream o = socket.getOutputStream();
19          // 这个地方是需要输出的内容
20          o.write("收到".getBytes());
21          inputStream.close();
22          o.close();
23     }
24 }

客户端:

 1 public class ClientDemo {
 2     public static void main(String[] args) throws IOException {
 3 
 4         // 创建客户端的端口对象 需要通信的ip + 和服务器所在的端口,
 5         Socket s = new Socket("127.0.0.1",6666);
 6         // 用socket 的方式向服务器发送数据(out)
 7         OutputStream outputStream =  s.getOutputStream();
 8         // 用字节流的形式发送hello
 9         outputStream.write("hello".getBytes());
10         /* 0. 下面的整个流程都是为了读取服务器传来的反馈
11         *  1. 首先用getInputStream() 创建接收的输入流
12         *  2. 用之前的方法来读取输入流
13         *  3. read 的方式来读取,最后把读取到的数据转化称String的方式输出
14         *  注意:在这里你不必在意是用什么来接受的,read的方法会接受到服务端的write的消息字节
15         * */
16         InputStream inputStream = s.getInputStream();
17         byte[] bytes= new byte[1024];
18         int lenth;
19         lenth =  inputStream.read(bytes);
20          String strins = new String(bytes,0,lenth);
21         System.out.println("收到回信,内容");
22         System.out.println(strins);
23         outputStream.close();
24     }
25 }

-------

进阶版就包含了客户端向服务端的文件传递:

服务端:

 1   // 服务器,接受图片,保存在磁盘中
 2     public static void main(String[] args) throws IOException {
 3 
 4         // 改进:有了while 可以始终等待客户端的上传
 5         while (true){
 6             ServerSocket  serverSocket = new ServerSocket(6666);
 7             System.out.println("load..");
 8             Socket socket =  serverSocket.accept();
 9             // 为了提高效率,可以让服务器开启多个线程,1. 是一直在等待客户端上传,
10             // 2. 在新的线程中可以把上传的数据存储在服务器的磁盘中
11                 new Thread(new Runnable() {
12                 InputStream clientInputStream =null ;
13                 FileOutputStream fileOutputStream =null;
14                 OutputStream outputStreamToClient=null;
15                 @Override
16                 // 用多线程
17                 public void run() {
18                     try{
19                         // 接受客户端传来的信息流,写到服务器的磁盘中去
20                          clientInputStream = socket.getInputStream();
21                         String picName = System.currentTimeMillis()+".png";
22                          fileOutputStream = new FileOutputStream("d:\\"+picName);
23                         // 依次读取信息流
24                         byte[] bytes = new byte[1024];
25                         int len;
26                         while((len= clientInputStream.read(bytes))!=-1){
27                             fileOutputStream.write(bytes,0,len);
28                             if (len<1024){
29                                 break;
30                             }
31                         }
32 
33                         // 读取完成后,返回给客户端信息
34                          outputStreamToClient =  socket.getOutputStream();
35                         outputStreamToClient.write(("ok").getBytes());
36                         outputStreamToClient.close();
37                         clientInputStream.close();
38 
39                         fileOutputStream.close();
40 
41                     }
42                     catch (IOException e){
43                         e.getStackTrace();
44                     }
45                     }
46             }).start();
47             serverSocket.close();
48         }
49 
50 
51     }
52 }

客户端:

 1 public class ClientDemoLoad {
 2     public static void main(String[] args) throws InterruptedException {
 3         while (true){
 4             System.out.println("upload。。");
 5             new Thread(new Runnable() {
 6                 Socket socket =null;
 7                 InputStream inputStream =null;
 8                 OutputStream outputStream =null;
 9                 FileInputStream inputStreamClient =null;
10                 @Override
11                 public void run() {
12                     try {
13                         socket = new Socket("127.0.0.1",6666);
14                         // 从客户端的磁盘中获取需要上传的png
15                         FileInputStream inputStreamClient = new FileInputStream("D:\\loadClient.png");
16                          outputStream = socket.getOutputStream();
17                         byte[] bytes = new byte[1024];
18                         int len;
19                         while ((len =inputStreamClient.read(bytes))!=-1 ){
20                             outputStream.write(bytes,0,len);
21                         }
22                         // 读取服务器端传来的接受完毕的信息
23                         // 创建客户的接口,
24                          inputStream = socket.getInputStream();
25                         byte[] bytes1 = new byte[1024];
26                         int lengh;
27                         // 为了避免发生阻塞
28                         while((lengh = inputStream.read(bytes1))!=-1){
29                             String string = new String(bytes1,0,lengh);
30                             System.out.println(string);
31                             // 为了避免read可能造成的阻塞
32                             if (lengh<1024){
33                                 break;
34                             }
35                         }
36                         inputStream.close();
37                         outputStream.close();
38                         inputStreamClient.close();
39                     } catch (IOException e) {
40                         e.printStackTrace();
41                     }
42                     }
43             }).start();
44             Thread.sleep(1000);
45         }
46 
47 
48         // 反馈--这个是客户端输出的,但是没有接受方,所以肯定不会写出来的
49 //        OutputStream outputStreamToServes = socket.getOutputStream();
50 //        outputStreamToServes.write("loadin Over".getBytes());
51 
52     }
53 }

 

posted @ 2019-08-28 19:25  Gookiki  阅读(403)  评论(0编辑  收藏  举报