posts - 310, comments - 6939, trackbacks - 0, articles - 3
  BlogJava :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理

Java基于Socket文件传输示例

Posted on 2007-10-13 09:11 诗特林 阅读(91331) 评论(49)  编辑  收藏 所属分类: Socket
                                               Java基于Socket文件传输示例

最近需要进行网络传输大文件,于是对基于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";// 设置成服务器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();
    }

}

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

评论

# re: Java基于Socket文件传输示例  回复  更多评论   

2007-10-13 15:58 by 翔南
最近正想试试java.net包,顶个
回去研究研究

# re: Java基于Socket文件传输示例[未登录]  回复  更多评论   

2007-10-15 08:55 by 阿蜜果
蛮不错的,多谢提供!

# re: Java基于Socket文件传输示例  回复  更多评论   

2007-11-05 10:49 by
很好很好!!!
加油!!!

# re: Java基于Socket文件传输示例  回复  更多评论   

2007-11-20 22:51 by witkeymap.com
威客地图 : http://www.witkeymap.com

提供最新的任务,威客信息检索

# re: Java基于Socket文件传输示例  回复  更多评论   

2007-11-21 00:14 by wl
请问如何带文件名并实现多文件一起传输呢?

# re: Java基于Socket文件传输示例  回复  更多评论   

2007-12-27 13:32 by oak
很好啊真希望可以学到这种程度,可以加我吗,262874025

# re: Java基于Socket文件传输示例  回复  更多评论   

2008-01-03 13:21 by 心雨
很好,谢谢了,这次帮了我一个忙了
顶起,加我QQ:527825133
我洋特是学这个的
、只是现在还在个初学者!

# re: Java基于Socket文件传输示例[未登录]  回复  更多评论   

2008-01-08 16:44 by tang
能不能说下具体怎么运行啊?

# re: Java基于Socket文件传输示例[未登录]  回复  更多评论   

2008-01-08 16:45 by tang
想知道具体怎么运行,知道的朋友麻烦说下,谢谢了!

# re: Java基于Socket文件传输示例  回复  更多评论   

2008-01-12 13:46 by tyro729
to:楼上
修改好文件和保存路径之后,先运行服务器端,再运行客户端,就能在控制台上看到输出的进度效果了~~去文件保存路径看看就能看到已传送过来的文件了

# re: Java基于Socket文件传输示例  回复  更多评论   

2008-01-13 15:56 by wy
exception in thread'main' java.lang.NoclassDefFoundError...怎么回事?javac正确,java时有问题

# re: Java基于Socket文件传输示例  回复  更多评论   

2008-02-22 22:58 by Leshy
应该你执行的时候有问题吧。。。

cmd 到保存的目录,执行以下命令
javac -d . *.java
java sterning.ServerTest
java sterning.ClientTest

看不明白,看书上关于包一章的内容。。。

# re: Java基于Socket文件传输示例[未登录]  回复  更多评论   

2008-03-25 16:06 by richard
very good!

# re: Java基于Socket文件传输示例  回复  更多评论   

2008-04-16 08:24 by wingzwf
很不错,正在学习中,谢谢博主你的知识让我佩服,

# re: Java基于Socket文件传输示例  回复  更多评论   

2008-06-09 21:39 by XL
太谢谢了

# re: Java基于Socket文件传输示例  回复  更多评论   

2008-07-01 18:33 by 小女子
楼主:很爱很爱你!!

# re: Java基于Socket文件传输示例  回复  更多评论   

2008-07-01 18:35 by 小女子
到处都找不到,就在我绝望的边缘,我发现了你的share doc

# re: Java基于Socket文件传输示例  回复  更多评论   

2008-09-01 17:26 by hjg515
大文件传送,大照片发送,跨国文件传送,跨国文件传输,网络传输加速,跨国网络传输,都是酷达的代名词。
酷达软件科技有限公司,长期以来致力于互联网数据传输加速的研究,在互联网数据传输加速方面处于全球领先地位。公司已经为众多的跨国企业提供大数据传输服务。公司拥有一批硅谷归来的研发精英,在网络传输加速方面积累了大量的技术创新;2007年10月,公司研发团队重拳出击,在Qoodaa0.08中加入了自主创新的MNP2P技术,在跨国传输方面取得了革命性的进展,把竞争对手远远地抛到了身后。拥有酷达传输,信息畅游天下。酷达流畅的界面,简单的操作,清新的风格,超越极限的传输速度,最终奠定了酷达在互联网大文件传输行业的霸主地位。公司在前进的过程中经历了许多的坎坷和荆棘,但是,广大用户对我们的支持和肯定最终让我们克服了艰难险阻,Qoodaa0.08产品得到了广大用户的一致好评。我们的研发团队将一如既往,从稳定性、安全性,传输效率等多方面进行改进,帮助更多的企业和个人把信息传输到世界各地。网址:http://www.qoodaa.com.cn


# re: Java基于Socket文件传输示例  回复  更多评论   

2008-09-02 18:14 by hjg515
大文件传送,大照片发送,跨国文件传送,跨国文件传输,网络传输加速,跨国网络传输,都是酷达的代名词。建议你使用酷达免费软件,这种软件专门用来传输大文件的,我用了,速度非常快!在http://www.qoodaa.com.cn可以下载到

# re: Java基于Socket文件传输示例[未登录]  回复  更多评论   

