Java使用插座通信传输文件的方法示例

  

本文实例讲述了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使用插座通信传输文件的方法示例