1.思路图
2.主要功能
实现一对一聊天
实现多对多聊天
好友上线自动刷新功能
3.知识点
界面布局:一是流布局,二是卡片布局(现在应该都不用了)
socket通信之对象流objectinput/outputStream
将线程里面的信息显示到界面上
4.项目代码
4.1服务端
common下有三个类:
Message.java
package com.qq.common;
public class Message implements java.io.Serializable{
private String mesType;
private String sender;
private String getter;
private String con;
private String sendTime;
public String getSender() {
return sender;
}
public void setSender(String sender) {
this.sender = sender;
}
public String getGetter() {
return getter;
}
public void setGetter(String getter) {
this.getter = getter;
}
public String getCon() {
return con;
}
public void setCon(String con) {
this.con = con;
}
public String getSendTime() {
return sendTime;
}
public void setSendTime(String sendTime) {
this.sendTime = sendTime;
}
public String getMesType() {
return mesType;
}
public void setMesType(String mesType) {
this.mesType = mesType;
}
}
接口MessageType.java
/**
* 定义包的种类
*/
package com.qq.common;
public interface MessageType {
String message_succeed="1";//表明是登陆成功
String message_login_fail="2";//表明登录失败
String message_comm_mes="3";//普通信息包
String message_get_onLineFriend="4";//要求在线好友的包
String message_ret_onLineFriend="5";//返回在线好友的包
}
User.java
/**
* 这是用户信息类
*/
package com.qq.common;
public class User implements java.io.Serializable {
private String userId;
private String passwd;
public String getUserId() {
return userId;
}
public void setUserId(String userId) {
this.userId = userId;
}
public String getPasswd() {
return passwd;
}
public void setPasswd(String passwd) {
this.passwd = passwd;
}
}
Model下面有三个类:
ManageClientThread.java
package com.qq.server.model;
import java.util.*;
public class ManageClientThread {
public static HashMap hm=new HashMap<String, SerConClientThread>();
//向hm中添加一个客户端通讯线程
public static void addClientThread(String uid,SerConClientThread ct)
{
hm.put(uid, ct);
}
public static SerConClientThread getClientThread(String uid)
{
return (SerConClientThread)hm.get(uid);
}
//返回当前在线的人的情况
public static String getAllOnLineUserid()
{
//使用迭代器完成
Iterator it=hm.keySet().iterator();
String res="";
while(it.hasNext())
{
res+=it.next().toString()+" ";
}
return res;
}
}
MyQqServer.java
/**
* 这是qq服务器,它在监听,等待某个qq客户端,来连接
*/
package com.qq.server.model;
import com.qq.common.*;
import java.net.*;
import java.io.*;
import java.util.*;
public class MyQqServer {
public MyQqServer()
{
try {
//在9999监听
System.out.println("我是服务器,在9999监听");
ServerSocket ss=new ServerSocket(9999);
//阻塞,等待连接
while(true)
{
Socket s=ss.accept();
//接收客户端发来的信息.
ObjectInputStream ois=new ObjectInputStream(s.getInputStream());
User u=(User)ois.readObject();
System.out.println("服务器接收到用户id:"+u.getUserId()+" 密码:"+u.getPasswd());
Message m=new Message();
ObjectOutputStream oos=new ObjectOutputStream(s.getOutputStream());
if(u.getPasswd().equals("123456"))
{
//返回一个成功登陆的信息报
m.setMesType("1");
oos.writeObject(m);
//这里就单开一个线程,让该线程与该客户端保持通讯.
SerConClientThread scct=new SerConClientThread(s);
ManageClientThread.addClientThread(u.getUserId(), scct);