1、JAVA网络聊天室JAVA聊天室系统JAVA聊天室由客户端和服务器端组成。先启动服务器端程序,再启动客户端程序,服务器验证身份后便可登陆聊天室。客户聊天时可选择聊天对象私聊,也可以跟所有在线用户聊天。1、 总体设计2、 界面设计:聊天室界面大小为600*450;登陆对话框界面大小为250*200;布局:主要体现在客户端。进入聊天室主界面之前有一个登陆对话框。其中包括服务器ip,用户名和密码的填写。聊天室的主界面主要分为两个大容器,中间是textViewTalk文本区域,显示聊天信息。底下包括发送按钮,聊天信息输入框,在线人员组合框以及一些标签。 3、 软件结构:服务器端ChatServer 包
2、括主类ChatServer和 ServerThread类两个程序。ServerThread为用户线程,每次有新用户加入就建立新的线程来处理该用户的消息,并将其加入在线用户列表。ChatServer为主类,包括初始化变量,并建立套接字监听客户端链接请求。如果接受的有效的客户端请求则创建新的线程来处理该用户的任务。按照用户请求类型处理不同的任务:1)如果是注册用户,则将用户名与已经注册的用户比较,如果找到该用户名则返回用户已经注册错误并在客户端显示错误类型,否则创建新用户并加入到用户信息文件中。 2)如果是登录用户则验证用户名和密码是否正确并给出相应提示。 3)如果是用户发送的消息也分为两类:第一
3、,如果用户选择对所有人说,则服务器端程序将消息发送到所有在线用户端。第二,如果用户选择对某个人说话,则服务器段先查找该用户是否在线,如果在线则发送到该用户端。 4)将消息写入文件保存 客户端: 客户端软件包括两部分:第一是登录界面,用户输入服务器IP,用户名和密码即可登录聊天系统,如果是第一次使用还可以注册用户。第二部分是聊天信息板,如果用户登陆成功则显示改面板。客户端软件主要是将用户消息打包发送到服务器段,由服务器端进行分析并做出相应的响应。发送给服务器端的消息格式为:消息类型前导字|发送者|接受者|消息其中消息类型前导字主要用户服务器段判断消息类型,主要有一下几种消息类型:login(登录
4、)、reg(注册)、init(刷新所有用户在线列表)、talk(发言,其中又包括对所有人发言以及对某个人发言)。 4、 源代码/*源代码*/服务器端类 名 称:ChatServer程序简介:创建套接字并监听客户端连接请求 */import java.io.*;import .*;import java.text.SimpleDateFormat;import java.util.*;public class ChatServer ServerSocket serverSocket; / 创建服务器端套接字 public ChatServer() try serverSocket = new S
5、erverSocket(8888); System.out.println(启动服务.); System.out.println(服务端口: + 8888); getIP(); / 得到并显示服务器端IP while (true) Socket socket = serverSocket.accept(); / 监听客户端连接请求 new ServerThread(socket); / 启动线程处理与客户的通讯 catch (IOException e) System.out.println(错误 启动服务失败! + e); / 得到服务器IP地址并显示 public void getIP()
6、 try InetAddress localAddress = InetAddress.getLocalHost(); byte ipAddress = localAddress.getAddress(); System.out.println(服务器IP: + (ipAddress0 & 0xff) + . + (ipAddress1 & 0xff) + . + (ipAddress2 & 0xff) + . + (ipAddress3 & 0xff); catch (Exception e) System.out.println(错误 获取IP失败. + e); / 实例化类对象 publ
7、ic static void main(String args) new ChatServer(); /*/服务器端类 名 称:ServerThread功能:建立新线程处理客户端请求*/import java.io.BufferedReader;import java.io.BufferedWriter;import java.io.DataInputStream;import java.io.FileInputStream;import java.io.FileNotFoundException;import java.io.IOException;import java.io.InputS
8、treamReader;import java.io.OutputStreamWriter;import java.io.PrintWriter;import java.io.RandomAccessFile;import .Socket;import java.text.SimpleDateFormat;import java.util.Date;import java.util.StringTokenizer;import java.util.Vector;class ServerThread extends Thread private Socket socket;/ 定义客户端套接字
9、private BufferedReader in;/ 定义输入流 private PrintWriter out;/ 定义输出流 private static Vector onlineUser = new Vector(10, 5); private static Vector socketUser = new Vector(10, 5); private String strReceive, strKey; private StringTokenizer st; private final String USERLIST_FILE = user.txt; / 设定存放用户信息的文件 pr
10、ivate final String USERINFO_FILE = info.txt; public ServerThread(Socket client) throws IOException socket = client; in = new BufferedReader(new InputStreamReader(socket.getInputStream(); / 客户端接收out = new PrintWriter(new BufferedWriter(new OutputStreamWriter(socket.getOutputStream(), true);/ 客户端输出 th
11、is.start(); public void run() try while (true) strReceive = in.readLine();/ 从服务器端接收一条信息后拆分、解析,并执行相应操作 st = new StringTokenizer(strReceive, |); strKey = st.nextToken(); if (strKey.equals(login) login(); else if (strKey.equals(talk) talk(); else if (strKey.equals(init) initClientOnline(); else if (str
12、Key.equals(reg) register(); catch (IOException e) / 用户关闭客户端造成此异常,关闭该用户套接字。 String leaveUser = closeSocket(); System.out.println(系统 + leaveUser + 离开聊天室!); sendAll(talk| + leaveUser + 离开了聊天室。); / 判断是否有该注册用户 SuppressWarnings(deprecation) private boolean isExistUser(String name) String strRead; try File
13、InputStream inputfile = new FileInputStream(USERLIST_FILE); / create input stream DataInputStream inputdata = new DataInputStream(inputfile); while (strRead = inputdata.readLine() != null) StringTokenizer stUser = new StringTokenizer(strRead, |); if (stUser.nextToken().equals(name) return true; catc
14、h (FileNotFoundException fn) System.out.println(错误 信息文件不存在! + fn); out.println(warning|读写文件时出错!); catch (IOException ie) System.out.println(错误 + ie); out.println(warning|读写文件时出错!); return false; / 判断用户的用户名密码是否正确 SuppressWarnings(deprecation) private boolean isUserLogin(String name, String password)
15、String strRead; try FileInputStream inputfile = new FileInputStream(USERLIST_FILE); / create input stream DataInputStream inputdata = new DataInputStream(inputfile); while (strRead = inputdata.readLine() != null) if (strRead.equals(name + | + password) return true; catch (FileNotFoundException fn) S
16、ystem.out.println(错误 文件不存在! + fn); out.println(warning|读写文件时出错!); catch (IOException ie) System.out.println(错误 + ie); out.println(warning|读写文件时出错!); return false; / 用户注册 private void register() throws IOException String name = st.nextToken(); / 得到用户名称 String password = st.nextToken().trim();/ 得到用户密码
17、 if (isExistUser(name) System.out.println(错误 + name + 注册失败!); out.println(warning|该用户已存在,请改名!); else RandomAccessFile userFile = new RandomAccessFile(USERLIST_FILE,rw); userFile.seek(userFile.length(); / 在文件尾部加入新用户信息 userFile.writeBytes(name + | + password + rn); out.println(warning|注册成功,请重新登录!); /
18、返回注册成功 / 用户登陆(从登陆框直接登陆) private void login() throws IOException String name = st.nextToken(); / 得到用户名称 String password = st.nextToken().trim();/ 得到用户密码 boolean succeed = false; System.out.println(用户登录 + name + : + password + : + socket); for (int i = 0; i all: + strTalkInfo);/保存聊天信息 else if (strSend
19、er.equals(strReceiver) out.println(talk|不能对自己说话!); else saveInfo(strSender + = + strReceiver + : + strTalkInfo);/保存聊天信息 for (int i = 0; i onlineUser.size(); i+) if (strReceiver.equals(onlineUser.elementAt(i) socketSend = (Socket) socketUser.elementAt(i); outSend = new PrintWriter(new BufferedWriter(
20、 new OutputStreamWriter(socketSend .getOutputStream(), true); outSend.println(talk| + strSender + 对你说: + strTalkInfo); else if (strSender.equals(onlineUser.elementAt(i) socketSend = (Socket) socketUser.elementAt(i); outSend = new PrintWriter(new BufferedWriter( new OutputStreamWriter(socketSend .get
21、OutputStream(), true); outSend.println(talk|你对 + strReceiver + 说: + strTalkInfo); / 刷新在线用户列表 private void initClientOnline() throws IOException String strOnline = online; for (int i = 0; i onlineUser.size(); i+) strOnline += | + onlineUser.elementAt(i); out.println(strOnline); / 信息群发 private bool se
22、ndAll(String strSend) Socket socketSend; PrintWriter outSend; try for (int i = 0; i socketUser.size(); i+) socketSend = (Socket) socketUser.elementAt(i); outSend = new PrintWriter(new BufferedWriter(new OutputStreamWriter(socketSend.getOutputStream(),true); outSend.println(strSend); return true; catch (IOException e) System.out.println(错误发送失败!
copyright@ 2008-2023 冰点文库 网站版权所有
经营许可证编号:鄂ICP备19020893号-2