Java基于Socket文件传输示例

简介: 采用了缓冲输入/输出流来包装输出流,再采用数据输入/输出输出流进行包装,加快传输的速度。 1.服务器端 package sterning; import java.io.BufferedInputStream; import java.

采用了缓冲输入/输出流来包装输出流,再采用数据输入/输出输出流进行包装,加快传输的速度。

1.服务器端

package sterning;
import java.io.BufferedInputStream;

import java.io.DataInputStream;

import java.io.DataOutputStream;

import java.io.File;

import java.io.FileInputStream;

import java.net.ServerSocket;

import java.net.Socket;



public class ServerTest {

    int port = 8821;



    void start() {

        Socket s = null;

        try {

            ServerSocket ss = new ServerSocket(port);

            while (true) {

                // 选择进行传输的文件

                String filePath = "D://lib.rar";

                File fi = new File(filePath);



                System.out.println("文件长度:" + (int) fi.length());



                // public Socket accept() throws

                // IOException侦听并接受到此套接字的连接。此方法在进行连接之前一直阻塞。



                s = ss.accept();

                System.out.println("建立socket链接");

                DataInputStream dis = new DataInputStream(new BufferedInputStream(s.getInputStream()));

                dis.readByte();



                DataInputStream fis = new DataInputStream(new BufferedInputStream(new FileInputStream(filePath)));

                DataOutputStream ps = new DataOutputStream(s.getOutputStream());

                //将文件名及长度传给客户端。这里要真正适用所有平台,例如中文名的处理,还需要加工,具体可以参见Think In Java 4th里有现成的代码。

                ps.writeUTF(fi.getName());

                ps.flush();

                ps.writeLong((long) fi.length());

                ps.flush();



                int bufferSize = 8192;

                byte[] buf = new byte[bufferSize];



                while (true) {

                    int read = 0;

                    if (fis != null) {

                        read = fis.read(buf);

                    }



                    if (read == -1) {

                        break;

                    }

                    ps.write(buf, 0, read);

                }

                ps.flush();

                // 注意关闭socket链接哦,不然客户端会等待server的数据过来,

                // 直到socket超时,导致数据不完整。                

                fis.close();

                s.close();                

                System.out.println("文件传输完成");

            }



        } catch (Exception e) {

            e.printStackTrace();

        }

    }



    public static void main(String arg[]) {

        new ServerTest().start();

    }

}
 

2.socket的Util辅助类

package sterning;
import java.net.*;

import java.io.*;



public class ClientSocket {

    private String ip;



    private int port;



    private Socket socket = null;



    DataOutputStream out = null;



    DataInputStream getMessageStream = null;



    public ClientSocket(String ip, int port) {

        this.ip = ip;

        this.port = port;

    }



    /**

     * 创建socket连接

     * 

     * @throws Exception

     *             exception

     */

    public void CreateConnection() throws Exception {

        try {

            socket = new Socket(ip, port);

        } catch (Exception e) {

            e.printStackTrace();

            if (socket != null)

                socket.close();

            throw e;

        } finally {

        }

    }



    public void sendMessage(String sendMessage) throws Exception {

        try {

            out = new DataOutputStream(socket.getOutputStream());

            if (sendMessage.equals("Windows")) {

                out.writeByte(0x1);

                out.flush();

                return;

            }

            if (sendMessage.equals("Unix")) {

                out.writeByte(0x2);

                out.flush();

                return;

            }

            if (sendMessage.equals("Linux")) {

                out.writeByte(0x3);

                out.flush();

            } else {

                out.writeUTF(sendMessage);

                out.flush();

            }

        } catch (Exception e) {

            e.printStackTrace();

            if (out != null)

                out.close();

            throw e;

        } finally {

        }

    }



    public DataInputStream getMessageStream() throws Exception {

        try {

            getMessageStream = new DataInputStream(new BufferedInputStream(socket.getInputStream()));

            return getMessageStream;

        } catch (Exception e) {

            e.printStackTrace();

            if (getMessageStream != null)

                getMessageStream.close();

            throw e;

        } finally {

        }

    }



    public void shutDownConnection() {

        try {

            if (out != null)

                out.close();

            if (getMessageStream != null)

                getMessageStream.close();

            if (socket != null)

                socket.close();

        } catch (Exception e) {



        }

    }

}
3.客户端
 
package sterning;



import java.io.BufferedOutputStream;

import java.io.DataInputStream;

import java.io.DataOutputStream;

import java.io.FileOutputStream;



public class ClientTest {

    private ClientSocket cs = null;



    private String ip = "localhost";// 设置成服务器IP



    private int port = 8821;



    private String sendMessage = "Windwos";



    public ClientTest() {

        try {

            if (createConnection()) {

                sendMessage();

                getMessage();

            }



        } catch (Exception ex) {

            ex.printStackTrace();

        }

    }



    private boolean createConnection() {

        cs = new ClientSocket(ip, port);

        try {

            cs.CreateConnection();

            System.out.print("连接服务器成功!" + "/n");

            return true;

        } catch (Exception e) {

            System.out.print("连接服务器失败!" + "/n");

            return false;

        }



    }



    private void sendMessage() {

        if (cs == null)

            return;

        try {

            cs.sendMessage(sendMessage);

        } catch (Exception e) {

            System.out.print("发送消息失败!" + "/n");

        }

    }



