JAVA网络聊天室.docx
《JAVA网络聊天室.docx》由会员分享,可在线阅读,更多相关《JAVA网络聊天室.docx(26页珍藏版)》请在冰点文库上搜索。
![JAVA网络聊天室.docx](https://file1.bingdoc.com/fileroot1/2023-5/21/341bb453-80d1-4e0d-a7cd-b4fe2916d1e2/341bb453-80d1-4e0d-a7cd-b4fe2916d1e21.gif)
JAVA网络聊天室
JAVA聊天室系统
JAVA聊天室由客户端和服务器端组成。
先启动服务器端程序,再启动客户端程序,服务器验证身份后便可登陆聊天室。
客户聊天时可选择聊天对象私聊,也可以跟所有在线用户聊天。
1、总体设计
2、界面设计:
聊天室界面大小为600*450;登陆对话框界面大小为250*200;
布局:
主要体现在客户端。
进入聊天室主界面之前有一个登陆对话框。
其中包括服务器ip,用户名和密码的填写。
聊天室的主界面主要分为两个大容器,中间是textViewTalk文本区域,显示聊天信息。
底下包括发送按钮,聊天信息输入框,在线人员组合框以及一些标签。
3、软件结构:
服务器端ChatServer包括主类ChatServer和ServerThread类
两个程序。
ServerThread为用户线程,每次有新用户加入就建立新的线程来处理该用户的消息,并将其加入在线用户列表。
ChatServer为主类,包括初始化变量,并建立套接字监听客户端链接请求。
如果接受的有效的客户端请求则创建新的线程来处理该用户的任务。
按照用户请求类型处理不同的任务:
1)如果是注册用户,则将用户名与已经注册的用户比较,如果找到该用户名则返回用户已经注册错误并在客户端显示错误类型,否则创建新用户并加入到用户信息文件中。
2)如果是登录用户则验证用户名和密码是否正确并给出相应提示。
3)如果是用户发送的消息也分为两类:
第一,如果用户选择对所有人说,则服务器端程序将消息发送到所有在线用户端。
第二,如果用户选择对某个人说话,则服务器段先查找该用户是否在线,如果在线则发送到该用户端。
4)将消息写入文件保存
客户端:
客户端软件包括两部分:
第一是登录界面,用户输入服务器IP,用户名和密码即可登录聊天系统,如果是第一次使用还可以注册用户。
第二部分是聊天信息板,如果用户登陆成功则显示改面板。
客户端软件主要是将用户消息打包发送到服务器段,由服务器端进行分析并做出相应的响应。
发送给服务器端的消息格式为:
消息类型前导字|发送者|接受者|消息
其中消息类型前导字主要用户服务器段判断消息类型,主要有一下几种消息类型:
login(登录)、reg(注册)、init(刷新所有用户在线列表)、talk(发言,其中又包括对所有人发言以及对某个人发言)。
4、源代码
/**********************************源代码*************************************/
服务器端
类名称:
ChatServer
程序简介:
创建套接字并监听客户端连接请求
**************************************/
importjava.io.*;
import.*;
importjava.text.SimpleDateFormat;
importjava.util.*;
publicclassChatServer{
ServerSocketserverSocket;//创建服务器端套接字
publicChatServer(){
try{
serverSocket=newServerSocket(8888);
System.out.println("启动服务...");
System.out.println("服务端口:
"+"8888");
getIP();//得到并显示服务器端IP
while(true){
Socketsocket=serverSocket.accept();//监听客户端连接请求
newServerThread(socket);//启动线程处理与客户的通讯
}
}catch(IOExceptione){
System.out.println("[错误]启动服务失败!
"+e);
}
}
//得到服务器IP地址并显示
publicvoidgetIP(){
try{
InetAddresslocalAddress=InetAddress.getLocalHost();
byte[]ipAddress=localAddress.getAddress();
System.out.println("服务器IP:
"+(ipAddress[0]&0xff)+"."
+(ipAddress[1]&0xff)+"."+(ipAddress[2]&0xff)+"."
+(ipAddress[3]&0xff));
}catch(Exceptione){
System.out.println("[错误]获取IP失败."+e);
}
}
//实例化类对象
publicstaticvoidmain(Stringargs[]){
newChatServer();
}
}
/*********************************************************/
服务器端
类名称:
ServerThread
功能:
建立新线程处理客户端请求
*********************************************************/
importjava.io.BufferedReader;
importjava.io.BufferedWriter;
importjava.io.DataInputStream;
importjava.io.FileInputStream;
importjava.io.FileNotFoundException;
importjava.io.IOException;
importjava.io.InputStreamReader;
importjava.io.OutputStreamWriter;
importjava.io.PrintWriter;
importjava.io.RandomAccessFile;
import.Socket;
importjava.text.SimpleDateFormat;
importjava.util.Date;
importjava.util.StringTokenizer;
importjava.util.Vector;
classServerThreadextendsThread{
privateSocketsocket;//定义客户端套接字
privateBufferedReaderin;//定义输入流
privatePrintWriterout;//定义输出流
privatestaticVectoronlineUser=newVector(10,5);
privatestaticVectorsocketUser=newVector(10,5);
privateStringstrReceive,strKey;
privateStringTokenizerst;
privatefinalStringUSERLIST_FILE="user.txt";//设定存放用户信息的文件
privatefinalStringUSERINFO_FILE="info.txt";
publicServerThread(Socketclient)throwsIOException{
socket=client;
in=newBufferedReader(newInputStreamReader(socket.getInputStream()));//客户端接收
out=newPrintWriter(newBufferedWriter(newOutputStreamWriter(socket.getOutputStream())),true);//客户端输出
this.start();
}
publicvoidrun(){
try{
while(true){
strReceive=in.readLine();//从服务器端接收一条信息后拆分、解析,并执行相应操作
st=newStringTokenizer(strReceive,"|");
strKey=st.nextToken();
if(strKey.equals("login")){
login();
}elseif(strKey.equals("talk")){
talk();
}elseif(strKey.equals("init")){
initClientOnline();
}elseif(strKey.equals("reg")){
register();
}
}
}catch(IOExceptione){//用户关闭客户端造成此异常,关闭该用户套接字。
StringleaveUser=closeSocket();
System.out.println("[系统]"+leaveUser+"离开聊天室!
");
sendAll("talk|"+leaveUser+"离开了聊天室。
");
}
}
//判断是否有该注册用户
@SuppressWarnings("deprecation")
privatebooleanisExistUser(Stringname){
StringstrRead;
try{
FileInputStreaminputfile=newFileInputStream(USERLIST_FILE);//createinputstream
DataInputStreaminputdata=newDataInputStream(inputfile);
while((strRead=inputdata.readLine())!
=null){
StringTokenizerstUser=newStringTokenizer(strRead,"|");
if(stUser.nextToken().equals(name)){
returntrue;
}
}
}catch(FileNotFoundExceptionfn){
System.out.println("[错误]信息文件不存在!
"+fn);
out.println("warning|读写文件时出错!
");
}catch(IOExceptionie){
System.out.println("[错误]"+ie);
out.println("warning|读写文件时出错!
");
}
returnfalse;
}
//判断用户的用户名密码是否正确
@SuppressWarnings("deprecation")
privatebooleanisUserLogin(Stringname,Stringpassword){
StringstrRead;
try{
FileInputStreaminputfile=newFileInputStream(USERLIST_FILE);
//createinputstream
DataInputStreaminputdata=newDataInputStream(inputfile);
while((strRead=inputdata.readLine())!
=null){
if(strRead.equals(name+"|"+password)){
returntrue;
}
}
}catch(FileNotFoundExceptionfn){
System.out.println("[错误]文件不存在!
"+fn);
out.println("warning|读写文件时出错!
");
}catch(IOExceptionie){
System.out.println("[错误]"+ie);
out.println("warning|读写文件时出错!
");
}
returnfalse;
}
//用户注册
privatevoidregister()throwsIOException{
Stringname=st.nextToken();//得到用户名称
Stringpassword=st.nextToken().trim();//得到用户密码
if(isExistUser(name)){
System.out.println("[错误]"+name+"注册失败!
");
out.println("warning|该用户已存在,请改名!
");
}else{
RandomAccessFileuserFile=newRandomAccessFile(USERLIST_FILE,"rw");
userFile.seek(userFile.length());//在文件尾部加入新用户信息
userFile.writeBytes(name+"|"+password+"\r\n");
out.println("warning|注册成功,请重新登录!
");//返回注册成功
}
}
//用户登陆(从登陆框直接登陆)
privatevoidlogin()throwsIOException{
Stringname=st.nextToken();//得到用户名称
Stringpassword=st.nextToken().trim();//得到用户密码
booleansucceed=false;
System.out.println("[用户登录]"+name+":
"+password+":
"
+socket);
for(inti=0;iif(onlineUser.elementAt(i).equals(name)){
System.out.println("[错误]"+name+"islogined!
");
out.println("warning|"+name+"已经登陆聊天室");
}
}
if(isUserLogin(name,password)){//判断用户名和密码
longin(name);
succeed=true;
}
if(!
succeed){
out.println("warning|登陆失败,请检查您的帐号密码是否正确!
");
System.out.println("[系统信息]"+name+"登录失败!
");
}
}
//用户登陆
privatevoidlongin(Stringname)throwsIOException{
out.println("login|succeed");
sendAll("online|"+name);
onlineUser.addElement(name);//添加在线用户列表
socketUser.addElement(socket);//保存新的
sendAll("talk|欢迎"+name+"进入聊天室!
");
System.out.println("[系统信息]"+name+"登陆成功!
");
}
//保存聊天记录
privatebooleansaveInfo(Stringinfo){
try{
RandomAccessFileuserFile=newRandomAccessFile(USERINFO_FILE,
"rw");
userFile.seek(userFile.length());//在文件尾部加入新信息
userFile.writeUTF((info+"\r\n"));
returntrue;
}catch(FileNotFoundExceptionfn){
System.out.println("[错误]文件不存在!
"+fn);
out.println("warning|读写文件时出错!
");
}catch(IOExceptionie){
System.out.println("[错误]"+ie);
out.println("warning|读写文件时出错!
");
}
returnfalse;
}
//聊天信息处理
privatevoidtalk()throwsIOException{
StringstrTalkInfo=st.nextToken();//获得聊天内容;
StringstrSender=st.nextToken();//获得发消息人
StringstrReceiver=st.nextToken();//获得接收人
System.out.println("[发言:
"+strReceiver+"]"+strTalkInfo);
SocketsocketSend;
PrintWriteroutSend;
//获取当前时间
DatecurrentTime=newDate();
SimpleDateFormatformatter=newSimpleDateFormat("yyyy-MM-ddHH:
mm:
ss");
StringdateString="("+formatter.format(currentTime)+")";
strTalkInfo+=""+dateString;
if(strReceiver.equals("All")){
sendAll("talk|"+strSender+"对所有人说:
"+strTalkInfo);
saveInfo(strSender+"===>all:
"+strTalkInfo);//保存聊天信息
}else{
if(strSender.equals(strReceiver)){
out.println("talk|不能对自己说话!
");
}else{
saveInfo(strSender+"===>"+strReceiver+":
"+strTalkInfo);//保存聊天信息
for(inti=0;iif(strReceiver.equals(onlineUser.elementAt(i))){
socketSend=(Socket)socketUser.elementAt(i);
outSend=newPrintWriter(newBufferedWriter(
newOutputStreamWriter(socketSend
.getOutputStream())),true);
outSend.println("talk|"+strSender+"对你说:
"
+strTalkInfo);
}elseif(strSender.equals(onlineUser.elementAt(i))){
socketSend=(Socket)socketUser.elementAt(i);
outSend=newPrintWriter(newBufferedWriter(
newOutputStreamWriter(socketSend
.getOutputStream())),true);
outSend.println("talk|你对"+strReceiver+"说:
"
+strTalkInfo);
}
}
}
}
}
//刷新在线用户列表
privatevoidinitClientOnline()throwsIOException{
StringstrOnline="online";
for(inti=0;istrOnline+="|"+onlineUser.elementAt(i);
}
out.println(strOnline);
}
//信息群发
privateboolsendAll(StringstrSend){
SocketsocketSend;
PrintWriteroutSend;
try{
for(inti=0;isocketSend=(Socket)socketUser.elementAt(i);
outSend=newPrintWriter(newBufferedWriter(newOutputStreamWriter(socketSend.getOutputStream())),true);
outSend.println(strSend);
returntrue;
}
}catch(IOExceptione){
System.out.println("错误]发送失败!