常量类
public static int DEFAULT_PORT = 12345 ;
public static String DEFAULT_SERVER_IP = "127.0.0.1" ;
public static String response ( String msg) {
return "Hello," + msg+ ",Now is " + new java. util. Date (
System. currentTimeMillis ( ) ) . toString ( ) ;
}
NioClient通信客户端
public class NioClient {
private static NioClientHandle nioClientHandle;
public static void start ( ) {
if ( nioClientHandle != null)
nioClientHandle. stop ( ) ;
nioClientHandle = new NioClientHandle ( DEFAULT_SERVER_IP, DEFAULT_PORT) ;
new Thread ( nioClientHandle, "Client" ) . start ( ) ;
}
public static boolean sendMsg ( String msg) throws Exception{
nioClientHandle. sendMsg ( msg) ;
return true ;
}
public static void main ( String[ ] args) throws Exception {
start ( ) ;
Scanner scanner = new Scanner ( System. in) ;
while ( NioClient. sendMsg ( scanner. next ( ) ) ) ;
}
}
NioClientHandle通信客户端处理器
public class NioClientHandle implements Runnable {
private String host;
private int port;
private Selector selector;
private SocketChannel socketChannel;
private volatile boolean started;
public NioClientHandle ( String ip, int port) {
this . host = ip;
this . port = port;
try {
selector = Selector. open ( ) ;
socketChannel = SocketChannel. open ( ) ;
socketChannel. configureBlocking ( false ) ;
started = true ;
} catch ( IOException e) {
e. printStackTrace ( ) ;
}
}
public void stop ( ) {
started = false ;
}
@Override
public void run ( ) {
try {
doConnect ( ) ;
} catch ( IOException e) {
e. printStackTrace ( ) ;
System. exit ( 1 ) ;
}
while ( started) {
try {
selector. select ( ) ;
Set< SelectionKey> keys = selector. selectedKeys ( ) ;
Iterator< SelectionKey> it = keys. iterator ( ) ;
SelectionKey key = null;
while ( it. hasNext ( ) ) {
key = it. next ( ) ;
it. remove ( ) ;
try {
handleInput ( key) ;
} catch ( IOException e) {
e. printStackTrace ( ) ;
if ( key!= null) {
key. cancel ( ) ;
if ( key. channel ( ) != null) {
key. channel ( ) . close ( ) ;
}
}
}
}
} catch ( IOException e) {
e. printStackTrace ( ) ;
}
}
if ( selector!= null) {
try {
selector. close ( ) ;
} catch ( IOException e) {
e. printStackTrace ( ) ;
}
}
}
private void handleInput ( SelectionKey key) throws IOException{
if ( key. isValid ( ) ) {
SocketChannel sc = ( SocketChannel) key. channel ( ) ;
if ( key. isConnectable ( ) ) {
if ( sc. finishConnect ( ) ) { }
else { System. exit ( 1 ) ; }
}
if ( key. isReadable ( ) ) {
ByteBuffer buffer = ByteBuffer. allocate ( 1024 ) ;
int readBytes = sc. read ( buffer) ;
if ( readBytes> 0 ) {
buffer. flip ( ) ;
byte [ ] bytes = new byte [ buffer. remaining ( ) ] ;
buffer. get ( bytes) ;
String result = new String ( bytes, "UTF-8" ) ;
System. out. println ( "accept message:" + result) ;
} else if ( readBytes< 0 ) {
key. cancel ( ) ;
sc. close ( ) ;
}
}
}
}
private void doWrite ( SocketChannel channel, String request)
throws IOException {
byte [ ] bytes = request. getBytes ( ) ;
ByteBuffer writeBuffer = ByteBuffer. allocate ( bytes. length) ;
writeBuffer. put ( bytes) ;
writeBuffer. flip ( ) ;
channel. write ( writeBuffer) ;
}
private void doConnect ( ) throws IOException {
if ( socketChannel. connect ( new InetSocketAddress ( host, port) ) ) { }
else {
socketChannel. register ( selector, SelectionKey. OP_CONNECT) ;
}
}
public void sendMsg ( String msg) throws Exception{
socketChannel. register ( selector, SelectionKey. OP_READ) ;
doWrite ( socketChannel, msg) ;
}
}
NioServer通信服务端
public class NioServer {
private static NioServerHandle nioServerHandle;
public static void start ( ) {
if ( nioServerHandle != null)
nioServerHandle. stop ( ) ;
nioServerHandle = new NioServerHandle ( DEFAULT_PORT) ;
new Thread ( nioServerHandle, "Server" ) . start ( ) ;
}
public static void main ( String[ ] args) {
start ( ) ;
}
}
NioServerHandle通信服务端处理器
public class NioServerHandle implements Runnable {
private Selector selector;
private ServerSocketChannel serverChannel;
private volatile boolean started;
public NioServerHandle ( int port) {
try {
selector = Selector. open ( ) ;
serverChannel = ServerSocketChannel. open ( ) ;
serverChannel. configureBlocking ( false ) ;
serverChannel. socket ( ) . bind ( new InetSocketAddress ( port) ) ;
serverChannel. register ( selector, SelectionKey. OP_ACCEPT) ;
started = true ;
System. out. println ( "服务器已启动,端口号:" + port) ;
} catch ( IOException e) {
e. printStackTrace ( ) ;
}
}
public void stop ( ) {
started = false ;
}
@Override
public void run ( ) {
while ( started) {
try {
selector. select ( ) ;
Set< SelectionKey> keys = selector. selectedKeys ( ) ;
Iterator< SelectionKey> it = keys. iterator ( ) ;
SelectionKey key = null;
while ( it. hasNext ( ) ) {
key = it. next ( ) ;
it. remove ( ) ;
try {
handleInput ( key) ;
} catch ( Exception e) {
if ( key != null) {
key. cancel ( ) ;
if ( key. channel ( ) != null) {
key. channel ( ) . close ( ) ;
}
}
}
}
} catch ( Throwable t) {
t. printStackTrace ( ) ;
}
}
if ( selector != null)
try {
selector. close ( ) ;
} catch ( Exception e) {
e. printStackTrace ( ) ;
}
}
private void handleInput ( SelectionKey key) throws IOException{
if ( key. isValid ( ) ) {
if ( key. isAcceptable ( ) ) {
ServerSocketChannel ssc = ( ServerSocketChannel) key. channel ( ) ;
SocketChannel sc = ssc. accept ( ) ;
System. out. println ( "======socket channel 建立连接" ) ;
sc. configureBlocking ( false ) ;
sc. register ( selector, SelectionKey. OP_READ) ;
}
if ( key. isReadable ( ) ) {
System. out. println ( "======socket channel 数据准备完成," +
"可以去读==读取=======" ) ;
SocketChannel sc = ( SocketChannel) key. channel ( ) ;
ByteBuffer buffer = ByteBuffer. allocate ( 1024 ) ;
int readBytes = sc. read ( buffer) ;
if ( readBytes> 0 ) {
buffer. flip ( ) ;
byte [ ] bytes = new byte [ buffer. remaining ( ) ] ;
buffer. get ( bytes) ;
String message = new String ( bytes, "UTF-8" ) ;
System. out. println ( "服务器收到消息:" + message) ;
String result = response ( message) ;
doWrite ( sc, result) ;
}
else if ( readBytes< 0 ) {
key. cancel ( ) ;
sc. close ( ) ;
}
}
}
}
private void doWrite ( SocketChannel channel, String response)
throws IOException {
byte [ ] bytes = response. getBytes ( ) ;
ByteBuffer writeBuffer = ByteBuffer. allocate ( bytes. length) ;
writeBuffer. put ( bytes) ;
writeBuffer. flip ( ) ;
channel. write ( writeBuffer) ;
}
}