基于JAVA Swing,Hibernate,MySQL模拟QQ(二)

接着之前的主题,这里讲一下各个JFrame之间的数据交互关系,
这里写图片描述
实际上,这里所有的面板的数据获取源都是Acceptor,在Acceptor中我定义了很多静态的属性:

public class Acceptor {
    public volatile static int Feedback = 0 ;
    public volatile static List<User> Friendlist;
    public static User host;
    public static ListPanel listpanel ;
    public static Set<Message> msgSet = new HashSet<>(100);
    public static List<userFrame> frameList = new ArrayList<>();

这样当Acceptor接收到数据后,Acceptor不会主动的推送这些数据到相应的面板上(Set msgSet 除外,Acceptor获取消息后,会判断是否存在相应的对话框,如果存在,则刷新当前对话框,否则只是标红List Panel中相应的friendlist)

下面来解释一下不同的属性的含义和作用:
Feedback :其实这是一个状态控制属性;server会返回不同的Interger,会保存在Feedback 上,但是在一个时间点上,Feedback 只会有一个值;一下是不同值的含义:
/**
* here Integer represent :
* 0 : silence ;
* 1 : Login success ;
* 2 : Login failed ;
* 3 : Register success ;
* 4 : Register failed ;
* 16: server send successfully ;
* 17: client offline ;
* @author crf
*/
(原谅我的渣英语,我正在努力学好英语中~~~)

host : 客户端当前用户信息,这个不用解释了吧;

Friendlist:好友列表信息,这个之所以要保存,是因为每次创建新的对话框的时候,需要调用这些信息;

ListPanel:同样的也是因为对话框需要调用这里的信息;

msgSet:每次当msgSet发生变更的时候,便会主动的刷新对话框中的对话列表,而且系统开启后,该msgSet只会增加msg不能删除,也不能修改;Message的类的hashcode是由time和accepter两个部分组成;这样保证在每个对话列表中,根据时间排序;

frameList :保存已经存在的对话框;每次在点击好友头像时,会检查该list,如果对话框已经存在,则只是显示该对话框,而不新建,否则新建对话框;

好了,说到这里,其实这里的资源池,基本上都是为了对话框准备的~~它才是整个客户端的宝啊。。。

下面是Acceptor余下的代码:

private Acceptor(){}
    private static final Acceptor acceptor = new Acceptor();
    public static Acceptor getInstance(){
        return acceptor;
    }
    public void acceptFeedback(){
        new Thread(new Runnable() {
            public void run() {
                try(ServerSocket ssocket = new ServerSocket(8887)){
                    //ServerSocket ssocket = new ServerSocket(8887);
                    while(true){
                        System.out.println("system listener start...");
                        /**
                         * utilize new feature of JAVA 8 ; here can close the stream
                         * automatically ;
                         */
                        Socket skt = ssocket.accept();
                        System.out.println("get the feed back from server:"+skt.getInetAddress());
                        try(ObjectInputStream incube=new ObjectInputStream(skt.getInputStream()))
                        {
                            Object obj = incube.readObject();
                            /**
                             * here get the User Object ;
                             */
                            if(obj instanceof Integer){
                                System.out.println("feedback Msg :"+(Integer)obj);
                                Feedback = (Integer) obj ;
                            }
                            else if(obj instanceof Message){
                                Message msg = (Message) obj;
/************************************************************************************************
*   set the target panel of friendList border red ;
*   notice here :   (msg.getSenter().getID()+"").equals(panel.getName()) ;
*                   I used the User.ID to name the panel we created ;
*/
                                for (JPanel panel :listpanel.getPanelList()){
                                    if((msg.getSenter().getID()+"").equals(panel.getName())){
                                        panel.setBorder(BorderFactory.createLineBorder(Color.RED,3));
                                        listpanel.repaint();
                                        msgSet.add(msg);
                                    }
                                }
/***********************************************************************************************/
                            }else if (obj instanceof List){
                                Friendlist =(List<User>) obj;
                            }
                        } catch (ClassNotFoundException e) {
                            e.printStackTrace();
                        }
                        }
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }).start();
    }
}

Acceptor是单独开启的线程,循环不停的接收服务器信息;有些在其他循环中会用到的静态属性,是volatile 修饰的,这样保证其他线程能正确获取属性的值;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值