JAVA网络聊天室.docx

上传人:b****8 文档编号:9849079 上传时间:2023-05-21 格式:DOCX 页数:26 大小:79.21KB
下载 相关 举报
JAVA网络聊天室.docx_第1页
第1页 / 共26页
JAVA网络聊天室.docx_第2页
第2页 / 共26页
JAVA网络聊天室.docx_第3页
第3页 / 共26页
JAVA网络聊天室.docx_第4页
第4页 / 共26页
JAVA网络聊天室.docx_第5页
第5页 / 共26页
JAVA网络聊天室.docx_第6页
第6页 / 共26页
JAVA网络聊天室.docx_第7页
第7页 / 共26页
JAVA网络聊天室.docx_第8页
第8页 / 共26页
JAVA网络聊天室.docx_第9页
第9页 / 共26页
JAVA网络聊天室.docx_第10页
第10页 / 共26页
JAVA网络聊天室.docx_第11页
第11页 / 共26页
JAVA网络聊天室.docx_第12页
第12页 / 共26页
JAVA网络聊天室.docx_第13页
第13页 / 共26页
JAVA网络聊天室.docx_第14页
第14页 / 共26页
JAVA网络聊天室.docx_第15页
第15页 / 共26页
JAVA网络聊天室.docx_第16页
第16页 / 共26页
JAVA网络聊天室.docx_第17页
第17页 / 共26页
JAVA网络聊天室.docx_第18页
第18页 / 共26页
JAVA网络聊天室.docx_第19页
第19页 / 共26页
JAVA网络聊天室.docx_第20页
第20页 / 共26页
亲,该文档总共26页,到这儿已超出免费预览范围,如果喜欢就下载吧!
下载资源
资源描述

JAVA网络聊天室.docx

《JAVA网络聊天室.docx》由会员分享,可在线阅读,更多相关《JAVA网络聊天室.docx(26页珍藏版)》请在冰点文库上搜索。

JAVA网络聊天室.docx

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;i

if(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;i

if(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;i

strOnline+="|"+onlineUser.elementAt(i);

}

out.println(strOnline);

}

//信息群发

privateboolsendAll(StringstrSend){

SocketsocketSend;

PrintWriteroutSend;

try{

for(inti=0;i

socketSend=(Socket)socketUser.elementAt(i);

outSend=newPrintWriter(newBufferedWriter(newOutputStreamWriter(socketSend.getOutputStream())),true);

outSend.println(strSend);

returntrue;

}

}catch(IOExceptione){

System.out.println("错误]发送失败!

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 初中教育 > 语文

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2