免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2645 | 回复: 0
打印 上一主题 下一主题

java异步socket实现文件下载(转) [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-07-14 13:50 |只看该作者 |倒序浏览
(1)服务器端NIOServer.java
import java.io.FileInputStream;
import java.io.IOException;
import java.net.InetSocketAddress;
import java.nio.ByteBuffer;
import java.nio.CharBuffer;
import java.nio.channels.FileChannel;
import java.nio.channels.SelectionKey;
import java.nio.channels.Selector;
import java.nio.channels.ServerSocketChannel;
import java.nio.channels.SocketChannel;
import java.nio.charset.Charset;
import java.nio.charset.CharsetDecoder;
import java.util.Iterator;
/**
*
* 测试文件下载的NIOServer
*
* @author tenyears.cn
*/
public class NIOServer
{
static int BLOCK = 4096;
// 处理与客户端的交互
public class HandleClient
{
  protected FileChannel channel;
  protected ByteBuffer buffer;
  
  public HandleClient() throws IOException
  {
   this.channel = new FileInputStream(filename).getChannel();
   this.buffer = ByteBuffer.allocate(BLOCK);
  }
  public ByteBuffer readBlock()
  {
   try
   {
    buffer.clear();
    int count = channel.read(buffer);
    buffer.flip();
    if (count  iter = selector.selectedKeys().iterator();
    while (iter.hasNext())
    {
     SelectionKey key = iter.next();
     iter.remove();
     handleKey(key);
    }
   }
  }
  catch (IOException e)
  {
   e.printStackTrace();
  }
}

// 处理事件
protected void handleKey(SelectionKey key) throws IOException
{
  if (key.isAcceptable())
  { // 接收请求
   ServerSocketChannel server = (ServerSocketChannel) key.channel();
   SocketChannel channel = server.accept();
   channel.configureBlocking(false);
   channel.register(selector, SelectionKey.OP_READ);
  }
  else if (key.isReadable())
  { // 读信息
   SocketChannel channel = (SocketChannel) key.channel();
   int count = channel.read(clientBuffer);
   if (count > 0)
   {
    clientBuffer.flip();
    CharBuffer charBuffer = decoder.decode(clientBuffer);
    System.out.println("Client >>" + charBuffer.toString());
    SelectionKey wKey = channel.register(selector,SelectionKey.OP_WRITE);
    wKey.attach(new HandleClient());
   }
   else
    channel.close();
   clientBuffer.clear();
  }
  else if (key.isWritable())
  { // 写事件
   SocketChannel channel = (SocketChannel) key.channel();
   HandleClient handle = (HandleClient) key.attachment();
   ByteBuffer block = handle.readBlock();
   
   if (block != null)
    channel.write(block);
   else
   {
    handle.close();
    channel.close();
   }
  }
}

public static void main(String[] args)
{
  int port = 12345;
  try
  {
   NIOServer server = new NIOServer(port);
   System.out.println("Listenning on " + port);
   while (true)
   {
    server.listen();
   }
  }
  catch (IOException e)
  {
   e.printStackTrace();
  }
}
}

(2)客户端程序:NIOClient.java
import java.io.IOException;
import java.net.InetSocketAddress;
import java.nio.ByteBuffer;
import java.nio.CharBuffer;
import java.nio.channels.SelectionKey;
import java.nio.channels.Selector;
import java.nio.channels.SocketChannel;
import java.nio.charset.Charset;
import java.nio.charset.CharsetEncoder;
import java.util.Iterator;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
            
/**
* 文件下载客户端
* @author tenyears.cn
*/
public class NIOClient
{
static int SIZE = 100;
static InetSocketAddress ip = new InetSocketAddress("localhost",12345);
static CharsetEncoder encoder = Charset.forName("GB2312").newEncoder();
//下载线程
static class Download implements Runnable
{
  protected int index;
  public Download(int index)
  {
   this.index = index;
  }

  public void run()
  {
   try
   {
    long start = System.currentTimeMillis();
    SocketChannel client = SocketChannel.open();
    client.configureBlocking(false);
    Selector selector = Selector.open();
    client.register(selector, SelectionKey.OP_CONNECT);
    client.connect(ip);
    ByteBuffer buffer = ByteBuffer.allocate(8 * 1024);
    int total = 0;
    FOR: for (;;)
    {
     selector.select();
     Iterator iter = selector.selectedKeys().iterator();
     while (iter.hasNext())
     {
      SelectionKey key = iter.next();
      iter.remove();
      if (key.isConnectable())
      {
       SocketChannel channel = (SocketChannel) key.channel();
       if (channel.isConnectionPending())
       channel.finishConnect();
       channel.write(encoder.encode(CharBuffer.wrap("Hello from " + index)));
       channel.register(selector, SelectionKey.OP_READ);
      }
      else if (key.isReadable())
      {
       SocketChannel channel = (SocketChannel) key.channel();
       int count = channel.read(buffer);
       if (count > 0)
       {
        total += count;
        buffer.clear();
       }
       else
       {
        client.close();
        break FOR;
       }
      }
     }
    }
    double last = (System.currentTimeMillis() - start) * 1.0 / 1000;
    System.out.println("Thread " + index + " downloaded " + total
    + "bytes in " + last + "s.");
   }
   catch (IOException e)
   {
    e.printStackTrace();
   }
  }
}

public static void main(String[] args) throws IOException
{
  ExecutorService exec = Executors.newFixedThreadPool(SIZE);
  for (int index = 0; index


本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u3/93928/showart_1995686.html
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP