java基于socket文件传输示例 -凯发k8网页登录

posts - 310, comments - 6939, trackbacks - 0, articles - 3
  凯发k8网页登录-凯发天生赢家一触即发官网 :: 凯发k8网页登录首页 :: 新随笔 :: 联系 :: 聚合  :: 管理

java基于socket文件传输示例

posted on 2007-10-13 09:11 诗特林 阅读(91220) 评论(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
威客地图 :

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

# re: java基于socket文件传输示例  回复     

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

# re: java基于socket文件传输示例  回复     

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

# re: java基于socket文件传输示例  回复     

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

# re: java基于socket文件传输示例[未登录]  回复     

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

# re: java基于socket文件传输示例[未登录]  回复     

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

# re: java基于socket文件传输示例  回复     

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

# re: java基于socket文件传输示例  回复     

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

# re: java基于socket文件传输示例  回复     

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

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

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

# re: java基于socket文件传输示例[未登录]  回复     

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

# re: java基于socket文件传输示例  回复     

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

# re: java基于socket文件传输示例  回复     

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

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


# re: java基于socket文件传输示例  回复     

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

# 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
精彩·~~我近来在写udp传输大文件

# re: java基于socket文件传输示例  回复     

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

# re: java基于socket文件传输示例[未登录]  回复     

2009-04-09 11:53 by
你好,我想问一下,为什么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
谢谢楼主,帮了我一大忙。

# re: java基于socket文件传输示例  回复     

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

# re: java基于socket文件传输示例[未登录]  回复     

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

# re: java基于socket文件传输示例  回复     

2010-04-09 17:31 by
更详细的可以到 查看

# re: java基于socket文件传输示例  回复     

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

# re: java基于socket文件传输示例[未登录]  回复     

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

# re: java基于socket文件传输示例  回复     

2011-06-03 18:52 by
你好,请问如果 只是通过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
先谢了

# re: java基于socket文件传输示例  回复     

2012-04-10 11:13 by
谢谢lz分享

# re: java基于socket文件传输示例  回复     

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

# 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
注释太少了啊,阅读起来吃力啊

# re: java基于socket文件传输示例  回复     

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

# re: java基于socket文件传输示例  回复     

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

# re: java基于socket文件传输示例  回复     

2014-11-05 17:53 by
不错

# re: java基于socket文件传输示例  回复     

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

# re: java基于socket文件传输示例  回复     

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

# 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
@tang
@无味
加div 弹出层

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


网站导航:
              
 
网站地图