`

java 网络传输文件

    博客分类:
  • java
阅读更多
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();
    }
}
分享到:
评论

相关推荐

    Java网络文件传输

    Java网络文件传输是一种在计算机网络中通过Java编程语言实现的文件共享技术。它涉及网络通信协议、I/O流处理和多线程等核心概念。在这个主题中,我们将深入探讨Java如何实现这一功能,并通过源代码分析来理解其实现...

    用java代码编写的网络传输文件

    总的来说,这个“用java代码编写的网络传输文件”的程序深入涵盖了Java网络编程的核心概念,包括Socket通信、数据流操作以及可能的文件处理策略。对于理解网络编程和Java I/O系统有重要的实践意义。

    java实现文件互传

    在Java编程语言中,文件互传是一个常见的任务,特别是在分布式系统、网络编程或者客户端-服务器应用中。本项目提供了一种简单的实现方式,通过客户端和服务端的交互来完成文件的发送与接收。以下是对这个Java文件互...

    java网络文件传输(c/s)

    【Java网络文件传输(C/S)详解】 在网络开发中,文件传输是一项重要的功能,无论是文本文件还是图像文件,都需要能够高效、稳定地在网络之间传递。本文将深入探讨使用Java实现客户端/服务器(C/S)模式的文件传输...

    java局域网内互传文件

    总的来说,实现Java局域网内文件互传需要掌握网络编程基础,理解多线程的原理和实践,以及熟悉文件I/O操作。通过不断优化和调试,可以构建出稳定、高效的文件传输系统。在KC压缩包中可能包含了实现这一功能的源代码...

    java实现网络文件传输

    总结来说,"java实现网络文件传输"项目涵盖了网络编程的基本原理和实际应用,通过学习和实践这个项目,开发者可以深入了解Java Socket通信,文件I/O,以及如何设计可靠的网络文件传输系统。同时,分析源码有助于提升...

    如何利用Java实现QQ文件传输功能

    本知识点将围绕Java网络编程中的Socket通信和文件传输的实现原理进行详细探讨。 1. Java网络编程基础 Java网络编程提供了两个基本的类来实现网络通信,分别是Socket和ServerSocket类。Socket代表客户端的套接字,它...

    使用java实现网络文件的传输

    为了编译和运行Java网络文件传输程序,需要执行以下步骤: - 使用`javac`命令编译`.java`源文件,生成`.class`字节码文件。 - 在命令行中,分别使用`java SendFileSocket`启动服务器,和`java SendFileClient ...

    Java网络编程-Socket-文件传输小案例

    FileInputStream和FileOutputStream分别用于读取和写入本地文件,而Socket提供了InputStream和OutputStream,可以将这些本地I/O流与网络I/O流关联起来,实现文件数据的网络传输。 5. **字节流与缓冲区**:为了提高...

    java文件传输工具

    Java文件传输工具是一种基于Java开发的应用程序,设计用于实现基本的点对点(P2P)文件传输功能。这个工具提供了简单易用的界面,让用户能够方便地在两台计算机之间共享和移动文件。以下是对该工具核心特性和技术...

    Java 两台服务器之间传递文件

    在Java编程环境中,当涉及到两台服务器之间的文件传输时,主要涉及网络编程、I/O流处理和多线程等核心技术。下面将详细讲解这个过程,以及如何利用源码和工具来实现这一目标。 首先,我们需要了解Java中的网络编程...

    java文件传输源代码

    Java文件传输源代码是Java编程中的一个重要领域,它涉及到如何在不同的系统或网络环境中高效、安全地移动数据。在这个场景中,我们关注的是基于Java的简单、易懂且方便学习的实现方式。以下是对相关知识点的详细说明...

    Java文件夹复制(远程复制(网络传输),用于远程备份文件)

    `FileSelection` 类用于选择和组织待复制的文件,而 `BackupClient` 类则负责将这些文件通过网络传输到远程服务器进行备份。 1. **文件操作**: - **文件和目录处理**:`FileSelection` 类创建了一个 `File` 对象 ...

    java多线程网络传输文件(非同步)

    总的来说,"java多线程网络传输文件(非同步)"这个主题涉及到Java多线程、Socket编程以及文件I/O等核心知识。通过多线程实现并发处理客户端请求,利用Socket进行网络通信,以及处理文件的读写操作,这些是构建一个...

    java 网络文件传输

    Java网络文件传输是Java编程中一个重要的领域,它涉及到如何在不同的计算机之间高效、安全地交换数据。在Java中,我们可以使用多种方法实现文件的网络传输,这些方法通常基于TCP/IP协议栈,如Socket编程或者HTTP、...

    java信息互传网站

    链接http://zhidao.baidu.com/question/185175231.html指向了一个具体的问题页面,这里可能包含了关于Java网络编程、数据传输协议或API使用等方面的具体问题及解答。百度知道的特点在于其问题的多样性和解答的即时性...

    JAVA文件传输P2P源码

    使用JAVA进行P2P文件传输,首先需要掌握JAVA编程基础,包括类、对象、接口、多线程、网络编程等。JAVA的Socket编程是实现P2P通信的关键,它提供了在两台计算机之间建立TCP连接的能力,使得数据可以流经这个连接进行...

    java网络文件传输

    Java网络文件传输是一种在两台计算机之间通过网络交换文件的技术,通常涉及到TCP/IP协议栈、套接字编程以及多线程等核心概念。本示例中的"FileTranClient"和"FileTranServer"是两个关键文件,分别代表客户端和服务器...

    java文件p2p传输

    Java P2P文件传输利用P2P网络架构,其中每个节点既是服务的消费者也是服务的提供者。在Java中,这通常涉及到创建客户端和服务器端的类,分别用于发起请求和响应请求。这些节点可以动态地加入和离开网络,形成一个去...

    java socket 大文件传输,快速传输(包的分片,组装)源码

    Java Socket 大文件传输是网络编程中的一个关键领域,它涉及到高效的数据传输、包的分片与组装,以及网络协议的选择。在这个场景下,我们通常会用到TCP和UDP这两种传输层协议,以及Java的非阻塞I/O(NIO)技术。下面...

Global site tag (gtag.js) - Google Analytics