java-服务器技术-图片上传小程序

壁画不多说

客户端:

import java.io.*;
import java.net.Socket;



public class UploadPicClient {
    public static void main(String[]args) throws IOException {

        //1,创建socket
        Socket s = new Socket("192.168.43.5",10007);//我的Ip地址是192.168.43.5,自己传自己

//2,读取源图片。
        File picFile = new File("") ;
                FileInputStream fis = new FileInputStream(picFile);

//3,目的是socket输出流。
        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) ;
            System. out. println (new String (bufIn, 0, lenIn));


//关闭。
            fis.close() ;
            s.close() ;
        }
    }
}

服务端:

import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;

public class UploadPicServer {
    public static void main(String[] args) throws IOException {

        //创建服务器
        ServerSocket serverSocket = new ServerSocket(10007);


        while (true) {//循环,可多次上传图片



            Socket socket = serverSocket.accept();//阻塞状态,等待下一个socket


            InputStream fis = socket.getInputStream();//getInputstream();返回的是InoutStream的对象所以要用超类
            String s=socket.getInetAddress().getHostAddress();
            System.out.println(s+"......connect");


            File dir=new File("e:\\UploadPics");
            if(!dir.exists())
            {
                dir.mkdir();
            }

            int counter=1;
            File fIle = new File(dir,s+"("+counter+")"+".ipg");//为了解决一个人上传多张照片重命名的问题,我们使用iP地址以及计数器来编号

            while(fIle.exists())//第一次创建文件,但是没有写入,所以为假,不执行。
            {
                counter++;
                fIle =new File(dir,s+"("+counter+")"+".ipg");
            }

            FileOutputStream fileOutputStream = new FileOutputStream(fIle);//创建流

            byte[] bytes = new byte[1024];
            int len = 0;
            while ((len = fis.read(bytes)) != -1) {
                fileOutputStream.write(bytes, 0, len);//写入数据,使文件不为空
            }

            //给客户回消息
            OutputStream out = socket.getOutputStream();
            out.write("上传成功".getBytes());

            //关闭资源
            socket.close();//关闭客户端
            fileOutputStream.close();//关闭文件输出流

        }
    }
}
/**
 * 问题就来了,虽然解决的一个人传多张图片命名的问题,但是,如果张三连接着服务器正在传输图片的时候,李四也想传,连接了服务器,但是他不能传
 * 因为,服务器的主线程正在传张三的图片
 * 所以,要考虑使用并发访问,也就是多线程技术。
 */

服务端改进,满足多个用户同时进行传输:

public class UploadPicServer {
    public static void main(String[] args) throws IOException {

        //创建服务器
        ServerSocket serverSocket = new ServerSocket(10007);


        while (true) {//循环,可多次上传图片



            Socket socket = serverSocket.accept();//阻塞状态,等待下一个socket


            new Thread(new UploadPic(socket)).start();
            }
 }
 }
            




import java.io.*;
import java.net.Socket;

public class UploadPic implements Runnable {

    private Socket socket;

    public UploadPic(Socket socket) {
        this.socket = socket;
    }

    @Override
    public void run() {
        try {
            InputStream fis = socket.getInputStream();//getInputstream();返回的是InoutStream的对象所以要用超类
            String s = socket.getInetAddress().getHostAddress();
            System.out.println(s + "......connect");


            File dir = new File("e:\\UploadPics");
            if (!dir.exists()) {
                dir.mkdir();
            }

            int counter = 1;
            File fIle = new File(dir, s + "(" + counter + ")" + ".ipg");//为了解决一个人上传多张照片重命名的问题,我们使用iP地址以及计数器来编号

            while (fIle.exists())//第一次创建文件,但是没有写入,所以为假,不执行。
            {
                counter++;
                fIle = new File(dir, s + "(" + counter + ")" + ".ipg");
            }

            FileOutputStream fileOutputStream = new FileOutputStream(fIle);//创建流

            byte[] bytes = new byte[1024];
            int len = 0;
            while ((len = fis.read(bytes)) != -1) {
                fileOutputStream.write(bytes, 0, len);//写入数据,使文件不为空
            }

            //给客户回消息
            OutputStream out = socket.getOutputStream();
            out.write("上传成功".getBytes());

            //关闭资源
            socket.close();//关闭客户端
            fileOutputStream.close();//关闭文件输出流
        }catch (IOException i)
        {
            
        }
    }
}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值