`
谷超
  • 浏览: 166204 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Java NIO--聊天室聊天

    博客分类:
  • Java
阅读更多

最近写了个Java NIO聊天室聊天的程序,NIO学习起来比较困难的,我的代码能给大家起到一个抛砖引玉的作用!

 

服务端:

package test.javanio;

/**
 * @author 
 * @version 
 * CreateTime:2010-12-1 下午05:12:11
 * Description:
 */
import java.io.IOException;
import java.net.InetSocketAddress;
import java.nio.ByteBuffer;
import java.nio.channels.SelectionKey;
import java.nio.channels.Selector;
import java.nio.channels.ServerSocketChannel;
import java.nio.channels.SocketChannel;
import java.util.Date;
import java.util.Iterator;
import java.util.logging.Level;
import java.util.logging.Logger;

public class MySocketServer implements Runnable {

	private boolean running;

	private Selector selector;
	String writeMsg;
	StringBuffer sb = new StringBuffer();
	SelectionKey ssckey;

	public MySocketServer() {

		running = true;

	}

	public void init() {
		try {
			selector = Selector.open();
			ServerSocketChannel ssc = ServerSocketChannel.open();
			ssc.configureBlocking(false);
			ssc.socket().bind(new InetSocketAddress(2345));
			ssckey = ssc.register(selector, SelectionKey.OP_ACCEPT);
			System.out.println("server is starting..." + new Date());
		} catch (IOException ex) {
			Logger.getLogger(MySocketServer.class.getName()).log(Level.SEVERE,
					null, ex);
		}
	}

	public static void main(String[] args) {
		MySocketServer server = new MySocketServer();
		new Thread(server).start();

	}

	public void execute() {
		try {
			while (running) {
				int num = selector.select();
				if (num > 0) {
					Iterator<SelectionKey> it = selector.selectedKeys()
							.iterator();
					while (it.hasNext()) {
						SelectionKey key = it.next();
						it.remove();
						if (!key.isValid())
							continue;
						if (key.isAcceptable()) {
							System.out.println("isAcceptable");
							getConn(key);
						} else if (key.isReadable()) {
							System.out.println("isReadable");
							readMsg(key);
						}

						else if (key.isValid() && key.isWritable()) {
							if (writeMsg != null) {
								System.out.println("isWritable");
								writeMsg(key);
							}

						}

						else
							break;

					}

				}
				Thread.yield();
			}

		} catch (IOException ex) {
			Logger.getLogger(MySocketServer.class.getName()).log(Level.SEVERE,
					null, ex);
		}
	}

	private void getConn(SelectionKey key) throws IOException {
		ServerSocketChannel ssc = (ServerSocketChannel) key.channel();
		SocketChannel sc = ssc.accept();
		sc.configureBlocking(false);
		sc.register(selector, SelectionKey.OP_READ);
		System.out.println("build connection :"
				+ sc.socket().getRemoteSocketAddress());
	}

	private void readMsg(SelectionKey key) throws IOException {
		sb.delete(0, sb.length());
		SocketChannel sc = (SocketChannel) key.channel();
		System.out.print(sc.socket().getRemoteSocketAddress() + " ");
		ByteBuffer buffer = ByteBuffer.allocate(1024);
		buffer.clear();
		int len = 0;
		StringBuffer sb = new StringBuffer();
		while ((len = sc.read(buffer)) > 0) {
			buffer.flip();
			sb.append(new String(buffer.array(), 0, len));
		}
		if (sb.length() > 0)
			System.out.println("get from client:" + sb.toString());
		if (sb.toString().trim().toLowerCase().equals("quit")) {
			sc.write(ByteBuffer.wrap("BYE".getBytes()));
			System.out.println("client is closed "
					+ sc.socket().getRemoteSocketAddress());
			key.cancel();
			sc.close();
			sc.socket().close();

		} else {
			String toMsg = sc.socket().getRemoteSocketAddress() + "said:"
					+ sb.toString();
			System.out.println(toMsg);

			writeMsg = toMsg;

			/*
			 * Iterator<SelectionKey> it=key.selector().keys().iterator();
			 * 
			 * while(it.hasNext()){ SelectionKey skey=it.next();
			 * if(skey!=key&&skey!=ssckey){ SocketChannel client=(SocketChannel)
			 * skey.channel(); client.write(ByteBuffer.wrap(toMsg.getBytes()));
			 * }
			 * 
			 * }
			 */

			/*
			 * 
			 * key.attach(toMsg);
			 * key.interestOps(key.interestOps()|SelectionKey.OP_WRITE);
			 */
			Iterator<SelectionKey> it = key.selector().keys().iterator();

			while (it.hasNext()) {
				SelectionKey skey = it.next();
				if (skey != key && skey != ssckey) {
					if (skey.attachment() != null) {
						String str = (String) skey.attachment();
						skey.attach(str + toMsg);
					} else {
						skey.attach(toMsg);
					}
					skey
							.interestOps(skey.interestOps()
									| SelectionKey.OP_WRITE);
				}

			}
			selector.wakeup();// 可有可无

		}

	}

	public void run() {
		init();
		execute();
	}

	private void writeMsg(SelectionKey key) throws IOException {

		System.out.println("++++enter write+++");
		SocketChannel sc = (SocketChannel) key.channel();
		String str = (String) key.attachment();

		sc.write(ByteBuffer.wrap(str.getBytes()));
		key.interestOps(SelectionKey.OP_READ);
	}
}

 

 

 

客户端:

package test.javanio;

/**
 * @author 
 * @version 
 * CreateTime:2010-12-1 下午05:12:46
 * Description:
 */
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.InetSocketAddress;
import java.nio.ByteBuffer;
import java.nio.channels.Selector;
import java.nio.channels.SocketChannel;
import java.util.logging.Level;
import java.util.logging.Logger;
import java.util.Currency.*;

public class MySocketClient implements Runnable {
	Selector selector;

	boolean running;

	SocketChannel sc;

	public MySocketClient() {
		running = true;

	}

	public void init() {
		try {
			sc = SocketChannel.open();
			sc.configureBlocking(false);
			sc.connect(new InetSocketAddress("localhost", 2345));

		} catch (IOException ex) {
			Logger.getLogger(MySocketClient.class.getName()).log(Level.SEVERE,
					null, ex);
		}
	}

	public static void main(String[] args) {

		MySocketClient client = new MySocketClient();
		new Thread(client).start();
	}

	public void execute() {

		int num = 0;
		try {
			while (!sc.finishConnect()) {
			}
		} catch (IOException ex) {
			Logger.getLogger(MySocketClient.class.getName()).log(Level.SEVERE,
					null, ex);
		}

		ReadKeyBoard rkb = new ReadKeyBoard();
		new Thread(rkb).start();//启动一个线程向socket中进行写入数据
                //该线程从socket中读取数据
		while (running) {
			try {

				ByteBuffer buffer = ByteBuffer.allocate(1024);
				buffer.clear();

				StringBuffer sb = new StringBuffer();
				Thread.sleep(500);

				while ((num = sc.read(buffer)) > 0) {
					sb.append(new String(buffer.array(), 0, num));
					buffer.clear();
				}
				if (sb.length() > 0)
					System.out.println(sb.toString());
				if (sb.toString().toLowerCase().trim().equals("bye")) {
					System.out.println("closed....");

					sc.close();
					sc.socket().close();
					rkb.close();
					running = false;
				}
			} catch (InterruptedException ex) {
				Logger.getLogger(MySocketClient.class.getName()).log(
						Level.SEVERE, null, ex);
			} catch (IOException ex) {
				Logger.getLogger(MySocketClient.class.getName()).log(
						Level.SEVERE, null, ex);
			}
		}

	}

	public void run() {
		init();
		execute();
	}

	class ReadKeyBoard implements Runnable {

		boolean running2 = true;

		public ReadKeyBoard() {

		}

		public void close() {
			running2 = false;
		}

		public void run() {
			BufferedReader reader = new BufferedReader(new InputStreamReader(
					System.in));
			while (running2) {
				try {
					System.out.println("enter some commands:");
					String str = reader.readLine();
					sc.write(ByteBuffer.wrap(str.getBytes()));

				} catch (IOException ex) {
					Logger.getLogger(ReadKeyBoard.class.getName()).log(
							Level.SEVERE, null, ex);
				}
			}

		}

	}
}

 

分享到:
评论

相关推荐

    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 聊天室源码”项目中,开发者使用了NIO来构建一个聊天室应用,以实现用户之间的实时通信。 1. **Java NIO基础** - **通道(Channel)**:在NIO中,数据是通过通道进行传输的,如SocketChannel、...

    java nio聊天室源码

    在这个“java nio聊天室源码”项目中,我们可以看到如何使用NIO构建一个实时、高效的多人在线聊天应用。 首先,我们要理解Java NIO的基本概念。NIO包括以下关键组件: 1. **通道(Channels)**:通道是数据传输的...

    基于nio的简易聊天室

    总的来说,"基于nio的简易聊天室"项目综合运用了Java NIO的多种核心特性,通过通道、缓冲区和选择器实现了高效的网络通信,同时结合GUI提供了友好的用户体验。通过这个项目,开发者可以深入理解NIO在实际应用中的...

    JAVA NIO 聊天室程序

    **JAVA NIO 聊天室程序** 在Java编程领域,网络编程是一个重要的部分,而NIO(Non-blocking Input/Output)是Java提供的一种高效、非阻塞的I/O模型,它极大地提升了处理大量并发连接的能力。这个"JAVA NIO 聊天室...

    非GUI聊天室基于javaNIO

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

    Java视频教程 Java游戏服务器端开发 Netty NIO AIO Mina视频教程

    12.分析设计一个聊天室的小项目 二、java NIO,AIO编程视频教程 1、java NIO,AIO编程_01.flv 2、java NIO,AIO编程_02.flv 3、java NIO,AIO编程_03.flv 4、java NIO,AIO编程_04.flv 5、java NIO,AIO编程_05.flv ...

    Java NIO实战之聊天室功能详解

    Java NIO实战之聊天室功能详解主要介绍了Java NIO实战之聊天室功能,结合实例形式详细分析了Java NIO聊天室具体的服务端、客户端相关实现方法与操作注意事项。 Java NIO概述 Java NIO(New I/O)是一种Java API,...

    JAVA综合实验2聊天室

    在本实验中,我们将深入探讨Java编程语言在创建一个简单的聊天室应用中的应用。这个"JAVA综合实验2聊天室"项目旨在让学生理解网络编程的基本原理,特别是如何利用Java实现客户端和服务器之间的通信,以及如何设计多...

    基于NIO的Java聊天室2

    在本项目"基于NIO的Java聊天室2"中,我们深入探讨了如何利用Java的非阻塞I/O(New Input/Output,NIO)框架来实现一个多人在线聊天室。NIO是一种高效的I/O模型,它允许程序在不阻塞主线程的情况下处理输入和输出操作...

    java NIO socket聊天室

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

    java NIO 学习 聊天室程序 (3)

    在这个“Java NIO 学习 聊天室程序”项目中,我们将深入探讨NIO如何用于创建一个聊天室程序。这个程序可能包含以下几个关键部分: 1. **服务器端**:服务器端使用NIO的ServerSocketChannel监听客户端连接。当新的...

    多线程精品资源--Java NIO+多线程实现聊天室.zip

    在这个“多线程精品资源--Java NIO+多线程实现聊天室”的压缩包中,我们可以推测它包含了一套关于如何使用Java NIO和多线程技术来创建一个实时聊天应用的教程或示例代码。 首先,多线程是Java中并行处理的基础。...

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

    在这个"java基于NIO选择器Selector的多人聊天室"项目中,开发者利用NIO的核心特性构建了一个允许多个客户端同时进行交互的聊天平台。 首先,我们需要了解NIO的基本组件。在Java NIO中,`Selector`是核心角色,它...

    nio-chatroom:基于Java Nio的单服务器多客户端聊天室

    聊天室基于Java Nio的单服务器多客户端聊天室实施规范服务器来自客户端的所有请求都显示在服务器端服务器处理连接/断开而没有其他客户端告知所有客户变更客户端显示给所有用户的在线用户列表向所有用户显示连接/断开...

    java多线程程序设计:Java NIO+多线程实现聊天室

    java多线程程序设计:Java NIO+多线程实现聊天室 Java基于多线程和NIO实现聊天室 涉及到的技术点 线程池ThreadPoolExecutor 阻塞队列BlockingQueue,生产者消费者模式 Selector Channel ByteBuffer ProtoStuff 高...

    基于NIO的聊天室

    在这个基于NIO的聊天室项目中,我们可以通过分析`Server.java`、`Client.java`和`NioUtil.java`这三个文件来理解NIO的核心概念和实现方式。 首先,`Server.java`文件通常包含了服务器端的主逻辑。在NIO中,服务器会...

    java聊天室(绝对经典)

    第三种风格的聊天室可能采用了异步编程模型,比如Java 8引入的CompletableFuture或者NIO.2框架。这种实现方式可以更有效地管理并发,使得服务器能更好地应对高并发场景。 在"JAVA聊天室程序.rar"中,你可能会看到一...

    JavaNIO教程高清

    Java NIO(New I/O)是Java提供的一套新的输入/输出API,自Java 1.4版本起作为标准Java IO的替代方案被引入。NIO能够支持面向缓冲区的(Buffer-oriented)、基于通道的(Channel-based)I/O操作,与传统的基于流的I/...

    Java NIO 聊天室 JSwing

    import java.nio.channels.SocketChannel; import java.util.Iterator; import com.nio.user.ClientUser; import com.nio.user.ClientUserManager; import com.nio.user.UserData; public class NIOClient { ...

Global site tag (gtag.js) - Google Analytics