网络编程案例之文件上传


/*

 * 文件上传 服务器端

 *

 */

publicclass TCPServer {

    publicstaticvoid main(String[] args) throwsIOException {

        //1,创建服务器,等待客户端连接

        ServerSocket serverSocket = newServerSocket(8888);

        Socket clientSocket = serverSocket.accept();

        //显示哪个客户端Socket连接上了服务器

        InetAddress ipObject = clientSocket.getInetAddress();//得到IP地址对象

        String ip = ipObject.getHostAddress(); //得到IP地址字符串

        System.out.println("小样,抓到你了,连接我!!" + "IP:" + ip);

       

        //7,获取Socket的输入流

        InputStream in = clientSocket.getInputStream();

        //8,创建目的地的字节输出流   D:\\upload\\192.168.74.58(1).jpg

        BufferedOutputStream fileOut = newBufferedOutputStream(new FileOutputStream("D:\\upload\\192.168.74.58(1).jpg"));

        //9,把Socket输入流中的数据,写入目的地的字节输出流中

        byte[] buffer = newbyte[1024];

        int len = -1;

        while((len = in.read(buffer)) != -1){

            //写入目的地的字节输出流中

            fileOut.write(buffer, 0, len);

        }

       

        //-----------------反馈信息---------------------

        //10,获取Socket的输出流, 作用:写反馈信息给客户端

        OutputStream out = clientSocket.getOutputStream();

        //11,写反馈信息给客户端

        out.write("图片上传成功".getBytes());

       

        out.close();

        fileOut.close();

        in.close();

        clientSocket.close();

        //serverSocket.close();

    }

}

 

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

/*

 * 文件上传 客户端

 *

 * publicvoid shutdownOutput()  禁用此Socket的输出流,间接的相当于告知了服务器数据写入完毕

 */

publicclass TCPClient {

    publicstaticvoid main(String[] args) throwsIOException {

        //2,创建客户端Socket,连接服务器

        Socket socket = new Socket("192.168.74.58", 8888);

        //3,获取Socket流中的输出流,功能:用来把数据写到服务器

        OutputStream out = socket.getOutputStream();

        //4,创建字节输入流,功能:用来读取数据源(图片)的字节

        BufferedInputStream fileIn = newBufferedInputStream(new FileInputStream("D:\\NoDir\\test.jpg"));

        //5,把图片数据写到Socket的输出流中(把数据传给服务器)

        byte[] buffer = newbyte[1024];

        int len = -1;

        while ((len = fileIn.read(buffer)) != -1){

            //把数据写到Socket的输出流中

            out.write(buffer, 0, len);

        }

        //6,客户端发送数据完毕,结束Socket输出流的写入操作,告知服务器端

        socket.shutdownOutput();

 

        //-----------------反馈信息---------------------

        //12,获取Socket的输入流  作用:读反馈信息

        InputStream in = socket.getInputStream();

        //13,读反馈信息

        byte[] info = newbyte[1024];

        //把反馈信息存储到info数组中,并记录字节个数

        int length = in.read(info);

        //显示反馈结果

        System.out.println( newString(info, 0, length) );

       

        //关闭流

        in.close();

        fileIn.close();

        out.close();

        socket.close();

    }

}

多线程上传:

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

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

/*

 * 文件上传多线程版本, 服务器端

 */

public class TCPServer {

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

        //1,创建服务器,等待客户端连接

        ServerSocketserverSocket = newServerSocket(6666);

       

        //实现多个客户端连接服务器的操作

        while(true){

            final Socket clientSocket =serverSocket.accept();

            //启动线程,完成与当前客户端的数据交互过程

            new Thread(){

                public voidrun() {

                    try{

                        //显示哪个客户端Socket连接上了服务器

                        InetAddressipObject = clientSocket.getInetAddress();//得到IP地址对象

                        Stringip = ipObject.getHostAddress(); //得到IP地址字符串

                        System.out.println("小样,抓到你了,连接我!!" + "IP:"+ ip);

                       

                        //7,获取Socket的输入流

                        InputStreamin = clientSocket.getInputStream();

                        //8,创建目的地的字节输出流   D:\\upload\\192.168.74.58(1).jpg

                        BufferedOutputStreamfileOut = new BufferedOutputStream(new FileOutputStream("D:\\upload\\"+ip+"("+System.currentTimeMillis()+").jpg"));

                        //9,把Socket输入流中的数据,写入目的地的字节输出流中

                        byte[] buffer = newbyte[1024];

                        int len = -1;

                        while((len = in.read(buffer)) != -1){

                            //写入目的地的字节输出流中

                            fileOut.write(buffer,0, len);

                        }

                       

                        //-----------------反馈信息---------------------

                        //10,获取Socket的输出流, 作用:写反馈信息给客户端

                        OutputStreamout = clientSocket.getOutputStream();

                        //11,写反馈信息给客户端

                        out.write("图片上传成功".getBytes());

                       

                        out.close();

                        fileOut.close();

                        in.close();

                        clientSocket.close();

                    }catch(IOException e){

                        e.printStackTrace();

                    }

                };

            }.start();

        }

 

        //serverSocket.close();

    }

}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值