锁定老帖子 主题:javase-富文本聊天工具
精华帖 (0) :: 良好帖 (7) :: 新手帖 (2) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2012-02-27
爪哇岛岛主 写道 果断新手帖
哈哈,同样是聊天,新手就新手啦 只是对对Action的处理上实现了配置,有点像Struts的极小版 (功能相当的单一!!!,也是从它哪里想到这么处理的), 也没看见过有多少人发这样的聊天工具(功能丰富点的,只看到页面相当华丽的,我的这个页面,有点丢 SWING的脸拉啊),写了玩玩,交流一下而已 |
|
返回顶楼 | |
发表时间:2012-02-27
楼主的GG聊天真可以抖动么?
|
|
返回顶楼 | |
发表时间:2012-02-27
dicmo 写道 楼主的GG聊天真可以抖动么?
当然啦,可以抖的,即使他的只要他登上,不管有木有打开聊天窗口,抖一下,就弹出来了 安装有问题的话可以问我的 |
|
返回顶楼 | |
发表时间:2012-02-27
其实大家都是来看界面的
|
|
返回顶楼 | |
发表时间:2012-02-27
加油呗,看照片还挺帅。
|
|
返回顶楼 | |
发表时间:2012-02-27
Function 写道 xx0326 写道 好像还不错!嘿嘿。楼主继续加油啊,还有version 2.0 么?
这个有的,也写好了,这个版本的的功能和前面都一样,只是实现不一样了, 采用的是ChannelSocket,服务器不用保持和客户端的连接状态, 只需要启动一个线程就可以管理连上来的客户端了。 LZ说的是NIO的实现吗? 可以分享一下代码吗? 另外即使是NIO 的实现 还是要保持TCP连接的吧? |
|
返回顶楼 | |
发表时间: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(); } } } } 有点长不好意思了 |
|
返回顶楼 | |
发表时间:2012-02-28
你们凭什么指指点点?
|
|
返回顶楼 | |
发表时间:2012-02-28
不错,支持一下。
|
|
返回顶楼 | |
发表时间:2012-02-28
终于看到南京的同仁了,支持LZ…
Function 写道 xx0326 写道 好像还不错!嘿嘿。楼主继续加油啊,还有version 2.0 么?
这个有的,也写好了,这个版本的的功能和前面都一样,只是实现不一样了, 采用的是ChannelSocket,服务器不用保持和客户端的连接状态, 只需要启动一个线程就可以管理连上来的客户端了。 |
|
返回顶楼 | |