zoukankan      html  css  js  c++  java
  • TCP上传图片

    上传图片注意的问题:

    1. 图片重名问题
    2. 多客户端并发访问时的等待问题(这个不仅是上传图片的问题,只要多客户端与服务端连接就会发生)

    解决:

    1. 把客户端的ip和count(计数)标示作为图片的名字
    2. 利用多线程技术实现并发访问

    TCP上传图片的客户端:

    import java.io.File;
    import java.io.FileInputStream;
    import java.io.IOException;
    import java.io.InputStream;
    import java.io.OutputStream;
    import java.net.Socket;
    
    public class UpLoadPicClient {
    
        public static void main(String[] args) throws Exception, IOException {
    
            System.out.println("客户端开启......");
            //1.创建socket客户端
            Socket s = new Socket("192.168.17.1",10000);
            
            File picFile = new File("1.jpg");
            
            FileInputStream fis = new FileInputStream(picFile);
            
            OutputStream out = s.getOutputStream();
            
            byte[] buf = new byte[1024];
            
            int len = 0; 
            while((len = fis.read(buf))!=-1){
                out.write(buf, 0, len);
            }
            //告诉服务端写完了
            s.shutdownOutput();
            
            //读取服务器端的数据
            InputStream in = s.getInputStream();
            byte[] bufIn =new byte[1024];
            int lenIn = in.read(bufIn);
            String str = new String(bufIn,0,lenIn);
            System.out.println(str);
            
            fis.close();
            s.close();
                    
            
        }
    
    }

    TCP上传图片的服务端:

    import java.io.File;
    import java.io.FileOutputStream;
    import java.io.InputStream;
    import java.io.OutputStream;
    import java.net.ServerSocket;
    import java.net.Socket;
    
    public class UpLoadPicServer {
    
        public static void main(String[] args) throws Exception {
            
            System.out.println("服务端开启.....");
            //服务端对象
            ServerSocket ss = new ServerSocket(10000);
            while(true){//服务器端一直是开启状态
                
            Socket s = ss.accept();//主线程唯一的任务是不断的等待客户端的连接
            //至于每一个连接进来的客户端索要进行的任务,交给其他线程来完成
            //这就实现了多客户端的并发访问
            //这就是服务器端的原理
            
                
            new Thread(new UpLoadPic(s)).start();//为每一个连接上的客户端开辟一条线程
            
            }
    //        ss.close(); //服务器端就不需要关闭了
            
            /*
             * 服务器端的基本技术:
             * 1.ServerSocket
             * 2.IO流
             * 3.多线程
             */
            
        }
    
    }

    客户端连接后所要进行的任务(线程):

    import java.io.File;
    import java.io.FileNotFoundException;
    import java.io.FileOutputStream;
    import java.io.InputStream;
    import java.io.OutputStream;
    import java.net.Socket;
    
    public class UpLoadPic implements Runnable {
        private Socket s;
        
        public UpLoadPic(Socket s) {
            super();
            this.s = s;
        }
    
        @Override
        public void run() {
            
            String ip = s.getInetAddress().getHostAddress();
            System.out.println(ip+"...connected");
            
            
            File file = getFile("server_pic",ip);//服务端将图片保存的位置
            
            FileOutputStream fos;
            try {
                fos = new FileOutputStream(file);
                InputStream in = s.getInputStream();
                
                int len = 0;
                byte[] buf = new byte[1024];
                while((len = in.read(buf))!=-1){
                    fos.write(buf,0,len);
                }
                
                //回馈客户端数据
                OutputStream out = s.getOutputStream();
                out.write("上传图片成功".getBytes());
                
                fos.close();
                s.close();
            } catch (Exception e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            
            
        }
        public static File getFile(String dir,String ip) {
            File pic_dir = new File(dir);
            if(!pic_dir.exists()){
                pic_dir.mkdir();
            }
            
            int count = 1;
            File file = new File(pic_dir,ip+"("+count+").jpg");//解决图片重名的问题
            while(file.exists()){
                count++;
                file = new File(pic_dir,ip+"("+count+").jpg");
            }
            return file;
        }
    
    }
  • 相关阅读:
    POJ1985 树的直径(BFS
    POJ2186 强连通分量+缩点
    AIM Tech Round 5C. Rectangles 思维
    POJ2553 汇点个数(强连通分量
    hdu6370 并查集+dfs
    UVALive 7037:The Problem Needs 3D Arrays(最大密度子图)
    POJ 3155:Hard Life(最大密度子图)
    HDU 5527:Too Rich(DFS+贪心)***
    HDU 5534:Partial Tree(完全背包)***
    Wannafly挑战赛1:Treepath(DFS统计)
  • 原文地址:https://www.cnblogs.com/qjlbky/p/5932231.html
Copyright © 2011-2022 走看看