现在的位置: 首页 > 综合 > 正文

Java基于Socket文件传输示例

2013年08月15日 ⁄ 综合 ⁄ 共 4431字 ⁄ 字号 评论关闭

最近需要进行网络传输大文件,于是对基于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();

抱歉!评论已关闭.