java聊天室的实现

java 聊天室的实现

1.部分代码

Sqlserver类是一个自己设定的数据存储类,与登录界面共同作用,记录当前在线的人数,以及实现一些必备的功能函数,如返回在线用户的列表,删除用户等。

projectcenter;
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134

import java.util.Arrays;
import java.util.HashMap;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;

//用户数据库
public class SqlServer {
private static Map<String,UserInfor>SQL=new HashMap();

//判断输入账号是否存在
public static boolean CheckUser(String name) {
if(SQL.containsKey(name)) {
return true;
}
//System.out.println("不存在此用户:"+name);
return false;
}

//检查账号密码是否输入正确
public static boolean CheckPassword(String name,String Password) {
if(SQL.get(name).Check(Password)) {
return true;
}else {
return false;
}
}

//返回对象数组
public static Map<String, UserInfor> Getusers() {
return SQL;
}



//返回key1值对应的对象
public UserInfor returnUser(String name) {
return SQL.get(name);
}




//返回用户姓名列表
public String[] Groupusername() {

Object[] key = SQL.keySet().toArray();
Arrays.sort(key);
int l=key.length;
String username[]=new String[l];


for(int i=0;i<key.length;i++) {
username[i]=key[i].toString();
//System.out.println(key[i].toString());
}


return username;
}

//创建用户
public int BuildNewUser(String name,String password) {
if(SQL.containsKey(name)) {
//System.out.println("该用户名已存在!请重新输入");
return 0;
}else {
UserInfor u=new UserInfor();
u.SetName(name);
u.SetPwd(password);
System.out.println("新用户密码为:"+password);
this.SQL.put(name,u);
return 1;
}

}


//遍历打印Map中的键值对
public static void ShowMap(){
for(Map.Entry<String, UserInfor> entry: SQL.entrySet()){
System.out.println(entry.getKey()+"="+entry.getValue().toString());
}
}

//删除用户
public static void DeleteUser(String name) {
SQL.get(name).SetOnline2();


}

//返回在线的用户id列表
public String[] WhoisOnline() {

Object[] key = SQL.keySet().toArray();
Arrays.sort(key);
int l=key.length;
String username[]=new String[l];
for(int i=0;i<key.length;i++) {
if(SQL.get(key[i].toString()).getOnline()) {//如果在线则加入数组
username[i]=key[i].toString();
}
}
return username;
}

//返回不在线用户列表
public String[] WHoisnotOnline() {
Object[] key = SQL.keySet().toArray();
Arrays.sort(key);
int l=key.length;
String username[]=new String[l];
for(int i=0;i<key.length;i++) {
if(!SQL.get(key[i].toString()).getOnline()) {//如果不在线则加入数组
username[i]=key[i].toString();
}
}
return username;
}

//系统先建立十个用户
static{
for (int i=0;i<10;i++) {
UserInfor u=new UserInfor();
u.SetName(String.valueOf(i+1));//用户名即是索引
u.SetPwd("123456");
SQL.put(u.get_name(),u);
}
}


}

接下来是用户界面类,与BuildCheck类相连接每当用户实现了登录窗口的检测,则新建一个用户类对象Client,用户类中包含了界面的实现和socket消息的发送和接受,以信息的开头辨别信息的种类,若为一号信息则是私聊信息,则再在BufferedReader中读取私聊信息并显示在私聊界面上,二号信息指代群信息。在界面设计时,应当有好友列表上下线下线的的刷新。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173

public class Client extends Thread{/部分代码

//监听事件的添加
send.addActionListener(new ActionListener() {//发送私聊消息

@Override
public void actionPerformed(ActionEvent arg0) {
// TODO Auto-generated method stub
WriterMess("1");//表示是私聊信息
WriterMess(selected);//私聊用户号
String mess=textfield.getText();
WriterMess(mess);//私聊信息
area.append("自己:"+mess+"\n");
if(mess.equals("bye")) {//设置用户下线
WriterMess("3");
}
}

});

send2.addActionListener(new ActionListener() {//实现群聊功能

@Override
public void actionPerformed(ActionEvent arg0) {
// TODO Auto-generated method stub
try {
WriterMess("2");
String gets=textfield2.getText();
WriterMess(gets);
if(gets.equals("bye")) {//设置用户下线
WriterMess("3");
}
} catch(Exception e) {
e.printStackTrace();

}
}

});

//JList点击事件的添加
list1.addMouseListener(new MouseAdapter() {

@Override
public void mouseClicked(MouseEvent arg0) {
// TODO Auto-generated method stub
String select=(String) list1.getSelectedValue();
if(!select.equals(userinfor.get_name())) {//不能对自己进行私聊
area.append(" ================================================\n");
area.append(" ===你选择"+select+"号在线客户进行私聊===\n");

selected=select;

}else {
area.append(" ============您不能选择自己进行私聊!===========\n");
}
}

});

list2.addMouseListener(new MouseAdapter() {

@Override
public void mouseClicked(MouseEvent e) {
// TODO Auto-generated method stub
area.append("=================当前用户不在线!=============\n");
}


});

}


public void ShashSelf() {
this.use.updateUI();
}


public void CloseSelf() {//将自己关闭
try {
socket.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}

public void ReadMess() {
//读取服务器返回的消息
try {
BufferedReader br = new BufferedReader(new InputStreamReader(in));
String mess1 = br.readLine();
while(true) {

//私聊消息

System.out.println("mess1:"+mess1);
System.out.println("****************************************");




/*while(mess1.equals("4")) {//刷新
this.use.revalidate();
mess1=br.readLine();
System.out.println("mess1:"+mess1);
System.out.println("****************************************");
}*/


while(mess1.equals("1")) {//私聊
System.out.println("*********收到信息**************\n");
String mess2=br.readLine();//用户号
System.out.println("发信息的用户号为"+mess2);
String mess3=br.readLine();//信息
System.out.println("私信为"+mess3);
area.append("客户"+mess2+"对您私聊说: ");
area.append(mess3+"\n");

mess1=br.readLine();//刷新mess1
System.out.println("mess1:"+mess1);
System.out.println("****************************************");
}

//群聊消息
while((mess1.equals("2"))) {
String mess2=br.readLine();
if(mess2.equals("4")) {
//this.use.revalidate();
//use.repaint();
String WhoisOnline[]=SQL.WhoisOnline();
list1.setListData(WhoisOnline);
String WhoisNotOnline[]=SQL.WHoisnotOnline();
list2.setListData(WhoisNotOnline);
System.out.println("2中收到四号消息");
mess1=br.readLine();
}else {
area2.append(mess2+"\n");
mess1=br.readLine();
System.out.println("mess1:"+mess1);
System.out.println("****************************************");
}
}

while((mess1.equals("3"))) {//终止
br.close();
bw.close();
in.close();
out.close();
this.socket.close();
mess1="";
this.runnning=false;
SqlServer.DeleteUser(this.userinfor.get_name());
}

if(!this.runnning) {
break;
}
}

}catch(Exception e) {
e.printStackTrace();
}
}



}


}

自定义一个ChatList类,用于管理在线聊天的与服务器相连的线程对象,在这个类中实现了向所有的在线Client发送消息的函数功能,也实现了删除在线ThreadForChat对象,在线的ThreadForChat是一个与Server服务器相关联的类,每当有一个Client与Server相连接,Server就创造一个ThreadForChat对象与之相连实现通信,在Server类中的强制删除功能既是删除对应的ThreadForChat类并向对应的Client对象发出下线的消息,实现强制下线。CLass BuildCheck是登录窗口,每当用户输入账号和验证密码并且检验正确时,就new一个Client对象。