2008-09-18 09:24 by 文涛
我在测试的时候发现客户端显示的文件接收百分比为负的,看了半天也没看出是什么原因。

# re: Java基于Socket文件传输示例[未登录]  回复  更多评论   

2008-09-18 16:45 by 文涛
我已经知道百分比不正常显示的原因了,将程序中下面这一句:
System.out.println("文件接收了" + (passedlen * 100/ len) + "%\n");
改为:
System.out.println("文件接收了" + (passedlen * 100L/ len) + "%\n");
就可以了。
数据太大整形数据原因。

# re: Java基于Socket文件传输示例  回复  更多评论   

2009-02-15 21:40 by Kioe
精彩·~~我近来在写UDP传输大文件

# re: Java基于Socket文件传输示例  回复  更多评论   

2009-02-27 10:10 by hello
谢谢搂主

# re: Java基于Socket文件传输示例[未登录]  回复  更多评论   

2009-04-09 11:53 by jack
你好,我想问一下,为什么savePath += inputStream.readUTF();这句里的inputStream.readUTF()就是文件名呢。谢谢。我的email:jack60508065@sohu.com

# re: Java基于Socket文件传输示例  回复  更多评论   

2009-04-09 20:24 by 老兰
不错,学习

# re: Java基于Socket文件传输示例  回复  更多评论   

2009-05-26 16:12 by 抱不平
博主,有培训公司将你以上代码所为商业用途,而且不加以说明。公司所在地安徽合肥。不知道博主是否在安徽供职过。。
实时关注。

# re: Java基于Socket文件传输示例  回复  更多评论   

2009-06-22 08:42 by xiaochengluoye
谢谢楼主,帮了我一大忙。

# re: Java基于Socket文件传输示例  回复  更多评论   

2009-07-02 16:16 by 小嘴
看不懂 但是上面都说好 我也说好 谢谢

# re: Java基于Socket文件传输示例[未登录]  回复  更多评论   

2009-11-28 23:02 by JAVA fans
太棒了!!!!真是好东东..

# re: Java基于Socket文件传输示例  回复  更多评论   

2010-04-09 17:31 by 单声道
更详细的可以到 http://www.jianfei5u.com 查看

# re: Java基于Socket文件传输示例  回复  更多评论   

2010-06-04 12:16 by realfex
很酷,感谢楼主。

# re: Java基于Socket文件传输示例[未登录]  回复  更多评论   

2010-11-23 14:35 by 杨军
@翔南
不错,简洁明了

# re: Java基于Socket文件传输示例  回复  更多评论   

2011-06-03 18:52 by jeny
你好,请问如果 只是通过java服务器转发文件数据 是否必须用 FileInputStream和FileOutputStream接收或发送 文件数据流呢?

# re: Java基于Socket文件传输示例  回复  更多评论   

2011-06-30 18:32 by 超群
运行有怎么又异常。。。怎么办的啊

# re: Java基于Socket文件传输示例  回复  更多评论   

2011-11-08 21:08 by 好奇宝宝
学习中~~感谢~

# re: Java基于Socket文件传输示例[未登录]  回复  更多评论   

2011-11-26 19:23 by x
先谢了

# re: Java基于Socket文件传输示例  回复  更多评论   

2012-04-10 11:13 by Davy Lee
谢谢LZ分享

# re: Java基于Socket文件传输示例  回复  更多评论   

2012-10-19 22:11 by chloe
多谢楼主,帮了大忙了。用在项目里,速度快了不少。

# re: Java基于Socket文件传输示例  回复  更多评论   

2012-10-20 12:05 by 王亚楠
现在学习java一年了,感觉有点迷茫,看到您的博客是从07年就开始,那时候俺还上高中呢,希望能得到您职业上面的指导,谢谢啦。 俺qq:1239806145,再次谢谢啦。。。

# re: Java基于Socket文件传输示例  回复  更多评论   

2013-04-19 16:08 by 魏国正
我想问 为什么老是 系统找不到指定文件啊 我改好了文件名和路径

# re: Java基于Socket文件传输示例[未登录]  回复  更多评论   

2013-09-05 06:53 by javac
注释太少了啊,阅读起来吃力啊

# re: Java基于Socket文件传输示例  回复  更多评论   

2013-10-07 17:06 by widekuan
大文件传输的效果貌似不是很好吧。。。

# re: Java基于Socket文件传输示例  回复  更多评论   

2014-04-17 13:47 by 美景
连接服务器成功!
接收消息错误
这个提示是什么意思?哪里出错误了,麻烦您了

# re: Java基于Socket文件传输示例  回复  更多评论   

2014-11-05 17:53 by afd
不错

# re: Java基于Socket文件传输示例  回复  更多评论   

2014-11-05 17:53 by afd
不错 有用

# re: Java基于Socket文件传输示例  回复  更多评论   

2015-03-31 17:21 by 1323
楼主 请问如果要加个界面该怎么加

# re: Java基于Socket文件传输示例  回复  更多评论   

2015-12-03 11:51 by 小浩浩
多谢楼主

# re: Java基于Socket文件传输示例  回复  更多评论   

2016-04-13 16:19 by 无味
我也是
连接服务器成功!
接收消息错误

怎样弹出界面啊

# re: Java基于Socket文件传输示例  回复  更多评论   

2016-05-20 11:30 by tjh
@tang
@无味
加div 弹出层

只有注册用户登录后才能发表评论。


网站导航: