`
落叶换新叶
  • 浏览: 24348 次
  • 性别: Icon_minigender_1
社区版块
存档分类
最新评论

nio 在线聊天

阅读更多

最近在看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");
	}
}

 

 

 

 

0
0
分享到:
评论

相关推荐

    基于nio的简易聊天室

    基于nio 简易聊天室的服务端 客户端,有界面

    基于NIO的聊天室

    基于NIO的聊天室

    java NIO socket聊天

    java NIO 高性能 socket通讯,服务端采用单线程,降低了cpu的压力,普通io socket通讯,server需要每个连接运行个线程,容易出现问题,效率也低

    java nio 聊天室源码

    此项目基于java nio实现聊天室功能

    java nio聊天室源码

    用java nio写的一个完整的、可运行的聊天室程序;复制代码到项目后可直接运行。

    java NIO socket聊天室

    使用NIO socket不需要多线程来处理多个连接的请求,效率非常高 可以作为NIO socket入门的例子,Reactor模式,重点理解key.attach, jar文件里包含了源代码 1,运行server.bat启动服务器,可以打开编辑,修改端口号 ...

    基于NIO的多线程聊天系统

    基于NIO的多线程聊天系统,代码很少,很经典,51CTO网站上的代码。有登陆和聊天界面。代码结构层次清晰,系统只有6个类。

    非GUI聊天室基于javaNIO

    服务端程序基于javaNIO,客户端程序基于旧IO,读完&lt;&lt;javaNIO&gt;&gt;后,导入eclipse即可运行,支持多人在线聊天,上下线通知.PS:非GUI程序,毕竟javaSwing用的少,不懂的地方大家可以一起讨论,评论必回!

    UDP NIO聊天系统

    UDP NIO聊天系统,基于UDP通道,NIO,包括服务器端和客户端

    java基于NIO选择器Selector的多人聊天室

    本代码是基于JAVA技术NIO流的选择器Selector的多人聊天室,实现了多个客户端之间的聊天,拥有java窗体、画板等。

    基于NIO的简易聊天室(命令行)源码.rar

    基于NIO编写的聊天室,命令行运行,分server,client,config三个包,分别存放服务器端,客户端,以及一些端口信息的配置类。

    基于NIO非阻塞的java聊天demo(支持单聊和群聊)

    一个简单的javaNIO非阻塞的聊天小demo,支持单聊和群聊

    基于NIO的多人聊天室项目

    相比于上次的基于BIO的多人聊天室的线程数量大幅度减少。 一个线程用于监听客户端的到达,两个线程池分别负责客户端 消息的 读 和写。 另外两个线程 负责 readSelector 和writeSelector 的监听。 但是仅仅是对 ...

    用Netty实现NIO Socket聊天系统示例

    用Netty实现NIO Socket聊天系统示例 ,完整代码,已开源,希望大家多提意见。

    NIO聊天室代码

    NIO框架实现的简单聊天室,分为客户端和服务器端,为大家了解NIO作为一个参考

    基于NIO的Java聊天室2

    简单修改后的版本,与上一次的代码相比,这次加上了发送信息的校验,用户没有昵称和信息内容是不可以发送的。 对上一次代码中同时启动两个客户端CPU占100%的BUG做了修改。

    java NIO参考文档

    举个例子吧 你服务器做一个聊天室 按照以前的阻塞式IO 你必须为每个连接创建一个线程 因为当你调用如 in read buf 时 线程会阻塞在这里 而采用nio 只要注册了事件 它内部采用反应模式 当有IO事件发生时 再调度它 而...

    Java NIO实战开发多人聊天室

    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的简单聊天软件示例

    JAVA NIO有两种解释:一种叫非阻塞IO(Non-blocking I/O),另一种也叫新的IO(New I/O),其实是同一个概念。它是一种同步非阻塞的I/O模型,也是...本例是使用java nio实现的简单聊天系统,界面简单,旨在学习java nio

Global site tag (gtag.js) - Google Analytics