• TCP通信---文件上传案例、多线程文件上传


    目前大多数服务器都会提供文件上传的功能,由于文件上传需要数据的安全性和完整性,很明显需要使用TCP协议来实现。

    TCP通信需要创建一个服务器端程序和一个客户端程序,实现客户端向服务器端上传文件

    代码实例:

    l 首先编写服务器端程序,用来接收图片。

    //服务器端
    public class TCPServer {
        public static void main(String[] args) throws IOException {
            //明确端口号
            ServerSocket server=new ServerSocket(9999);
            //建立连接
            Socket socket=server.accept();
                     //显示哪个客户端Socket连接上了服务器
            InetAddress ipObject = server.getInetAddress();//得到IP地址对象
            String ip = ipObject.getHostAddress(); //得到IP地址字符串
            System.out.println("小样,抓到你了,连接我!!" + "IP:" + ip);
            //明确数据源,获取Socket的输入流
            InputStream in=socket.getInputStream();
            //明确目的地
            File file=new File("e:\haizei");
            //判断文件是否存在
            if(!file.exists()){
                file.mkdirs();
            }
            //创建接收文件名称(避免重复):域名+毫秒值+3位随机数
            String filename="oracle"+System.currentTimeMillis()+(Math.random()*9+1)*100+".jpg";
            FileOutputStream fos=new FileOutputStream(file+File.separator+filename);
            //开始复制
            int len=0;
            byte[] bytes=new byte[1024];
            while((len=in.read(bytes))!=-1){
                fos.write(bytes, 0, len);
            }
            //回复客户端
            OutputStream out=socket.getOutputStream();
            out.write("上传成功".getBytes());
            //释放资源
            fos.close();
            server.close();
            
        }
    }

    l 编写客户端,完成上传图片

    //客户端
    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("d:\haizei.jpg");
            int len=0;
            byte[] bytes=new byte[1024];
            while ((len=fis.read(bytes))!=-1) {
                out.write(bytes,0,len);
                
            }
            //传输的是字符数组,没有结束符,不能读取-1,要添加结束方法
            //告诉服务器端,不要再读了,到末尾了
            socket.shutdownOutput();
            //服务器回复
            InputStream in=socket.getInputStream();
            len=in.read(bytes);
            System.out.println(new String(bytes,0,len));
            //释放资源
            fis.close();
            socket.close();
        }
    }

    文件上传案例多线程版本

    实现服务器端可以同时接收多个客户端上传的文件。

    l 我们要修改服务器端代码

    public class UPload implements Runnable{
        private Socket socket;
        
        public  UPload(Socket socket){
            this.socket=socket;
        }
        public void run() {
            FileOutputStream fos=null;
            try{
                InetAddress ipObject = socket.getInetAddress();//得到IP地址对象
                String ip = ipObject.getHostAddress(); //得到IP地址字符串
                System.out.println("小样,抓到你了,连接我!!" + "IP:" + ip);
            //明确数据源
            InputStream in=socket.getInputStream();
            //明确目的地
            File file=new File("e:\haizei");
            //判断文件是否存在
            if(!file.exists()){
                file.mkdirs();
            }
            //域名+毫秒值+6位随机数
            String filename="oracle"+System.currentTimeMillis()+new Random().nextInt(999)+".jpg";
            fos=new FileOutputStream(file+File.separator+filename);
            //开始复制
            int len=0;
            byte[] bytes=new byte[1024];
            while((len=in.read(bytes))!=-1){
                fos.write(bytes, 0, len);
            }
            //回复客户端
            OutputStream out=socket.getOutputStream();
            out.write("上传成功".getBytes());
            }catch(IOException ex){
                ex.printStackTrace();
            }finally{
                //释放资源
                try {
                    fos.close();
                } catch (IOException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }
            

    创建实验类

    public class Demo {
        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();
            }        
        }
    }
  • 相关阅读:
    20200503:对象头具体包括什么
    20200504:对象怎么定位
    [WC2006]水管局长
    [HNOI2010]弹飞绵羊
    [国家集训队]Tree II
    [SDOI2008]洞穴勘测
    [SDOI2011]染色
    [BZOJ2959]长跑
    LCT感性瞎扯
    [BZOJ4998]星球联盟
  • 原文地址:https://www.cnblogs.com/dk2557/p/9558989.html
Copyright © 2020-2023  润新知