非阻塞通信
最近看孙老师的《Java网络编程精解》,读到非阻塞通信!感觉框架的重要性!服务器端和客户端的开发可以有框架遵循!开始写歌简单的,然后逐渐添加功能!
package nonblock;import java.net.*;import java.nio.channels.*;import java.nio.*;import java.io.*;import java.nio.charset.*;import java.util.*;public class MyClient {private SocketChannel socketChannel = null;private ByteBuffer sendBuffer = ByteBuffer.allocate(1024);private ByteBuffer receiveBuffer = ByteBuffer.allocate(1024);private Charset charset = Charset.forName("GBK");private Selector selector;public MyClient() throws IOException {socketChannel = SocketChannel.open();InetAddress ia = InetAddress.getLocalHost();InetSocketAddress isa = new InetSocketAddress(ia, 8000);socketChannel.connect(isa);socketChannel.configureBlocking(false);System.out.println("与服务器的连接建立成功");selector = Selector.open();}public static void main(String args[]) throws IOException {final MyClient client = new MyClient();//Thread receiver = new Thread() {//public void run() {//client.receiveFromUser();//}//};////receiver.start();client.talk();}private void talk() throws IOException {// TODO Auto-generated method stubsocketChannel.register(selector, SelectionKey.OP_READ| SelectionKey.OP_WRITE);while(selector.select()>0){Set keySet = selector.selectedKeys();Iterator iter = keySet.iterator();while(iter.hasNext()){SelectionKey key = (SelectionKey)iter.next();iter.remove();if(key.isWritable()){//send(key);System.out.println("客户端可写...");}if(key.isReadable()){//receive(key);System.out.println("客户端可读...");}}}}public void receive(SelectionKey key) throws IOException {SocketChannel socketChannel = (SocketChannel)key.channel();ByteBuffer readBuffer = ByteBuffer.allocate(150);ByteBuffer buffer = ByteBuffer.allocate(20);socketChannel.read(readBuffer);readBuffer.flip();System.out.println(("From server:"+charset.decode(readBuffer).toString()));System.out.println("Cap:"+readBuffer.capacity());readBuffer.flip();buffer.put(readBuffer);System.out.println(("From"+charset.decode(buffer).toString()));}public void send(SelectionKey key) throws IOException {SocketChannel socketChannel = (SocketChannel)key.channel();String input ;BufferedReader br = new BufferedReader(new InputStreamReader(System.in));Charset charset = Charset.forName("GBK");while((input=br.readLine())!=null){ByteBuffer buffer = ByteBuffer.allocate(2);ByteBuffer outBuffer = ByteBuffer.allocate(2);buffer= charset.encode(input+"\r\n");//outBuffer.put(buffer);//buffer.flip();socketChannel.write(buffer);buffer.flip();System.out.println("I say:"+ charset.decode(buffer).toString());}}}2 楼 to_zoe_yang 2011-03-27 试验了下,都不执行操作的时候,服务器端和客户端都是 可写状态,不可写,
因为此时客户端循环显示:客户可写;服务器端显示:服务器可写
但是如果此时断了客户端,服务器轮流显示:服务器可写和服务器可读
现在我觉得,客户端和服务器端是全双工的,有两个通道!
服务器端一个负责写,对应的客户端一个负责读;
服务器端另一个负责读,对应的客户端一个负责写!
而register时的attachment则是用于自己内部通信的!
想明白了!
呵呵~~
不错
今天有成就!
当然,哪一天如果发现自己这个错误了,希望大家指正啊!
可不敢误导别人啊!