JAVA小型聊天室.docx
《JAVA小型聊天室.docx》由会员分享,可在线阅读,更多相关《JAVA小型聊天室.docx(37页珍藏版)》请在冰豆网上搜索。
JAVA小型聊天室
JAVA小型聊天室
下载必读:
1、要在工程里新建config.properties以及login.properties的配置文件serverhost和serverport分别为服务器所在计算机的IP和端口:
config.properties:
serverhost=loaclhost
serverport=8088
login.properties:
serverhost=loaclhost
serverport=8089
2、先启动聊天室消息服务器ChatServer和登录服务器LoginServer
3、然后启动登录客户端Login
4、先注册,注册后要重启登录服务器,然后再登录才不会出错(小bug不想修改了,可自行修改)
5、聊天室目前实行了登录界面和聊天界面,可自行开发注册界面等
6、聊天室目前只实现了公聊、私聊、好友列表刷新、上下线提醒等功能。
可自行添加其他功能
7、用户信息目前只开发了昵称和密码两个属性,可自行开发其他属性
源代码:
1、聊天室消息服务器ChatServer:
importjava.io.BufferedReader;
importjava.io.InputStreamReader;
importjava.io.OutputStreamWriter;
importjava.io.PrintWriter;
import.InetAddress;
import.ServerSocket;
import.Socket;
importjava.util.HashMap;
importjava.util.Map;
importjava.util.Set;
importjava.util.concurrent.ExecutorService;
importjava.util.concurrent.Executors;
/**
*聊天室消息接收发送服务器
*@authorAmong
*
*/
publicclassChatServer{
privateServerSocketserver;
privateMapPW;//存储每个线程的输出流
privateMapuser;//存储每个用户信息
privateExecutorServicethreadPool;//线程池
privatestaticfinalStringpersonalChat="11110001";//私聊标识
privatestaticfinalStringpublicChat="11110010";//公聊标识
privatestaticfinalStringOnline="11110011";//上线标识
privatestaticfinalStringSigningOff="11110100";//下线标识
privatestaticfinalStringfriendSign="11110101";//好友列表请求标识
/**
*构造方法
*初始化
*/
publicChatServer(){
try{
server=newServerSocket(8088);//打开新的服务端接口
PW=newHashMap();
user=newHashMap();
threadPool=Executors.newFixedThreadPool(50);
}catch(Exceptione){
e.printStackTrace();
}
}
/**
*添加输出流方法,并添加同步互斥锁
*@paramname
*@parampw
*/
privatesynchronizedvoidaddPw(Stringname,PrintWriterpw){
PW.put(name,pw);
}
/**
*删除输出流方法,添加同步互斥锁
*@paramname
*@parampw
*/
privatesynchronizedvoidremovePw(Stringname,PrintWriterpw){
PW.remove(name,pw);
}
/**
*遍历输出流,群发消息
*添加同步互斥锁
*@parammsg
*/
privatesynchronizedvoidsendMsgtoAll(Stringmsg){
Setnames=PW.keySet();
for(Stringname:
names){
PW.get(name).println(msg);
}
}
/**
*服务器启动方法
*打开接收器,并把连接进来的socket交给线程开始聊天
*/
publicvoidstart(){
try{
while(true){
System.out.println("等到客户端连接...");
Socketsocket=server.accept();
System.out.println("一个客户端连接了!
");
//启动一个线程来处理新连接
ClientHandlerhandler=newClientHandler(socket);
threadPool.execute(handler);
}
}catch(Exceptione){
}
}
/**
*线程
*用于和每个连接进来的socket交互
*/
classClientHandlerimplementsRunnable{
privateSocketsocket;
privateStringhost;
privateintport;
privatePrintWriterpw=null;
privateStringname;
privateBufferedReaderbr;
privateStringName;
/**
*构造方法
*获取连接进来的socket信息
*@paramsocket
*/
publicClientHandler(Socketsocket){
InetAddressaddress=socket.getInetAddress();
host=address.getHostAddress();
port=socket.getPort();
System.out.println(host+port+"上线了。
当前在线人数:
"+(PW.size()+1));
this.socket=socket;
}
/**
*线程run方法
*获取socket输入输出流
*1、读取用户名称
*2、判断消息标识符
*3、接收并处理消息
*4、发送消息标识符
*5、发送消息
*/
publicvoidrun(){
try{
pw=newPrintWriter(newOutputStreamWriter(socket.getOutputStream()),true);
br=newBufferedReader(
newInputStreamReader(socket.getInputStream()));
name=br.readLine();
user.put(name,name);
addPw(name,pw);
Stringmessage=null;
//sendMsgtoAll(name+"上线了。
当前在线人数:
"+PW.size());
while((message=br.readLine())!
=null){
if(Online.equals(message)){
sendMsgtoAll(Online);
sendMsgtoAll(name);
}elseif(publicChat.equals(message)){
message=br.readLine();
sendMsgtoAll(publicChat);
sendMsgtoAll(name+"说:
"+message);
System.out.println(name+message);
}elseif(SigningOff.equals(message)){
//message=br.readLine();
//System.out.println(name+message);
sendMsgtoAll(SigningOff);
sendMsgtoAll(name+"下线了。
当前在线人数:
"+(PW.size()-1));
System.out.println(name+"下线了。
当前在线人数:
"+(PW.size()-1));
user.remove(name);//删除下线用户
removePw(name,pw);//删除下线用户的输出流
socket.close();
}elseif(personalChat.equals(message)){
message=br.readLine();
String[]msg=message.split(":
");
PW.get(msg[0]).println(personalChat);
PW.get(msg[0]).println(name+"悄悄对你说:
"+msg[1]);
PW.get(name).println(personalChat);
PW.get(name).println("你悄悄对"+msg[0]+"说:
"+msg[1]);
}elseif(friendSign.equals(message)){
Stringmsgs="";
Setnames=user.keySet();
for(Stringn:
names){
Name=user.get(n);
msgs+=Name+":
";
}
System.out.println(msgs);
sendMsgtoAll(friendSign);
sendMsgtoAll(msgs);
}
}
}catch(Exceptione){
//e.printStackTrace();
}
}
}
/**main方法*/
publicstaticvoidmain(String[]args){
ChatServerserver=newChatServer();
server.start();
}
}
2、聊天室登录服务器LoginServer:
importjava.io.BufferedReader;
importjava.io.InputStreamReader;
importjava.io.OutputStreamWriter;
importjava.io.PrintWriter;
import.ServerSocket;
import.Socket;
importjava.util.ArrayList;
importjava.util.HashMap;
importjava.util.Iterator;
importjava.util.List;
importjava.util.Map;
importjava.util.concurrent.ExecutorService;
importjava.util.concurrent.Executors;
/**
*聊天室登录服务器
*接收和发送登录注册信息
*@authorAmong
*@version1.0
*/
publicclassLoginServer{
privatestaticfinalStringcheckLogin="11110110";//检查登录信息标识
privatestaticfinalStringCorrect="11111111";//信息正确标识
privatestaticfinalStringWrong="00000000";//信息错误标识
privatestaticfinalStringRegist="11110111";//注册标识
privateServerSocketserver;
privateExecutorServicethreadPool;
privateListuser=newArrayList();
privateMaplogin;
privateSavesave=newSave();
privateIteratorit;
privateUseruser0=null;
/**
*构造方法
*打开监听接口
*初始化
*/
publicLoginServer(){
try{
server=newServerSocket(8089);
threadPool=Executors.newFixedThreadPool(50);
user=save.ReadData();
it=user.iterator();
login=newHashMap();
while(it.hasNext()){
user0=it.next();
if(user0==null){
continue;
}
login.put(user0.getName(),user0.getPassword());
}
}catch(Exceptione){
e.printStackTrace();
}
}
/**
*登录服务器启动方法
*接收socket连接
*建立线程处理信息
*/
publicvoidstart(){
try{
while(true){
System.out.println("等待一个登陆客户端...");
Socketsocket=server.accept();
System.out.println("登陆客户端已连接!
");
threadPool.execute(newLoginHandler(socket));
}
}catch(Exceptione){
e.printStackTrace();
}
}
/**
*交互信息处理线程
*1、获取输入输出流
*2、判断消息标识
*3、接收消息
*4、处理消息
*5、发送消息标识
*6、发送处理结果
*/
classLoginHandlerimplementsRunnable{
privateSocketsocket;
publicBufferedReaderbr;
publicPrintWriterpw;
publicString[]logins;
publicUserusers;
publicLoginHandler(Socketsocket){
this.socket=socket;
}
@Override
/**
*线程run方法
*/
publicvoidrun(){
try{
br=newBufferedReader(newInputStreamReader(socket.getInputStream(),"utf-8"));
pw=newPrintWriter(newOutputStreamWriter(socket.getOutputStream(),"utf-8"),true);
Stringmessage=null;
while((message=br.readLine())!
=null){
System.out.println(message);
if(checkLogin.equals(message)){
message=br.readLine();
System.out.println(message);
logins=message.split(":
");
System.out.println(logins[0]+","+logins[1]);
System.out.println(user.toString());
System.out.println();
if(logins[1].equals(login.get(logins[0]))){
pw.println(Correct);
}else{
pw.println(Wrong);
}
}elseif(Regist.equals(message)){
message=br.readLine();
System.out.println(message);
logins=message.split(":
");
System.out.println(logins[0]+","+logins[1]);
System.out.println(user.toString());
if(login.containsKey(logins[0])){
pw.println(Wrong);
}else{
pw.println(Correct);
user.add(newUser(logins[0],logins[1]));
save.SaveData(user);
}
}
}
}catch(Exceptione){
//TODO:
handleexception
}
}
}
/**
*main方法
*@paramargs
*/
publicstaticvoidmain(String[]args){
LoginServerserver=newLoginServer();
server.start();
}
}
3、聊天室登录界面Login:
importjava.awt.GridLayout;
importjava.awt.event.ActionEvent;
importjava.awt.event.ActionListener;
importjava.io.BufferedReader;
importjava.io.FileInputStream;
importjava.io.InputStreamReader;
importjava.io.OutputStreamWriter;
importjava.io.PrintWriter;
import.Socket;
importjava.util.Properties;
importjavax.swing.JButton;
importjavax.swing.JFrame;
importjavax.swing.JLabel;
importjavax.swing.JOptionPane;
importjavax.swing.JPanel;
importjavax.swing.JTextField;
importjavax.swing.border.TitledBorder;
/**
*聊天室登录界面
*客户端启动处
*@authorAmong
*@version1.0
*/
publicclassLoginimplementsActionListener{
privatestaticfinalStringcheckLogin="11110110";//检查登录信息标识
privatestaticfinalStringCorrect="11111111";//信息正确标识
privatestaticfinalStringRegist="11110111";//注册标识
privatestaticSocketsocket;
privatestaticPrintWriterpw;
privatestaticBufferedReaderbr;
privateJFrameframe=newJFrame("登录");
privateJPaneljp1=newJPanel();
privateJPaneljp2=newJPanel();
privateJPaneljp3=newJPanel();
privateJPaneljp4=newJPanel();
privateJLabeljl1=newJLabel("账号:
");
privateJLabeljl2=newJLabel("密码:
");
privateJTextFieldjtf1=newJTextField(15);
privateJTextFieldjtf2=newJTextField(15);
privateJButtonjb1=newJButton("登录");
privateJButto