最近在看java nio,模仿别人写了一个,用于学习研究下。没有操作页面,每个客户端另起一个线程来接收消息,client3发送消息时,其他的客户端都能接收到消息
1、服务端
public class ChatService { private Selector selector; private Charset charset = Charset.forName("UTF-8"); private SelectionKey service = null; private boolean ISRUN = true; public ChatService() { try { selector = Selector.open(); ServerSocketChannel ssc = ServerSocketChannel.open(); SocketAddress sa = new InetSocketAddress(9999); ssc.socket().bind(sa); ssc.configureBlocking(false); service = ssc.register(selector, SelectionKey.OP_ACCEPT); } catch (IOException e) { e.printStackTrace(); } } public void service() { try { while(ISRUN) { if(selector.select()>0) { Set<SelectionKey> kes = selector.selectedKeys(); Iterator<SelectionKey> iter = kes.iterator(); while(iter.hasNext()) { SelectionKey sk = iter.next(); if(sk.isValid() && sk.isAcceptable()) { iter.remove(); acceptable(sk); } if(sk.isValid() && sk.isReadable()) { readable(sk); } if(sk.isValid() && sk.isWritable()) { writable(sk); } } } } } catch (IOException e) { e.printStackTrace(); } } public void acceptable(SelectionKey key) { ServerSocketChannel ssc = (ServerSocketChannel)key.channel(); try { SocketChannel sc = ssc.accept(); if(sc==null) { return ; } sc.configureBlocking(false); sc.register(selector, SelectionKey.OP_READ); } catch (Exception e) { e.printStackTrace(); } } public void readable(SelectionKey key) { SocketChannel sc = (SocketChannel)key.channel(); ByteBuffer buffer = ByteBuffer.allocate(1024); try { int num = sc.read(buffer); if(num > 0) { buffer.flip(); //CharBuffer cb = buffer.asCharBuffer(); String request = charset.decode(buffer).toString(); SocketAddress sa = sc.getRemoteAddress(); System.out.println("客户端信息:"+sa.toString()); System.out.println("服务端接收信息:"+request); Set<SelectionKey> keys = selector.selectedKeys(); Iterator<SelectionKey> keysIter = keys.iterator(); while(keysIter.hasNext()) { SelectionKey it = keysIter.next(); if(it!=service&&key!=it) { //出去service和自己 it.attach(request); it.interestOps(it.interestOps()|SelectionKey.OP_WRITE); } } } } catch (Exception e) { e.printStackTrace(); } } public void writable(SelectionKey key) { try{ String tock = (String)key.attachment(); key.attach(""); SocketChannel sc = (SocketChannel)key.channel(); sc.write(charset.encode(tock)); key.interestOps(SelectionKey.OP_READ); }catch(Exception e) { e.printStackTrace(); } } public static void main(String[] args) { ChatService service = new ChatService(); service.service(); }
2、客户端1
public class ClientC1 { private SocketChannel sc = null; private Charset charset = Charset.forName("UTF-8"); private boolean ISRUN = true; public ClientC1() { try { sc = SocketChannel.open(); sc.configureBlocking(false); InetAddress address = InetAddress.getLocalHost(); InetSocketAddress isa = new InetSocketAddress(address, 9999); sc.connect(isa); } catch (Exception e) { e.printStackTrace(); } } public void sendMessage(String message) { try { System.out.println("aa:"); while(!sc.finishConnect()) {} sc.write(charset.encode(message)); } catch (IOException e) { e.printStackTrace(); } } public void receive() { try { //while(!sc.finishConnect()){}; System.out.println("接收消息"); while(ISRUN) { ByteBuffer buffer = ByteBuffer.allocate(1024); StringBuffer sb = new StringBuffer(); while(sc.read(buffer)>0) { buffer.flip(); sb.append(buffer.array()); buffer.flip(); } String str = sb.toString(); if(str!=null&&!"".equals(str)) { System.out.println("客户端接收信息:"+sb.toString()); } } } catch (Exception e) { e.printStackTrace(); } } public class ReceiveThread implements Runnable { @Override public void run() { try { while(ISRUN) { ByteBuffer buffer = ByteBuffer.allocate(1024); StringBuffer sb = new StringBuffer(); while(sc.read(buffer)>0) { buffer.flip(); sb.append(charset.decode(buffer)); buffer.flip(); } String str = sb.toString(); if(str!=null&&!"".equals(str)) { System.out.println("客户端接收信息:"+sb.toString()); } } }catch(Exception e) { e.printStackTrace(); } } } public void close() { } public static void main(String[] args) { ClientC1 c1 = new ClientC1(); c1.sendMessage("hello client 1"); //c1.receive(); new Thread(c1.new ReceiveThread()).start(); } }
3、客户端2
public class Client2 { private SocketChannel sc = null; private Charset charset = Charset.forName("UTF-8"); private boolean ISRUN = true; public Client2() { try { sc = SocketChannel.open(); sc.configureBlocking(false); InetAddress address = InetAddress.getLocalHost(); InetSocketAddress isa = new InetSocketAddress(address, 9999); sc.connect(isa); } catch (Exception e) { e.printStackTrace(); } } public void sendMessage(String message) { try { System.out.println("aa:"); while(!sc.finishConnect()) {} sc.write(charset.encode(message)); //sc.close(); } catch (IOException e) { e.printStackTrace(); } } public void receive() { try { //while(!sc.finishConnect()){}; while(ISRUN) { ByteBuffer buffer = ByteBuffer.allocate(1024); StringBuffer sb = new StringBuffer(); while(sc.read(buffer)>0) { buffer.flip(); sb.append(buffer.array()); buffer.flip(); } String str = sb.toString(); if(str!=null&&!"".equals(str)) { System.out.println("客户端接收信息:"+sb.toString()); } } } catch (Exception e) { e.printStackTrace(); } } public class ReceiveThread implements Runnable { @Override public void run() { try { while(ISRUN) { ByteBuffer buffer = ByteBuffer.allocate(1024); StringBuffer sb = new StringBuffer(); while(sc.read(buffer)>0) { buffer.flip(); sb.append(charset.decode(buffer)); buffer.flip(); } String str = sb.toString(); if(str!=null&&!"".equals(str)) { System.out.println("客户端接收信息:"+sb.toString()); } } }catch(Exception e) { e.printStackTrace(); } } } public void close() { } public static void main(String[] args) { Client2 c2 = new Client2(); c2.sendMessage("hello client 2_1"); new Thread(c2.new ReceiveThread()).start(); } }
3、客户端3
public class Client3 { private SocketChannel sc = null; private Charset charset = Charset.forName("UTF-8"); private boolean ISRUN = true; public Client3() { try { sc = SocketChannel.open(); sc.configureBlocking(false); InetAddress address = InetAddress.getLocalHost(); InetSocketAddress isa = new InetSocketAddress(address, 9999); sc.connect(isa); } catch (Exception e) { e.printStackTrace(); } } public void sendMessage(String message) { try { System.out.println("aa:"); while(!sc.finishConnect()) {} sc.write(charset.encode(message)); //sc.close(); } catch (IOException e) { e.printStackTrace(); } } public void receive() { try { //while(!sc.finishConnect()){}; while(ISRUN) { ByteBuffer buffer = ByteBuffer.allocate(1024); StringBuffer sb = new StringBuffer(); while(sc.read(buffer)>0) { buffer.flip(); sb.append(buffer.array()); buffer.flip(); } String str = sb.toString(); if(str!=null&&!"".equals(str)) { System.out.println("客户端接收信息:"+sb.toString()); } } } catch (Exception e) { e.printStackTrace(); } } public class ReceiveThread implements Runnable { @Override public void run() { try { while(ISRUN) { ByteBuffer buffer = ByteBuffer.allocate(1024); StringBuffer sb = new StringBuffer(); while(sc.read(buffer)>0) { buffer.flip(); sb.append(charset.decode(buffer)); buffer.flip(); } String str = sb.toString(); if(str!=null&&!"".equals(str)) { System.out.println("客户端接收信息:"+sb.toString()); } } }catch(Exception e) { e.printStackTrace(); } } } public static void main(String[] args) { Client3 client3 = new Client3(); client3.sendMessage("hello client 3"); } }
相关推荐
基于nio 简易聊天室的服务端 客户端,有界面
基于NIO的聊天室
java NIO 高性能 socket通讯,服务端采用单线程,降低了cpu的压力,普通io socket通讯,server需要每个连接运行个线程,容易出现问题,效率也低
此项目基于java nio实现聊天室功能
用java nio写的一个完整的、可运行的聊天室程序;复制代码到项目后可直接运行。
使用NIO socket不需要多线程来处理多个连接的请求,效率非常高 可以作为NIO socket入门的例子,Reactor模式,重点理解key.attach, jar文件里包含了源代码 1,运行server.bat启动服务器,可以打开编辑,修改端口号 ...
基于NIO的多线程聊天系统,代码很少,很经典,51CTO网站上的代码。有登陆和聊天界面。代码结构层次清晰,系统只有6个类。
服务端程序基于javaNIO,客户端程序基于旧IO,读完<<javaNIO>>后,导入eclipse即可运行,支持多人在线聊天,上下线通知.PS:非GUI程序,毕竟javaSwing用的少,不懂的地方大家可以一起讨论,评论必回!
UDP NIO聊天系统,基于UDP通道,NIO,包括服务器端和客户端
本代码是基于JAVA技术NIO流的选择器Selector的多人聊天室,实现了多个客户端之间的聊天,拥有java窗体、画板等。
基于NIO编写的聊天室,命令行运行,分server,client,config三个包,分别存放服务器端,客户端,以及一些端口信息的配置类。
一个简单的javaNIO非阻塞的聊天小demo,支持单聊和群聊
相比于上次的基于BIO的多人聊天室的线程数量大幅度减少。 一个线程用于监听客户端的到达,两个线程池分别负责客户端 消息的 读 和写。 另外两个线程 负责 readSelector 和writeSelector 的监听。 但是仅仅是对 ...
用Netty实现NIO Socket聊天系统示例 ,完整代码,已开源,希望大家多提意见。
NIO框架实现的简单聊天室,分为客户端和服务器端,为大家了解NIO作为一个参考
简单修改后的版本,与上一次的代码相比,这次加上了发送信息的校验,用户没有昵称和信息内容是不可以发送的。 对上一次代码中同时启动两个客户端CPU占100%的BUG做了修改。
举个例子吧 你服务器做一个聊天室 按照以前的阻塞式IO 你必须为每个连接创建一个线程 因为当你调用如 in read buf 时 线程会阻塞在这里 而采用nio 只要注册了事件 它内部采用反应模式 当有IO事件发生时 再调度它 而...
01-Java NIO-课程简介.mp4 05-Java NIO-Channel-FileChannel详解(一).mp4 06-Java NIO-Channel-FileChannel详解(二).mp4 08-Java NIO-Channel-ServerSocketChannel.mp4 09-Java NIO-Channel-SocketChannel.mp4 ...
JAVA NIO有两种解释:一种叫非阻塞IO(Non-blocking I/O),另一种也叫新的IO(New I/O),其实是同一个概念。它是一种同步非阻塞的I/O模型,也是...本例是使用java nio实现的简单聊天系统,界面简单,旨在学习java nio