您的位置:首页 > 编程语言 > Java开发

【Java小项目】山寨QQ

2015-11-12 20:38 435 查看
  最近看着韩顺平老师的视频加上百度谷歌做了这个小玩意。



  主要功能:

           服务器端:

                      1.选择监听端口

                      2.打印服务器日志

                      3.查看在线用户(强制下线没做)

           客户端:

                      1.登陆的密码我写死到程序里了(密码是一个空格)

                      2.三个分组可切换

                      3.可多对多聊天

                      4.A找B好友聊天时,若B好友没有打开与A聊天的界面,则B与A聊天的界面会直接弹出

                      5.可以选择要链接的服务器的地址和端口

                     
6.上线,下线好友头像会有相应变化

    思路:

            服务器和客户端用ObjectOutputStream,ObjectInputStream 进行通信,把数据包封装到类里(User,Message)。

            服务器端:

                     1.点击启动服务器时启动一个线程来监听端口

public void run(){
try {
while(true) {
Socket s = ss.accept();
ObjectInputStream ois = new ObjectInputStream(s.getInputStream());
User u = (User) ois.readObject();
System.out.println("收到UserName:" + u.getUserName() + " PassWard:" + u.getPassWard());
Message m = new Message();
ObjectOutputStream oos = new ObjectOutputStream(s.getOutputStream());
if (u.getPassWard().equals(" ")) {
display.di.showLog("用户名:"+u.getUserName() + " 登陆成功!密码:" + u.getPassWard());
m.setType("success");
oos.writeObject(m);
//启动一个线程来服务
myThread mythread=new myThread(s,oos,ois);
mythread.start();
threadManger.addThread(u.getUserName(),mythread);
threadManger.friendAlert();
} else {
display.di.showLog("用户名:"+u.getUserName() + " 登陆失败!密码:" + u.getPassWard());
m.setType("failed");
oos.writeObject(m);
oos.close();
}
}
}catch(IOException e){
e.printStackTrace();
}catch (ClassNotFoundException e) {
e.printStackTrace();
}
}


                  2.监听到登陆,如果登陆成功就在启动一个线程来维持与该Socket的通信

public void run(){

try {
while(true) {
Message m = (Message)ois.readObject();
if(m.getType().equals("sendMsg")) {
System.out.println(s + m.getSender() + " 对 " + m.getGetter() + " 说:" + m.getMsg());
display.di.showLog(s.getInetAddress()+" : "+m.getSender() + " 对 " + m.getGetter() + " 说:" + m.getMsg());
//转发
myThread fri = threadManger.getThread(m.getGetter());
fri.oos.writeObject(m);
}else if(m.getType().equals("LoginOut")){
display.di.showLog(m.getSender()+"下线!");
threadManger.delThread(m.getSender());
threadManger.friendAlert();
System.out.println(m.getSender()+" loginOut!");
}
}
} catch (IOException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
         客户端:

                   1.用填写的信息登陆,若成功的话就启动一个线程来负责该客户端与服务器端之间的通信。

public void run(){
try {
while(true) {
Message m = (Message)clientUser.getOIS().readObject();
if(m.getType().equals("sendMsg")) {
System.out.println(m.getSender() + " say to " + m.getGetter() + " with " + m.getMsg());
//已经打开聊天界面
if(chatManger.Getchat(m.getGetter() + "_" + m.getSender())!=null) {
chat ch = chatManger.Getchat(m.getGetter() + "_" + m.getSender());
ch.ShowMsg(m.getSender() + " : " + m.getMsg());
}else{
chat ch=new chat(m.getGetter(),m.getSender());
chatManger.Addchat(m.getGetter()+"_"+m.getSender(),ch);
ch.ShowMsg(m.getSender() + " : " + m.getMsg());
}

}else if(m.getType().equals("getFriend")){
//好友列表
Object[] l=m.getFriList();
System.out.println(m.getType()+"  "+l.length);
listManger.getMainL().changeList(l);
}
}
} catch (IOException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}


  完整代码:

CSDN下载上传了但是刷不出来啊

GitHub地址:https://github.com/zhang-tiancheng/qq-little_copycat






内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息