本文实例讲述了Java使用插座通信传输文件的方法。分享给大家供大家参考,具体如下:
前面几篇文章介绍了使用Java的套接字编程和NIO包在插座中的应用,这篇文章说说怎样利用套接字编程来实现简单的文件传输。
这里由于前面一片文章介绍了NIO在插座中的应用,所以这里在读写文件的时候也继续使用NIO包,所以代码看起来会比直接使用流的方式稍微复杂一点点。
下面的示例演示了客户端向服务器端发送一个文件,服务器作为响应给客户端回发一个文件。这里准备两个文件E:/测试/server_send.log和E:/测试/client.send.log文件,在测试完毕后在客户端和服务器相同目录下会多出两个文件E:/测试/server_receive.log和E:/测试/client.receive.log文件。
下面首先来看看服务器类,主要关注其中的sendFile和receiveFile方法。
包com.googlecode.garbagecan.test.socket.nio; 进口java.io.File; 进口java.io.FileInputStream; 进口java.io.FileOutputStream; 进口java.io.IOException; 进口java.net.InetSocketAddress; 进口java.nio.ByteBuffer; 进口java.nio.channels.ClosedChannelException; 进口java.nio.channels.FileChannel; 进口java.nio.channels.SelectionKey; 进口java.nio.channels.Selector; 进口java.nio.channels.ServerSocketChannel; 进口java.nio.channels.SocketChannel; 进口java.util.Iterator; 进口java.util.logging.Level; 进口java.util.logging.Logger; 公开课MyServer4 { 私人最终静态日志记录器=Logger.getLogger (MyServer4.class.getName ()); 公共静态void main (String [] args) { 选择器选择器=零; ServerSocketChannel ServerSocketChannel=零; 尝试{//选择器对传入的请求 选择器=Selector.open ();//创建一个新的服务器套接字并设置为非阻塞模式 serverSocketChannel=ServerSocketChannel.open (); serverSocketChannel.configureBlocking(假);//将服务器套接字绑定到本地主机和端口 serverSocketChannel.socket () .setReuseAddress(真正的); serverSocketChannel.socket ()。绑定(新的InetSocketAddress (10000));//注册接受> 包com.googlecode.garbagecan.test.socket.nio; 进口java.io.File; 进口java.io.FileInputStream; 进口java.io.FileOutputStream; 进口java.io.IOException; 进口java.net.InetSocketAddress; 进口java.net.SocketAddress; 进口java.nio.ByteBuffer; 进口java.nio.channels.FileChannel; 进口java.nio.channels.SocketChannel; 进口java.util.logging.Level; 进口java.util.logging.Logger; 公开课MyClient4 { 私人最终静态日志记录器=Logger.getLogger (MyClient4.class.getName ()); 公共静态void main (String [] args){抛出异常 新线程(新MyRunnable ()) .start (); } 私有静态最终类MyRunnable实现Runnable { 公共空间run () { SocketChannel SocketChannel=零; 尝试{ socketChannel=SocketChannel.open (); SocketAddress SocketAddress=都都新的InetSocketAddress (“localhost”, 10000); socketChannel.connect (socketAddress)都; sendFile (socketChannel新文件(“E:/测试/client_send.log”)); receiveFile (socketChannel新文件(“E:/测试/client_receive.log”)); }捕捉(例外的前女友){ logger.log(水平。严重,null,交货); 最后}{ 尝试{ socketChannel.close (); }捕捉(例外的前女友){} } } 私人空间sendFile (SocketChannel SocketChannel、文件文件)抛出IOException { FileInputStream fis=零; FileChannel频道=零; 尝试{ fis=new FileInputStream(文件); 频道=fis.getChannel (); ByteBuffer缓冲=ByteBuffer.allocateDirect (1024); int大?0; 在((大?channel.read(缓冲))!=1){ buffer.rewind (); buffer.limit(大小); socketChannel.write(缓冲); buffer.clear (); } .shutdownOutput socketChannel.socket () (); 最后}{ 尝试{ channel.close (); }捕捉(例外的前女友){} 尝试{ fis.close (); }捕捉(例外的前女友){} } } 私人空间receiveFile (SocketChannel SocketChannel、文件文件)抛出IOException { FileOutputStream安全系数=零; FileChannel频道=零; 尝试{ 安全系数=new FileOutputStream(文件); 频道=fos.getChannel (); ByteBuffer缓冲=ByteBuffer.allocateDirect (1024); int大?0; 在((大?socketChannel.read(缓冲))!=1){ buffer.flip (); 如果(大小比;0){ buffer.limit(大小); channel.write(缓冲); buffer.clear (); } } 最后}{ 尝试{ channel.close (); }捕捉(例外的前女友){} 尝试{ fos.close (); }捕捉(例外的前女友){} } } } }Java使用插座通信传输文件的方法示例