需要准备的类有:
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