`
linshow26
  • 浏览: 87089 次
文章分类
社区版块
存档分类
最新评论

Java Socket编程 文件传输(客户端从服务器下载一个文件)

 
阅读更多
服务器(Server)

[java] view plaincopy
package com.socket.sample; 
 
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); 
                        // 从包含的输入流中读取一定数量的字节,并将它们存储到缓冲区数组 b 
                        // 中。以整数形式返回实际读取的字节数。在输入数据可用、检测到文件末尾 (end of file) 
                        // 或抛出异常之前,此方法将一直阻塞。 
                    } 
 
                    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(); 
    } 

客户端工具(SocketTool)
[java] view plaincopy
package com.socket.sample; 
 
import java.io.BufferedInputStream; 
import java.io.DataInputStream; 
import java.io.DataOutputStream; 
import java.net.Socket; 
 
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) { 
 
        } 
    } 


客户端(Client)

[java] view plaincopy
package com.socket.sample; 
 
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 = "Windows"; 
 
    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 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().getMessage(); 
    } 


测试是成功的,在DOS命令行下编译~~~
分享到:
评论

相关推荐

    SOCKET TCP 文件传输 客户端 服务器端 client svever

    SOCKET TCP 文件传输 客户端 服务器端 client svever 实现简易文件传输功能

    Java Socket PC端传输文件简易服务器客户端

    Java Socket编程 PC端程序 用来传输文件 包括服务器、客户端

    Java socket编程实现两台主机间的通信

    2..instant messaging:使用 Java Socket 编程可以实现即时通信和文件传输。 3.远程教育:使用 Java Socket 编程可以实现远程教育中的实时通信和数据传输。 四、Java Socket 编程的优点 Java Socket 编程有许多...

    Java Socket编程实现的简单多线程WEB服务器

    在本文中,我们将详细介绍如何使用 Java 的 Socket 编程实现一个简单的多线程 WEB 服务器。 Socket 编程简介 Socket 编程是 Java 网络编程的基础,它允许开发者创建客户端和服务器端的网络应用程序。Socket 是一种...

    华科-计算机网络实验报告-Java Socket编程-网络组建实验.docx

    Java Socket 编程是计算机网络实验中的一个重要组成部分,它允许开发者创建可以在网络上传输数据的应用程序。下面是关于 Java Socket 编程在计算机网络实验中的应用的知识点总结。 Java Socket 编程简介 Java ...

    JAVA实现远程文件读取

    Socket编程可以分为两个部分:客户端编程和服务器端编程。 1.1 客户端编程 在RemoteFileClient类中,我们创建了一个Socket对象,并使用其连接到RemoteFileServer。客户端编程的主要步骤包括: * 创建Socket对象 *...

    Java网络编程实践课程设计报告.pdf

    客户端/服务器端编程是 Java 网络编程的核心技术之一。客户端/服务器端编程可以实现客户端和服务器端之间的通信、数据传输和资源共享等功能。客户端/服务器端编程可以使用 Socket 编程、HTTP 编程等技术来实现。 ...

    Java网络编程实验报告.pdf

    本实验报告主要介绍了Java网络编程的基本概念和实现方法,通过设计和实现一个简单的客户端/服务器应用程序,了解Java网络编程的基本原理和实现方法。 知识点1:Java 网络编程基础 Java 网络编程是指使用 Java 语言...

    网络编程,用Java实现服务器与客户端之间的交互教学

    6. TCP协议:TCP协议是一种面向连接的协议,能够保证传输数据的安全,应用十分广泛,例如下载文件、浏览网页等。 7. UDP协议:UDP协议是一种非面向连接的协议,效率高但是不安全。 8. IP地址:IP地址是互联网协议...

    Java_Socket_编程.ppt

    3. 服务器监听到客户端的连接请求,创建一个 Socket,与客户端进行通信。 4. 建立接收和发送两个缓存区,并打开 Socket 及其输入、输出流。 5. 根据协议读写 Socket 内容。 6. 通信结束后关闭 Socket。 服务器端...

    Socket编程文件上传源代码案例

    一般的tcp网络编程分为客户端和服务器端,用Socket对象进行客户端与服务器端的数据交流,用IO流技术充当桥梁。本案例详细的阐述了这一过程。

    Java Socket 编程模拟Ftp

    1、本项目是使用Java socket 编程来模拟Ftp,严格按照M-V-C架构分包分类,并实现Swing界面,Ftp使用TCP端口21传输控制信息,使用TCP端口20来传输文件数据。 2、本项目默认使用TCP端口4321来传输控制信息,使用TCP...

    华科-计算机网络实验报告-Java_Socket编程-网络组建实验.docx

    "华科-计算机网络实验报告-Java_Socket编程-网络组建实验.docx" 这份实验报告主要涵盖了计算机网络实验的两个部分:Socket 编程和网络组建实验。下面是对这两部分的详细解释和知识点总结: Socket 编程 Socket ...

    基于TCP/IP协议的Socket编程

    Java实现的Socket编程是基于TCP/IP协议的,它提供了一个可靠的数据流服务,可以实现客户端和服务器之间的数据交换。Java中的Socket类和ServerSocket类是两种基本的套接字类,Socket类用于建立客户端和服务器之间的...

    TCP与UDP客户服务端实现大小写及SOCKET编程实现聊天程序

    在SOCKET编程实现聊天程序中,使用Java语言编写了一个简单的客户端和服务器端程序。服务器端使用ServerSocket来监听客户端的连接请求,而客户端使用Socket来连接服务器端。 在服务器端,使用BufferedReader和...

    Java-web客户端和服务器端交互的原理.doc

    整个过程就是当一个客户端向服务器端发送一个请求(request),然后Web服务器返回一个响应(response),之后连接就关闭了,在服务器端此时是没有保存连接的信息。 在Java中,客户端和服务器端交互的实现是通过套接...

    JAVA文件传输的实现.rar

    Socket编程:利用Java的Socket API实现客户端和服务器之间的通信,建立TCP连接进行数据传输。 文件流操作:使用Java的文件输入输出流(FileInputStream、FileOutputStream)读取和写入文件内容。 多线程处理:通过多...

    使用Java的网络编程实现一个简单的文件传输系统.txt

    这个代码实现了一个简单的文件传输服务器,可以接收客户端的连接请求并将指定的文件发送给客户端。主要使用了Java的网络编程和文件操作技术。 首先定义了一个FileTransferServer类,在main方法中创建了一个...

    socket编程 实现服务器和客户的通信

    JAVA实现的socket 实现服务器和客户端之间的传输

    java socket 实现SMTP协议 发送邮件.docx

    在这里,我们介绍了 Java Socket 的基本使用方法,并实现了一个简单的 SMTP 客户端。通过这个示例,我们可以了解 Java Socket 的使用方法,并学习如何实现 SMTP 协议来发送邮件。 扩展阅读 * Java Socket 编程 * ...

Global site tag (gtag.js) - Google Analytics