最近需要进行网络传输大文件,于是对基于socket的文件传输作了一个初步的了解。在一位网友提供的程序基础上,俺进行了一些加工,采用了缓冲输入/输出流来包装输出流,再采用数据输入/输出输出流进行包装,加快传输的速度。废话少说,先来看服务器端的程序。

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";// 设置成服务器IPprivate 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基于Socket文件传输示例(转)相关推荐

  1. Java基于Socket文件传输示例

    这个实例中的socket文件传输采用了缓冲输入/输出流来包装输出流,再采用数据输入/输出流进行包装,加快传输的速度. 先来看服务器端的程序. 1.服务器端 import java.io.Buffere ...

  2. Linux网络编程之socket文件传输示例

    本文所述示例程序是基于Linux平台的socket网络编程,实现文件传输功能.该示例是基于TCP流协议实现的socket网络文件传输程序.采用C语言编写.最终能够实现传输任何格式文件的文件传输程序. ...

  3. Java基于socket服务实现UDP协议的方法

    转载自 Java基于socket服务实现UDP协议的方法 这篇文章主要介绍了Java基于socket服务实现UDP协议的方法,通过两个简单实例分析了java通过socket实现UDP发送与接收的技巧, ...

  4. java qq 传送文件_如何利用Java实现QQ文件传输功能.pdf

    您所在位置:网站首页 > 海量文档 &nbsp>&nbsp计算机&nbsp>&nbspJava 如何利用Java实现QQ文件传输功能.pdf2页 本文 ...

  5. 【Linux系统与网络编程】16:Socket文件传输2

    Socket文件传输2 OVERVIEW Socket文件传输2 在socket文件传输1中使用了一种在buff缓冲数组后添加\0的方式实现文件的传输. 实现方法2:根据TCP在数据传输过程中进行粘包 ...

  6. python发送文件_Python实现基于HTTP文件传输实例

    本文实例讲述了Python实现基于HTTP文件传输的方法.分享给大家供大家参考.具体实现方法如下: 一.问题: 因为需要最近看了一下通过POST请求传输文件的内容 并且自己写了Server和Clien ...

  7. 服务器测试文件怎么创建,如何创建一个“FTPS”模拟服务器以单元测试Java中的文件传输...

    我有一个创建FTPS连接的CreateFTPConnection类.使用此连接传输文件.这里是TransferFile类的代码如何创建一个"FTPS"模拟服务器以单元测试Java中 ...

  8. Androidpcm格式音频编解码及播放,socket文件传输通讯,soundTouch变声框架 合成的一款仿微信语音按住说话的demo

    pcm格式音频编解码及播放,socket文件传输通讯,soundTouch变声框架 合成的一款仿微信语音按住播放的demo 效果:   -------------- 代码: MainActivity ...

  9. socket文件传输服务器,Socket文件传输(含服务端以及客户端源码)

    Socket文件传输 [实例简介] 传输任意格式文件 [实例截图] [核心代码] using System; using System.Collections.Generic; using Syste ...

最新文章

  1. 管理心得之学术,交通,作息,心态
  2. 北斗导航 | GPS 信号频谱分析
  3. 20155313 预备作业二
  4. LeetCode 474. 一和零(01背包动态规划)
  5. JS 语法糖 0 —— 解构
  6. unity中简单的血条自作
  7. GridView数据导出到Excel的类
  8. asp.net 点击查询跳转到查询结果页面_【免费毕设】ASP.NET交通信息网上查询系统的设计与实现(源代码+论文+开题报告)...
  9. OpenGL编程指南 示例笔记(2)--独立地移动光源
  10. 怎么快速批量修改图片大小?
  11. 原生JS音乐歌词播放页面
  12. Julia REPL 模式
  13. MATLAB 自动数独求解器(导入图片自动求解)
  14. 操作系统_逻辑地址转换为物理地址
  15. linux boost库安装
  16. Kaggle手写数字识别(Digit Recognizer)记录
  17. [机器学习][1]--PLA算法
  18. Windows进程简介
  19. 塞班S60V3通用UCWEB7.0正式版SISX安装包下载
  20. Mac安装AU(Audition)激活版支持M1M2 Audition 2020 for MAC中文来了

热门文章

  1. linux分享二:Linux如何修改字符集
  2. CentOS下安装实时检测网络带宽的小工具bmon
  3. Cordova WP8 插件开发
  4. 情况控件Android layout_weight用法图解
  5. 【ms access】SQL 引用外部表
  6. HTML知识积累及实践(二) - 标签样式
  7. caffe学习日记--lesson3:win8系统,VS2013下的caffe工程编译探究
  8. C++如何防止头文件被二次编译
  9. 汉字字符内码查询_计算机等级考试查询系统
  10. android scalex中心,androidmatrix android怎么算matrix中心点