需要准备的类有:

1:QqClientLogin:登录的入口,new三个类:User+QqClientUser+QQFriendList。

2:QqClientUser:处理的业务逻辑有: 登录,添加用户,修改资料等等后期可拓展,它再调用QqClientConServer的方法,再发送给服务器MyQqServer然后再返回。

3:MyServerFrame:服务器的界面

4:  QqClientConServer ======客户端的后台。

5:   MyQqServer           ======服务器 :new Message类。

6:在服务器和客户端的common包里:User类和Message类。这是共同的语言,这样客户端和服务器都能阅读对方的“情报”。

 

       登陆认证流程:当用户点击登录后,客户端QqClientConServer给服务器MyQqServer发送账号和密码,服务器进行验证登陆。判断是否合法。如果合法则允许登陆,跳转至好友列表界面,不合法则弹出报错窗口。详情见:图5

 

第一步:写服务器界面和服务器:MyServerFrame+MyQqServer.

               1:写服务器的启动界面 MyServerFrame。

               2:服务器 MyQqServer。 附加知识:对象流:账号和密码以及消息通过对象流在客户端和服务器之间进行传递。注:对象流要在网络间传递必须要继承:Serializable。PS:对象流需要准备好的类有:User 和Message 都放在com.qq.common中。

       第二步:User+Message

                    一:User设为一个对象:姓名和密码是属性。客户端输出流:将登录的账号和密码输出对象u给服务器。

                    二:Message:发送信息验证是否合法,可以定义一系列Message确认包,非确认包,聊天信息等。对Message规定规则:mesType 1 表示登陆成功的回送。mesType 2 表示登陆失败。mesType 3 表示普通消息包。

                      服务器输出流:将消息包Messge m,发送给客户端。

       第三步:QqClientUser : new QqClientConServer(),将对象u传给它,并且调用它的方法回溯给登录界面。

public class QqClientUser {
                            public  boolean checkUser(User u){
 
return new QqClientConServer().sendLoginInfoToServer(u);
}
 
}

       第四步:QqClientConServer: 建立客户端的socket,输出对象User 给服务器。输入服务器发来的Message包。

             

public boolean sendLoginInfoToServer(Object o) {
        boolean b=false;
   try {
       Socket s= new Socket("127.0.0.1", 7777);
ObjectOutputStream oos= new ObjectOutputStream(s.getOutputStream());
oos.writeObject(o);
 
ObjectInputStream ois = new ObjectInputStream(s.getInputStream());
Message ms=(Message)ois.readObject();
if (ms.getMesType().equals("1")) {
b= true;
}
} catch (Exception e) {
}
return b;
}
}

 

      第五步:完善MyQqServer:

         

public MyQqServer() {
                       try {
                         System.out.println("我是服务器我在7777号端口进行监听");
                            ServerSocket ss=new ServerSocket(7777);
                            while(true){
                                 Socket s=ss.accept();
                           //首先需要接收客服端第一次发来的登录的消息
                            ObjectInputStream ois = new ObjectInputStream(s.getInputStream());
                            User u= (User)ois.readObject();
                            System.out.println("收到从服务器发送过来的账户为:"+u.getUserid()+"密码为:"+u.getUserpasswd());
   Message m= new Message();
                                       if (u.getUserpasswd().equals("123456")) {
                                              //返回一个成功登录的信息包
                                           m.setMesType("1");
}else {
     m.setMesType("2");
}
ObjectOutputStream oos= new ObjectOutputStream(s.getOutputStream());
        oos.writeObject(m);
}
} catch (Exception e) {
}

第六步:完善好QqClientLogin,给账户框,密码框,和登录按钮增加动作监听器。

public void actionPerformed(ActionEvent e) {
if (e.getSource()==jp1_jb1) {
QqClientUser qqclientuser=new QqClientUser();
User u=new User();
u.setUserid(jtf.getText().trim());
u.setUserpasswd(new String(jpf.getPassword()));
if(qqclientuser.checkUser(u)){
new QqFriendList();
//关闭登录界面
this.dispose();
}else {
JOptionPane.showMessageDialog(this,"用户名密码错误");
}
}

 

ps:输入输出流的线路。

客户端输出流oos:发送登录的User:用户名和密码。

图1

服务器输入流ois :接收用户名和密码User。

图2

服务器输出流oos:输出给客户端的Message包。

图3

客户端输入流ois:接收服务器来的Message包。

图4