现在的位置: 首页 > 综合 > 正文

模拟qq群聊

2013年12月19日 ⁄ 综合 ⁄ 共 3215字 ⁄ 字号 评论关闭

1,项目目录

2.下面直接贴代码

/**
 * 表示一个客户端的信息
 * @author Administrator
 *
 */
public class UserInfo {
private String name;
private String psw;
private String loginTime;
private String address;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPsw() {
return psw;
}
public void setPsw(String psw) {
this.psw = psw;
}
public String getLoginTime() {
return loginTime;
}
public void setLoginTime(String loginTime) {
this.loginTime = loginTime;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
}

/**
 * 服务器
 * @author Administrator
 *
 */
public class ChatServer {
private ServerSocket ss ;
public void startServer(int port) {
try {
ss = new ServerSocket(port);
System.out.println("服务器已启动");
while(true) {
Socket client = ss.accept();
ServerThread st = new ServerThread(client);
st.start();
System.out.println("已开启一个线程处理:"+ client.getLocalAddress().getHostAddress() +"的请求");
}
} catch (IOException e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
ChatServer cs = new ChatServer();
cs.startServer(9090);
}
}

/**
 * 每一个客户端对应一个此对象,处理
 * @author Administrator
 *
 */
public class ServerThread extends Thread{
private Socket client;
private BufferedReader br;
private OutputStream os;
private UserInfo user;
 
public UserInfo getClient(){
return user;
}
public ServerThread(Socket client){
try {
this.client = client;
br = new BufferedReader(new InputStreamReader(client.getInputStream()));
os = client.getOutputStream();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
 

//处理客户端的代码
public void run() {
processSocket();
}

//将信息msg发送到对应的客户端
public void sendMsg2Me(String msg) {
try {
msg += "\r\n";
os.write(msg.getBytes());
os.flush();
} catch (IOException e) {
e.printStackTrace();
}
}

/**
*处理客户端的函数
*包括验证用户名密码
*和客户端通信
*/
public void processSocket() {
try {
sendMsg2Me("欢迎登陆系统");
sendMsg2Me("请输入用户名");
String name = br.readLine();
sendMsg2Me("请输入密码");
String psw = br.readLine();
user = new UserInfo();
user.setName(name);
user.setPsw(psw);
if(DaoTools.isExists(user)) {
ChatTools.addClient(this);
String input = br.readLine();
while(!"bye".equals(input)){
System.out.println("服务器受到的信息是:"+input);
ChatTools.castMsg(user, input);
input = br.readLine();
}
}
else {
this.closeMe();
return ;
}
ChatTools.castMsg(this.user, "我下线了,再见!");
this.closeMe();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}

public void closeMe() {
try {
client.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}

/**
 * 发送消息的类
 * @author Administrator
 *
 */
public class ChatTools {
//用一个队列保存所有的用户
private static List<ServerThread> allClient = new ArrayList<ServerThread>();


public static void addClient(ServerThread st) {
allClient.add(st);
castMsg(st.getClient(),"我上线了"+"现在人数:"+allClient.size());
}
/**
* 将用户user发送的信息发送给所有的用户
*/
public static void castMsg(UserInfo user,String msg) {
msg = user.getName()+"说:"+msg;
for(int i=0; i<allClient.size(); i++) {
ServerThread st = allClient.get(i);
st.sendMsg2Me(msg);
}
}
}

public class DaoTools {
//内存用户信息数据库
private static Map<String,UserInfo> allUser = new HashMap<String,UserInfo>();

//在类加载时就生成10个用户,优先于其他方法执行
static {
for(int i=1; i<=10; i++) {
UserInfo user = new UserInfo();
user.setName("name"+i);
user.setPsw("psw"+i);
allUser.put(user.getName(), user);
}
}
//判断用户user是否存在
public static boolean isExists(UserInfo user){
if(allUser.containsKey(user.getName())) 
return true;
System.out.println("认证失败,系统中不存在此用户"+user.getName());
return false;
}
}

3,客户端

客户端可以直接通过telnet工具连接

格式为 进入cmd    输入 telnet localhost 9090

抱歉!评论已关闭.