基于SocketChannel的即时聊天程序

来源:互联网 发布:淘宝美工应聘流程 编辑:程序博客网 时间:2024/06/04 17:50

SocketChannel 的另一个小设计,还是纯JAVA,和之前做的21点游戏差不多时间写的,这两天总结了一下大笑加了一个登陆和注册功能

写这篇笔记主要还是为了总结一下SocketChannel的使用敲打

主要功能:

1、广场群聊,即发送的消息所有在线的人都能看到

2、聊天室群聊,可以创建聊天室,进入聊天室的人可以在里面聊天,创建的人或者是第一个人为管理员,拥有踢人的权限;广场上有一个聊天室列表。

3、私聊,在广场和聊天室界面都有一个显示当前在线的人的列表,广场显示的是所有在线的前20名,聊天室显示的是聊天室的所有成员,右键弹出菜单即可选择私聊。

4、登陆与注册,之前是用 ip+port 来作为用户的唯一标识,但是后来我发现在不同的机器上,所取得(socketChannel.getLocalAddress().toString();)的 ip+port 的表示方式是不一样的,于是这两天新增了一个登陆与注册功能,用账号来作为用户的唯一标识。用户账号我直接以一定格式放在 txt 文件上。

其他功能:

用户修改昵称、私信消息提醒、敏感词过滤等。

聊天信息盘用的是JTextPane,一个支持富文本的输入框。

功能实现的思路同样是制定一个简单的数据传输约定,通过每一次在传输的数据前四个字节指定一个要实现的功能或请求,来转到特定的方法进行处理。

客户端每次请求服务器,服务器并不是直接响应的,而是在对请求进行处理后再决定要不要再另外对客户端发送请求。

在我看来,SocketChannel 的服务器和客户端就是在相互请求,一个请求可能会触发其他的若干请求;比如,客户端发送一个创建聊天室的请求,服务器接收到请求后进行相应处理,最后创建了一个新聊天室,首先服务器肯定要通知创建者创建成功,此外还要主动广播给所有的在线用户,更新他们的房间列表,而其中客户端的请求创建到创建成功并不是在同一个方法里的,或者说实际上不是一个连续的过程。在之前的web应用中,客户端发送请求后是会等待服务器的响应的,然后继续往下走,是一个连续的过程。

以登陆为例,在基于http的web应用上,客户端提交请求后会等待服务器响应,服务器可以将登陆反馈响应给客户端,我们可以在方法中就得到这个反馈,以通知用户,而在Socket 中,客户端提交登陆的请求后就完了,并没有其他动作,而我们设置服务器在处理完登陆请求后将反馈发送给客户端,这又是服务器给客户端发送请求了,所调用的是客户端的另一个方法。

但是很多时候我们需要知道此次请求的反馈才能进行下一步动作,例如我在登陆窗口的类里面,我要知道登陆的结果才能决定要不要关闭登陆界面,还是提醒用户登录失败,所以我在客户端上设定了一个代表反馈信息的字符串,在登陆方法中,发送请求后会一直查询这个字符串是否被改变,若改变了就返回这个字符串就行,这个字符串就相当于服务器的响应,而服务器发送反馈信息到客户端后客户端将其赋值给这个字符串就行了,代码如下 :

//登陆反馈信息String loginFeedback = null;//客户端接收到反馈信息的请求后最终调用此方法public void setLoginFeedback(String str){loginFeedback = str;}//登陆public String login(String userId,String password){loginFeedback = null;handler.login(userId,password);int i = 0;while(i<10){try{Thread.sleep(500);if(loginFeedback!=null){return loginFeedback;}}catch(Exception e){}}return "超时,登陆失败";}
而在界面类中直接调用login方法(base为上面的代码所在的类):

//TODO 登陆public void login(String userId,String password){String mess = base.login(userId, password);if(mess.equals("success")){dispose();}else{JOptionPane.showMessageDialog(contentPanel, mess);}}

最后,附上一些界面的截图:

主界面:


聊天室:

私聊:



0 0
原创粉丝点击