服务器(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命令行下编译~~~

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

  1. socket网络编程——基于socket通信实现对客户端与服务器间的文件互传

    客户端与服务器间的文件互传 基于socket的文件数据互传,将文件中所有的字符一一通过buf进行传递,为了更好地判断文件的 结束,通过添加文件结束标识符"#",当接收端接收到该字符 ...

  2. 客户端与服务器之间的文件传输,客户端与服务器的文件传输

    客户端与服务器的文件传输 内容精选 换一换 使用FTP上传文件时,写入失败,文件传输失败.该文档适用于Windows系统上的FTP服务.FTP服务端在NAT环境下,客户端需使用被动模式连接服务端.在这 ...

  3. linux服务器不允许下载文件,关于从Linux服务器下载Excel文件的问题

    本地下载文件可以,可是把代码放到Linux服务器下载下来的是jsp页面内容,下载的Excel文件中的内容则是jsp中展示的内容 相关代码 response.setCharacterEncoding(& ...

  4. Java Socket编程如何建立两者关系

    转自:http://developer.51cto.com/art/201003/190582.htm Java Socket编程需要大家详细的学习,有关的技术一直在不断的更新.那么要如何才能掌握好有 ...

  5. 循序渐进Java Socket网络编程(多客户端、信息共享、文件传输)

    目录[-] 一.TCP/IP协议 二.TCP与UDP 三.Socket是什么 四.Java中的Socket 五.基本的Client/Server程序 六.多客户端连接服务器 七.信息共享 八.文件传输 ...

  6. java socket 编程 客户机服务器_Java Socket编程服务器响应客户端实例代码

    通过输入流来读取客户端信息,相应的时候通过输出流来实现. 服务端类的代码: import java.io.BufferedReader; import java.io.IOException; imp ...

  7. Java Socket编程 - 基于TCP方式的二进制文件传输【转】http://blog.csdn.net/jia20003/article/details/8248221...

    此人博客挺好的,推荐一个! 一个基于Java Socket协议之上文件传输的完整示例,基于TCP通信完成. 除了基于TCP的二进制文件传输,还演示了JAVA Swing的一些编程技巧,Demo程序 实 ...

  8. Java Socket编程 - 基于TCP方式的二进制文件传输

    一个基于Java Socket协议之上文件传输的完整示例,基于TCP通信完成. 除了基于TCP的二进制文件传输,还演示了JAVA Swing的一些编程技巧,Demo程序 实现主要功能有以下几点: 1. ...

  9. java 网络编程之传输文件(一)

    需要建两个类,分别作为服务器(接收文件)和客户端(发送文件) 1.服务器类: import java.io.*; import java.net.InetAddress; import java.ne ...

最新文章

  1. 来自程序员的福利!用Python做一款翻译软件
  2. 008_logback配置语法
  3. Uipath 学习栏目基础教学:6Uipath发送邮件
  4. 如何编写自己的Java / Scala调试器
  5. 二阶自回归过程matlab,时间序列分析:二阶自回归过程
  6. java学习(79):GUL聊天窗口
  7. Linux终端登录微信,Ubuntu18.04安装微信(Linux通用)
  8. vue template 复用_Vue之组件、路由
  9. make install到指定安装目录
  10. 9月程序员新书:每一本拿出来都堪称经典,如:图灵奖获得者经典书
  11. python爬虫 提取豆瓣Top250电影信息
  12. 初探微信摇一摇周边与iBeacon
  13. 程序员,你应该读读这些书(豆瓣高分8.0 )
  14. cisco配置主机计算机连接,思科交换机路由器 连接配置步骤
  15. jquery end()用法
  16. リヴァイア / 鱼妹
  17. 算法高级(20)-集群容错算法
  18. C语言实现QQ聊天室小项目 [完整源码]
  19. [codeforces366C]Dima and Salad
  20. 学会制作html营销邮件,如何制作图文并茂的HTML邮件,做好EDM营销

热门文章

  1. 【MySQL查询】复杂查询:别名、外键join
  2. 【计组实验】P1 logisim完成单周期处理器开发 MIPS指令集
  3. Reactor中的Thread和Scheduler
  4. python中bs4_python bs4库
  5. JUC原子类-框架(一)
  6. C++学习笔记:(五)继承 多态
  7. ES集群添加IK分词器
  8. ThreadLocal 是什么?有哪些使用场景?——Spring系列学习笔记
  9. Linux网络深入DHCP、FTP原理和配置方法(详细图解)
  10. VRRP——虚拟路由器冗余协议