论坛首页 综合技术论坛

javase-富文本聊天工具

浏览 23184 次
精华帖 (0) :: 良好帖 (7) :: 新手帖 (2) :: 隐藏帖 (0)
作者 正文
   发表时间:2012-02-27  
爪哇岛岛主 写道
果断新手帖

哈哈,同样是聊天,新手就新手啦
只是对对Action的处理上实现了配置,有点像Struts的极小版
(功能相当的单一!!!,也是从它哪里想到这么处理的),
也没看见过有多少人发这样的聊天工具(功能丰富点的,只看到页面相当华丽的,我的这个页面,有点丢 SWING的脸拉啊),写了玩玩,交流一下而已
0 请登录后投票
   发表时间:2012-02-27  
楼主的GG聊天真可以抖动么?
0 请登录后投票
   发表时间:2012-02-27  
dicmo 写道
楼主的GG聊天真可以抖动么?

当然啦,可以抖的,即使他的只要他登上,不管有木有打开聊天窗口,抖一下,就弹出来了
安装有问题的话可以问我的
0 请登录后投票
   发表时间:2012-02-27  
其实大家都是来看界面的
0 请登录后投票
   发表时间:2012-02-27  
加油呗,看照片还挺帅。
0 请登录后投票
   发表时间:2012-02-27  
Function 写道
xx0326 写道
好像还不错!嘿嘿。楼主继续加油啊,还有version 2.0 么?

这个有的,也写好了,这个版本的的功能和前面都一样,只是实现不一样了,
采用的是ChannelSocket,服务器不用保持和客户端的连接状态,
只需要启动一个线程就可以管理连上来的客户端了。


LZ说的是NIO的实现吗?
可以分享一下代码吗?

另外即使是NIO 的实现 还是要保持TCP连接的吧?
0 请登录后投票
   发表时间:2012-02-27   最后修改:2012-02-27
easyhaohao 写道
Function 写道
xx0326 写道
好像还不错!嘿嘿。楼主继续加油啊,还有version 2.0 么?

这个有的,也写好了,这个版本的的功能和前面都一样,只是实现不一样了,
采用的是ChannelSocket,服务器不用保持和客户端的连接状态,
只需要启动一个线程就可以管理连上来的客户端了。


LZ说的是NIO的实现吗?
可以分享一下代码吗?

另外即使是NIO 的实现 还是要保持TCP连接的吧?

是nio,说错了,不用维护和客户端通信的线程,这样服务器的压力就小了。
我把那个类上传一下
nio,我没找到如何使用对象流,我把对象进行字节化,
打包后数据流的前四个字节为这个包的大小,然后再把字节转成 对象,这样数据包就 做好了
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.nio.ByteBuffer;

public class BStream {

	public static ByteBuffer toByteBuffer(Object object) {
		ByteArrayOutputStream bio = new ByteArrayOutputStream();
		ObjectOutputStream oos = null;
		ByteBuffer outBuf = null;
		try {
			oos = new ObjectOutputStream(bio);
			oos.writeObject(object);
			byte[] ba = bio.toByteArray();
			int len = ba.length;
			outBuf = ByteBuffer.allocate((Integer.SIZE >> 3) + len);
			outBuf.putInt(len);
			outBuf.put(ba);
			outBuf.flip();
		} catch (IOException e) {
			e.printStackTrace();
		} finally {
			try {
				if (bio != null)
					bio.close();
				if (oos != null)
					oos.close();
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
		return outBuf;
	}

	public static Object toObject(byte[] buff) {
		ByteArrayInputStream bis = new ByteArrayInputStream(buff);
		ObjectInputStream ois = null;
		try {
			ois = new ObjectInputStream(bis);
		} catch (IOException e) {
			e.printStackTrace();
		}

		Object object = null;
		try {
			object = ois.readObject();
		} catch (IOException e) {
			e.printStackTrace();
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		} finally {
			try {
				if (bis != null)
					bis.close();
				if (ois != null)
					ois.close();
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
		return object;
	}
}

处理Action的类
while (selector.select() > 0) {
				for (SelectionKey sk : selector.selectedKeys()) {
					selector.selectedKeys().remove(sk);
					if (sk.isAcceptable()) {
						System.out.println("client connected");
						ServerUI.setMessage("client connected");
						SocketChannel sc = server.accept();
						sc.configureBlocking(false);
						sc.register(selector, SelectionKey.OP_READ);
						
						sk.interestOps(SelectionKey.OP_ACCEPT);
					}
					if (sk.isReadable()) {
						System.out.println("client message");
						SocketChannel sc = (SocketChannel) sk.channel();
//						new ServiceThread(sc).start();
						
						byte[] data = null;
						try {
							ByteBuffer lenbuff = ByteBuffer.allocate(4);
							sc.read(lenbuff);
							lenbuff.flip();
							int len = lenbuff.getInt();
							if(len == 0) {
								return;
							}

							ByteBuffer buff = ByteBuffer.allocate(len);
							sc.read(buff);
							buff.flip();
							data = buff.array();
							sk.interestOps(SelectionKey.OP_READ);
						} catch (IOException e) {
							if(sk.channel() != null) {
								sk.channel().close();
							}
//							e.printStackTrace();
						}
						Request request = (Request) BStream.toObject(data);
						String action = request.getAction();
						try {
							System.out.println("client:" + action);
							Class<?> ac = Configuration.getClazz(action);
							Method method = ac.getMethod("execute", Request.class,
									Response.class, SocketChannel.class);
							
							//
							
							method.invoke(ac.newInstance(), request, new Response(request
									.getReponseAction()), sc);
						} catch (Exception e) {
							e.printStackTrace();
						}
						
					}
				}
			}

有点长不好意思了
0 请登录后投票
   发表时间:2012-02-28  
你们凭什么指指点点?
0 请登录后投票
   发表时间:2012-02-28  
不错,支持一下。
0 请登录后投票
   发表时间:2012-02-28  
终于看到南京的同仁了,支持LZ…
Function 写道
xx0326 写道
好像还不错!嘿嘿。楼主继续加油啊,还有version 2.0 么?

这个有的,也写好了,这个版本的的功能和前面都一样,只是实现不一样了,
采用的是ChannelSocket,服务器不用保持和客户端的连接状态,
只需要启动一个线程就可以管理连上来的客户端了。

0 请登录后投票
论坛首页 综合技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics