使用 ServerSocketChannel 实现的 File 服务器
2008-06-10 07:16
531 查看
package test.io; import java.nio.channels.*; import java.nio.charset.*; import java.net.*; import java.io.*; import java.util.*; import java.nio.*; public class FileServer { private int port = 8050; private ServerSocketChannel serverSocketChannel; private Charset charset = Charset.forName("GBK"); private Selector selector = null; public FileServer() throws IOException { selector = Selector.open(); serverSocketChannel = ServerSocketChannel.open(); serverSocketChannel.socket().setReuseAddress(true); serverSocketChannel.socket().bind(new InetSocketAddress(port)); System.out.println("服务器启动"); } /* 编码过程 */ public ByteBuffer encode(String str) { return charset.encode(str); } /* 解码过程 */ public String decode(ByteBuffer bb) { return charset.decode(bb).toString(); } /* 服务器服务方法 */ public void service() throws IOException { serverSocketChannel.configureBlocking(false); serverSocketChannel.register(selector, SelectionKey.OP_ACCEPT); /** 外循环,已经发生了SelectionKey数目 */ while (selector.select() > 0) { /* 得到已经被捕获了的SelectionKey的集合 */ Iterator iterator = selector.selectedKeys().iterator(); while (iterator.hasNext()) { SelectionKey key = null; try { key = (SelectionKey) iterator.next(); iterator.remove(); if (key.isAcceptable()) { ServerSocketChannel ssc = (ServerSocketChannel) key.channel(); SocketChannel sc = ssc.accept(); System.out.println("客户端机子的地址是 " + sc.socket().getLocalAddress() + " 客户端机机子的端口号是 " + sc.socket().getLocalPort()); sc.configureBlocking(false); ByteBuffer buffer = ByteBuffer.allocate(1024); sc.register(selector, SelectionKey.OP_READ | SelectionKey.OP_WRITE, buffer); } if (key.isReadable()) { reveice(key); } if (key.isWritable()) { send(key); } } catch (IOException e) { e.printStackTrace(); try { if (key != null) { key.cancel(); key.channel().close(); } } catch (ClosedChannelException cex) { e.printStackTrace(); } } } /* 内循环完 */ } /* 外循环完 */ } /* service方法完 */ public void reveice(SelectionKey key) throws IOException { if (key == null) return; ByteBuffer buff = (ByteBuffer) key.attachment(); SocketChannel sc = (SocketChannel) key.channel(); buff.limit(buff.capacity()); buff.position(0); sc.read(buff); buff.flip(); String reviceData = decode(buff); } /* 发送文件 */ public void send(SelectionKey key) { if (key == null) return; ByteBuffer buff = (ByteBuffer) key.attachment(); SocketChannel sc = (SocketChannel) key.channel(); String data = decode(buff); if (data.indexOf("get") == -1) return; String subStr = data.substring(data.indexOf(" "), data.length()); System.out.println("截取之后的字符串是 " + subStr); FileInputStream fileInput = null; try { fileInput = new FileInputStream(subStr); FileChannel fileChannel = fileInput.getChannel(); fileChannel.transferTo(0, fileChannel.size(), sc); } catch (IOException e) { e.printStackTrace(); } finally { try { fileInput.close(); } catch (IOException ex) { ex.printStackTrace(); } } } public static void main(String[] args) throws IOException { new FileServer().service(); } }
http://www.java2000.net/viewthread.jsp?tid=6079
http://topic.csdn.net/u/20080610/02/6e33be0a-152f-481a-a10e-f9c11c8fd9ad.html?seed=577363641
相关文章推荐
- 使用 ServerSocketChannel 实现的 File 服务器
- 使用Python SocketServer快速实现多线程网络服务器
- 使用ServerSocketChannel与SocketChannel实现的CS模式
- [java]NIO服务器(ServerSocketChannel)开发的两种实现方式
- python应用系列教程——python使用SocketServer实现网络服务器,socket实现客户端
- Android 使用Socket实现服务器与手机客户端的长连接二:多Client对一Server聊天
- 使用select异步IO实现socketserver服务器 源码剖析
- Android 使用Socket实现服务器与手机客户端的长连接七:定义消息体,区分是响应还是回复信息
- ServerSocketChannel+Selector实现多路复用io
- 基于SuperSocket实现的WebSocket服务器 和Unity中使用Websocket
- Android 使用Socket实现服务器与手机客户端的长连接三:clientA 发送给clientB,定点发送
- ServerSocket实现 一个简单的Web服务器 [引]
- java使用多线程编程,实现socket服务器客户端交互
- C#使用Socket实现一个socket服务器与多个socket客户端通信
- 使用socket编程实现一个简单的文件服务器
- 使用ServerSocket建立聊天服务器(二)
- Socket 基础解析使用ServerSocket建立聊天服务器
- 【python】网络编程-SocketServer 实现客户端与服务器间非阻塞通信
- 使用非阻塞ServerSocketChannel、SocketChannel代替ServerSocket和Socket
- C#使用Socket实现服务器与多个客户端通信(简单的聊天系统)