java nio is例子_NIO Java NIO 通讯的简单示例

import java.io.*;

import java.nio.*;

import java.nio.channels.*;

import java.net.*;

import java.util.*;

import java.nio.charset.*;

import java.lang.*;

public class NonBlockingServer

{

public Selector sel = null;

public ServerSocketChannel server = null;

public SocketChannel socket = null;

public int port = 4900;

String result = null;

public NonBlockingServer()

{

System.out.println("Inside default ctor");

}

public NonBlockingServer(int port)

{

System.out.println("Inside the other ctor");

port = port;

}

public void initializeOperations() throws IOException,UnknownHostException

{

System.out.println("Inside initialization");

sel = Selector.open();

server = ServerSocketChannel.open();

server.configureBlocking(false);

InetAddress ia = InetAddress.getLocalHost();

InetSocketAddress isa = new InetSocketAddress(ia,port);

server.socket().bind(isa);

}

public void startServer() throws IOException

{

System.out.println("Inside startserver");

initializeOperations();

System.out.println("Abt to block on select()");

SelectionKey acceptKey = server.register(sel, SelectionKey.OP_ACCEPT );

while (acceptKey.selector().select() > 0 )

{

Set readyKeys = sel.selectedKeys();

Iterator it = readyKeys.iterator();

while (it.hasNext()) {

SelectionKey key = (SelectionKey)it.next();

it.remove();

if (key.isAcceptable()) {

System.out.println("Key is Acceptable");

ServerSocketChannel ssc = (ServerSocketChannel) key.channel();

socket = (SocketChannel) ssc.accept();

socket.configureBlocking(false);

SelectionKey another = socket.register(sel,SelectionKey.OP_READ|SelectionKey.OP_WRITE);

}

if (key.isReadable()) {

System.out.println("Key is readable");

String ret = readMessage(key);

if (ret.length() > 0) {

writeMessage(socket,ret);

}

}

if (key.isWritable()) {

//System.out.println("The key is writable");

String ret = readMessage(key);

socket = (SocketChannel)key.channel();

if (result.length() > 0 ) {

writeMessage(socket,ret);

}

}

}

}

}

public void writeMessage(SocketChannel socket,String ret)

{

System.out.println("Inside the loop");

if (ret.equals("quit") || ret.equals("shutdown")) {

return;

}

File file = new File(ret);

try

{

RandomAccessFile rdm = new RandomAccessFile(file,"r");

FileChannel fc = rdm.getChannel();

ByteBuffer buffer = ByteBuffer.allocate(1024);

fc.read(buffer);

buffer.flip();

Charset set = Charset.forName("us-ascii");

CharsetDecoder dec = set.newDecoder();

CharBuffer charBuf = dec.decode(buffer);

System.out.println(charBuf.toString());

buffer = ByteBuffer.wrap((charBuf.toString()).getBytes());

int nBytes = socket.write(buffer);

System.out.println("nBytes = "+nBytes);

result = null;

}

catch(Exception e)

{

e.printStackTrace();

}

}

public String readMessage(SelectionKey key)

{

int nBytes = 0;

socket = (SocketChannel)key.channel();

ByteBuffer buf = ByteBuffer.allocate(1024);

try

{

nBytes = socket.read(buf);

buf.flip();

Charset charset = Charset.forName("us-ascii");

CharsetDecoder decoder = charset.newDecoder();

CharBuffer charBuffer = decoder.decode(buf);

result = charBuffer.toString();

}

catch(IOException e)

{

e.printStackTrace();

}

return result;

}

public static void main(String args[])

{

NonBlockingServer nb = new NonBlockingServer();

try

{

nb.startServer();

}

catch (IOException e)

{

e.printStackTrace();

System.exit(-1);

}

}

}

import java.nio.*;

import java.nio.channels.*;

import java.net.*;

import java.io.*;

import java.nio.channels.spi.*;

import java.nio.charset.*;

import java.lang.*;

public class Client

{

public SocketChannel client = null;

public InetSocketAddress isa = null;

public RecvThread rt = null;

public Client()

{

}

public void makeConnection()

{

int result = 0;

try

{

client = SocketChannel.open();

isa = new InetSocketAddress("liudong",4900);

client.connect(isa);

client.configureBlocking(false);

receiveMessage();

}

catch(UnknownHostException e)

{

e.printStackTrace();

}

catch(IOException e)

{

e.printStackTrace();

}

while ((result = sendMessage()) != -1)

{

}

try

{

client.close();

System.exit(0);

}

catch(IOException e)

{

e.printStackTrace();

}

}

public int sendMessage()

{

System.out.println("Inside SendMessage");

BufferedReader in = new BufferedReader(new InputStreamReader(System.in));

String msg = null;

ByteBuffer bytebuf = ByteBuffer.allocate(1024);

int nBytes = 0;

try

{

msg = in.readLine();

System.out.println("msg is "+msg);

bytebuf = ByteBuffer.wrap(msg.getBytes());

nBytes = client.write(bytebuf);

System.out.println("nBytes is "+nBytes);

if (msg.equals("quit") || msg.equals("shutdown")) {

System.out.println("time to stop the client");

interruptThread();

try

{

Thread.sleep(5000);

}

catch(Exception e)

{

e.printStackTrace();

}

client.close();

return -1;

}

}

catch(IOException e)

{

e.printStackTrace();

}

System.out.println("Wrote "+nBytes +" bytes to the server");

return nBytes;

}

public void receiveMessage()

{

rt = new RecvThread("Receive THread",client);

rt.start();

}

public void interruptThread()

{

rt.val = false;

}

public static void main(String args[])

{

Client cl = new Client();

cl.makeConnection();

}

public class RecvThread extends Thread

{

public SocketChannel sc = null;

public boolean val = true;

public RecvThread(String str,SocketChannel client)

{

super(str);

sc = client;

}

public void run() {

System.out.println("Inside receivemsg");

int nBytes = 0;

ByteBuffer buf = ByteBuffer.allocate(2048);

try

{

while (val)

{

while ( (nBytes = nBytes = client.read(buf)) > 0){

buf.flip();

Charset charset = Charset.forName("us-ascii");

CharsetDecoder decoder = charset.newDecoder();

CharBuffer charBuffer = decoder.decode(buf);

String result = charBuffer.toString();

System.out.println(result);

buf.flip();

}

}

}

catch(IOException e)

{

e.printStackTrace();

}

}

}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值