    private void getMessage() {

        if (cs == null)

            return;

        DataInputStream inputStream = null;

        try {

            inputStream = cs.getMessageStream();

        } catch (Exception e) {

            System.out.print("接收消息缓存错误/n");

            return;

        }



        try {

            //本地保存路径,文件名会自动从服务器端继承而来。

            String savePath = "E://";

            int bufferSize = 8192;

            byte[] buf = new byte[bufferSize];

            int passedlen = 0;

            long len=0;

            

            savePath += inputStream.readUTF();

            DataOutputStream fileOut = new DataOutputStream(new BufferedOutputStream(new BufferedOutputStream(new FileOutputStream(savePath))));

            len = inputStream.readLong();

            

            System.out.println("文件的长度为:" + len + "/n");

            System.out.println("开始接收文件!" + "/n");

                    

            while (true) {

                int read = 0;

                if (inputStream != null) {

                    read = inputStream.read(buf);

                }

                passedlen += read;

                if (read == -1) {

                    break;

                }

                //下面进度条本为图形界面的prograssBar做的,这里如果是打文件,可能会重复打印出一些相同的百分比

                System.out.println("文件接收了" +  (passedlen * 100/ len) + "%/n");

                fileOut.write(buf, 0, read);

            }

            System.out.println("接收完成,文件存为" + savePath + "/n");



            fileOut.close();

        } catch (Exception e) {

            System.out.println("接收消息错误" + "/n");

            return;

        }

    }



    public static void main(String arg[]) {

        new ClientTest();

    }

}

 

这就实现了从服务器端向客户端发送文件的过程,当然,反过来,也一样.稍有不同.代码中对跨平台的细节没有实现,有时间或兴趣的朋友可以提供一下.

 
目录
相关文章
|
14天前
|
存储 Java
Java中的HashMap和TreeMap,通过具体示例展示了它们在处理复杂数据结构问题时的应用。
【10月更文挑战第19天】本文详细介绍了Java中的HashMap和TreeMap,通过具体示例展示了它们在处理复杂数据结构问题时的应用。HashMap以其高效的插入、查找和删除操作著称,而TreeMap则擅长于保持元素的自然排序或自定义排序,两者各具优势,适用于不同的开发场景。
26 1
|
25天前
|
监控 Python
视频监控笔记(五):Jetson Nano上通过Tkinter和Socket实现GUI文件传输
这篇文章介绍了如何使用Python的Tkinter和Socket在Jetson Nano上实现图形用户界面(GUI)的文件传输系统,包括服务器端和客户端,能够进行文件的发送和接收,并展示传输进度。
38 1
|
3月前
|
存储 Java API
【Azure 存储服务】Java Storage SDK 调用 uploadWithResponse 代码示例(询问ChatGTP得代码原型后人力验证)
【Azure 存储服务】Java Storage SDK 调用 uploadWithResponse 代码示例(询问ChatGTP得代码原型后人力验证)
|
26天前
|
存储 缓存 Java
java基础:IO流 理论与代码示例(详解、idea设置统一utf-8编码问题)
这篇文章详细介绍了Java中的IO流,包括字符与字节的概念、编码格式、File类的使用、IO流的分类和原理,以及通过代码示例展示了各种流的应用,如节点流、处理流、缓存流、转换流、对象流和随机访问文件流。同时,还探讨了IDEA中设置项目编码格式的方法,以及如何处理序列化和反序列化问题。
58 1
java基础:IO流 理论与代码示例(详解、idea设置统一utf-8编码问题)
|
26天前
|
JSON 数据格式 Python
Socket学习笔记(一):python通过socket实现客户端到服务器端的文件传输
本文介绍了如何使用Python的socket模块实现客户端到服务器端的文件传输,包括客户端发送文件信息和内容,服务器端接收并保存文件的完整过程。
101 1
Socket学习笔记(一):python通过socket实现客户端到服务器端的文件传输
|
1月前
|
Java 流计算
Flink-03 Flink Java 3分钟上手 Stream 给 Flink-02 DataStreamSource Socket写一个测试的工具!
Flink-03 Flink Java 3分钟上手 Stream 给 Flink-02 DataStreamSource Socket写一个测试的工具!
35 1
Flink-03 Flink Java 3分钟上手 Stream 给 Flink-02 DataStreamSource Socket写一个测试的工具!
|
13天前
|
Java
[Java]Socket套接字(网络编程入门)
本文介绍了基于Java Socket实现的一对一和多对多聊天模式。一对一模式通过Server和Client类实现简单的消息收发;多对多模式则通过Server类维护客户端集合,并使用多线程实现实时消息广播。文章旨在帮助读者理解Socket的基本原理和应用。
14 1
|
30天前
|
存储 Java
什么是带有示例的 Java 中的交错数组?
什么是带有示例的 Java 中的交错数组?
42 9
|
24天前
|
Java
让星星⭐月亮告诉你,jdk1.8 Java函数式编程示例:Lambda函数/方法引用/4种内建函数式接口(功能性-/消费型/供给型/断言型)
本示例展示了Java中函数式接口的使用,包括自定义和内置的函数式接口。通过方法引用,实现对字符串操作如转换大写、数值转换等,并演示了Function、Consumer、Supplier及Predicate四种主要内置函数式接口的应用。
20 1
|
1月前
|
Java API 网络安全
Java 发送邮件示例
本示例展示了如何使用Java编程语言发送电子邮件。通过利用JavaMail API,这段代码实现了从配置SMTP服务器,设置邮件属性,到发送邮件的全过程,为开发者提供了实用的参考。