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

来源:互联网 发布:python字符串提取数字 编辑:程序博客网 时间:2024/06/05 20:07

接着之前的主题,这里讲一下各个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 修饰的,这样保证其他线程能正确获取属性的值;

原创粉丝点击