java socket传送文件

java socket传送文件,第1张

客户端代码如下:

import java.io.DataOutputStream  

import java.io.File  

import java.io.FileInputStream  

import java.io.IOException  

import java.net.InetSocketAddress  

import java.net.Socket  

  

/** 

 * 文件发送客户端主程序 

 * @author admin_Hzw 

 * 

 */  

public class BxClient {  

      

    /** 

     * 程序main方法 

     * @param args 

     * @throws IOException 

     */  

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

        int length = 0  

        double sumL = 0   

        byte[] sendBytes = null  

        Socket socket = null  

        DataOutputStream dos = null  

        FileInputStream fis = null  

        boolean bool = false  

        try {  

            File file = new File("D:/天啊.zip") //要传输的文件路径  

            long l = file.length()   

            socket = new Socket()    

            socket.connect(new InetSocketAddress("127.0.0.1", 48123))  

            dos = new DataOutputStream(socket.getOutputStream())  

            fis = new FileInputStream(file)        

            sendBytes = new byte[1024]    

            while ((length = fis.read(sendBytes, 0, sendBytes.length)) > 0) {  

                sumL += length    

                System.out.println("已传输:"+((sumL/l)*100)+"%")  

                dos.write(sendBytes, 0, length)  

                dos.flush()  

            }   

            //虽然数据类型不同,但JAVA会自动转换成相同数据类型后在做比较  

            if(sumL==l){  

                bool = true  

            }  

        }catch (Exception e) {  

            System.out.println("客户端文件传输异常")  

            bool = false  

            e.printStackTrace()    

        } finally{    

            if (dos != null)  

                dos.close()  

            if (fis != null)  

                fis.close()     

            if (socket != null)  

                socket.close()      

        }  

        System.out.println(bool?"成功":"失败")  

    }  

}

服务端代码如下:

import java.io.DataInputStream  

import java.io.File  

import java.io.FileOutputStream  

import java.io.IOException  

import java.net.ServerSocket  

import java.net.Socket  

import java.util.Random  

import com.boxun.util.GetDate  

  

  

/** 

 * 接收文件服务 

 * @author admin_Hzw 

 * 

 */  

public class BxServerSocket {  

      

    /** 

     * 工程main方法 

     * @param args 

     */  

    public static void main(String[] args) {  

        try {  

            final ServerSocket server = new ServerSocket(48123)  

            Thread th = new Thread(new Runnable() {  

                public void run() {  

                    while (true) {  

                        try {    

                            System.out.println("开始监听...")  

                            /* 

                             * 如果没有访问它会自动等待 

                             */  

                            Socket socket = server.accept()  

                            System.out.println("有链接")  

                            receiveFile(socket)  

                        } catch (Exception e) {  

                            System.out.println("服务器异常")  

                            e.printStackTrace()  

                        }  

                    }  

                }  

            })  

            th.run() //启动线程运行  

        } catch (Exception e) {  

            e.printStackTrace()  

        }       

    }  

  

    public void run() {  

    }  

  

    /** 

     * 接收文件方法 

     * @param socket 

     * @throws IOException 

     */  

    public static void receiveFile(Socket socket) throws IOException {  

        byte[] inputByte = null  

        int length = 0  

        DataInputStream dis = null  

        FileOutputStream fos = null  

        String filePath = "D:/temp/"+GetDate.getDate()+"SJ"+new Random().nextInt(10000)+".zip"  

        try {  

            try {  

                dis = new DataInputStream(socket.getInputStream())  

                File f = new File("D:/temp")  

                if(!f.exists()){  

                    f.mkdir()    

                }  

                /*   

                 * 文件存储位置   

                 */  

                fos = new FileOutputStream(new File(filePath))      

                inputByte = new byte[1024]     

                System.out.println("开始接收数据...")    

                while ((length = dis.read(inputByte, 0, inputByte.length)) > 0) {  

                    fos.write(inputByte, 0, length)  

                    fos.flush()      

                }  

                System.out.println("完成接收:"+filePath)  

            } finally {  

                if (fos != null)  

                    fos.close()  

                if (dis != null)  

                    dis.close()  

                if (socket != null)  

                    socket.close()   

            }  

        } catch (Exception e) {  

            e.printStackTrace()  

        }  

    }  

}

很简单,就是把多个文件“变成”一个文件传送就可以了,每个文件都是一个流,把这些流输入到一个流中合并流传输即可,这个是基本思路。实现差不多以下两个方法

1、直接流拼接,循环要传输的文件列表,多个InputStream,然后输出到一个OutputStream,这个out就是发送数据的端口,为了接收端能够识别每个文件从而分割流,需要每个流中结尾添加分隔符。其实这就是HTTP文件上传的做法。

2、就比较简单了,职业使用ZIP工具包吧需要传输的多文件压缩成一个文件传输,接收端直接解压缩就完事。

需要注意的是,发送多文件上传你需要提取计算好总传输量字节大小放在传输报文头部告诉接收端你要发送的数据有多大,不然接收端可能无法完整接收数据。

通过socket可以用如下方式进行。

1.启动服务端代码。

2.启动客户端自动连接服务端。

3.服务端上传文件,保存文件和路径。

4.将路径发送给连接服务端的客户端。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/tougao/11780861.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-18
下一篇 2023-05-18

发表评论

登录后才能评论

评论列表(0条)

保存