Java聊天室系统程序设计实验报告 - 图文

更新时间:2023-03-08 06:13:59 阅读量: 综合文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

Java聊天室系统程序设计

实验报告

题 目:****** 院 (系):****** 年级专业:****** 学生姓名:****** 指导老师:****** 开始时间:****** 完成时间:******

第一部分:课程设计总述

课程设计目的:

1.学会Java程序开发的环境搭建与配置,并在实际运用中学习和掌握Java

程序开发的全过程。

2.进一步熟悉掌握Java程序设计语言的基础内容,如用户图形界面设计、Java多线程编程、Applet程序的设计、文件和网络输入输出流编程、Java数据库编程等。

3.通过亲自动手写程序,一方面拓展知识面,一方面锻炼调试能力。

课程设计总体要求:

1.问题的描述与程序将要实现的具体功能。

2.程序功能实现的具体设计思路或框架,并检查流程设计。 3.代码实现。

4.程序测试(如程序代码、功能测试、可靠性测试和效率测试等)。 5.设计小结(包括) 课程设计题目: 目标

本软件是一个实用聊天程序。项目要实现以下目标: 1)允许用户注册;

2)允许注册用户登录聊天室; 3)登录用户之间进行聊天文件传输; 4)用户可以更改背景音乐; 用户信息的保存

本软件只是一个聊天室程序,所以用户只要打开程序就可以登录。本软件使用文本文件或者数据库来保存用户数据。

需求分析 对功能的规定

第 1 页 共 69 页 1

1.系统的用例图(对注册用户)

聊天退出登录文件传输察看用户列表已登录用户更改背景察看帮助更改背景音乐

2.用户注册过程

开始接受服务器ipd地址显示注册窗口接受用户名和密码等用户信息判断用户是否有效yesno显示聊天室主界面将用户信息写入服务器端的文件结束 2

第 2 页 共 69 页

3.用户登录过程

开始接受服务器ipd地址显示用户登录窗口接受用户名和密码判断用户是否有效yes显示聊天室主界面no结束

对性能的规定

由于本软件只是一个聊天室程序,程序只是提供用户之间的聊天和文件传输,

故对网络传输数据要求不是很高,只要正常的传输速度就可以了。 需要管理的数据

用户的信息如下:用户名,密码,头像,电子邮件,地址。 4 开发环境

本软件采用Java语言编写,Java语言是一种跨平台的编程语言,所以本软件

对操作系统没有特别的要求。而网络传输方面采用TCP/IP网络传输协议或者是RMI。

第 3 页 共 69 页

3

总体设计思路

系统主要包含两个java文件,Server.java和UserLogin.java

图形界面主要通过\\\\ org\\netbeans\\lib\\awtextra目录下的两个类: AbsoluteConstraints.class和AbsoluteLayout.class来控制。 启动系统通过依次点击批处理文件:1.bat,2.bat

Server.java中包含:

其中Server类又包括如下类和方法:

第 4 页 共 69 页

4

UserLogin.java包括:

第 5 页 共 69 页 5

其中UserLogin类又包括如下类和方法:

而UserLoginWindow类又包含如下事件和方法:

第 6 页 共 69 页 6

第 7 页 共 69 页 7

系统为C/S模式。首先根据功能模块将系统分为两部分:服务端(Server)和客户端(UserLogin)。然后构造可以序列化的User类,这是本系统的对象。根据需求功能细分类和方法。建立文件和网络的传输通信。实现聊天室的基本功能

具体设计 代码:

//server.java

import javax.swing.*; import java.awt.*;

import java.awt.event.*; import java.net.*; import java.io.*; import java.util.*;

//用户信息

8

第 8 页 共 69 页

class User implements Serializable {

String UserName; String UserPassword; String UserHeadPhoto; String UserEmail; String UserAge;

String SinkName; String FileName; byte FileData[];

String Message; String Command;

Vector vectorUserList; }

public class Server extends JFrame {

static Vector vectorStreamToUser=new Vector(1,1); static Vector vectorUserList=new Vector(1,1); private ServerSocket serverSocket;

private JMenuItem aboutMenuItem; private JMenu commandMenu; private JMenu fileMenu; private JMenu helpMenu;

private JMenuItem helpMenuItem;

private JLabel jLabel1; private JLabel jLabel2; private JLabel jLabel3; private JLabel jLabel4; private JLabel jLabel5;

private JList jList1;

private JPanel jPanel1;

private JScrollPane jScrollPane1;

private JMenuItem warnMenuItem; private JMenuItem kickMenuItem;

private JMenuBar menuBar;

private JMenuItem msgMenuItem; private JMenuItem startMenuItem; private JMenuItem stopMenuItem; //右键事件菜单

private static JPopupMenu menu;

private String BlackList;

第 9 页 共 69 页

9

//建立server框架 public Server() {

initComponents(); }

private void initComponents() {

jPanel1 = new JPanel(); jLabel2 = new JLabel(); jLabel3 = new JLabel(); jLabel4 = new JLabel(); jLabel5 = new JLabel();

jScrollPane1 = new JScrollPane();

jList1 = new JList(); jLabel1 = new JLabel();

menuBar = new JMenuBar();

fileMenu = new JMenu();

startMenuItem = new JMenuItem(); stopMenuItem = new JMenuItem();

commandMenu = new JMenu();

warnMenuItem = new JMenuItem(); kickMenuItem = new JMenuItem(); msgMenuItem = new JMenuItem();

helpMenu = new JMenu();

helpMenuItem = new JMenuItem(); aboutMenuItem = new JMenuItem();

getContentPane().setLayout(new

org.netbeans.lib.awtextra.AbsoluteLayout());

setTitle(\服务器端\

setResizable(false);//用户不能手动调整列宽度。

addWindowListener(new WindowAdapter() {

public void windowClosing(WindowEvent evt) { exitForm(evt); } });

jPanel1.setLayout(new org.netbeans.lib.awtextra.AbsoluteLayout()); try

第 10 页 共 69 页

10

{

//建立InetAddress对象

InetAddress intel=InetAddress.getLocalHost(); String SerName=intel.getHostName(); String SerIp=intel.getHostAddress();

jLabel2.setText(\服务器名:\显示服务器端主机名 jLabel3.setText(\服务器IP:\显示服务器端IP }

catch(UnknownHostException e2) {

System.out.println(\发生错误!\ }

jLabel2.setForeground(new Color(255,0,0)); jLabel2.setFont(new Font(\宋体\ jPanel1.add(jLabel2, new org.netbeans.lib.awtextra.AbsoluteConstraints(20, 10, -1, -1));

jLabel3.setForeground(new Color(255, 0, 0)); jLabel3.setFont(new Font(\宋体\ jPanel1.add(jLabel3, new org.netbeans.lib.awtextra.AbsoluteConstraints(20, 30, -1, -1));

jLabel4.setText(\服务器状态:未启动\

jLabel4.setForeground(new Color(255, 255, 0)); jLabel4.setFont(new Font(\宋体\ jPanel1.add(jLabel4, new org.netbeans.lib.awtextra.AbsoluteConstraints(20, 240, -1, -1));

jLabel5.setText(\共有:0个客户在线\

jLabel5.setForeground(new Color(255, 255, 51)); jLabel5.setFont(new Font(\宋体\ jPanel1.add(jLabel5, new org.netbeans.lib.awtextra.AbsoluteConstraints(250, 240, -1, -1));

menu = new JPopupMenu(); //右键事件菜单

JMenuItem Admonition= new JMenuItem(\警告\

Admonition.addActionListener(new ActionListener() {

public void actionPerformed(ActionEvent e) {

int state=JOptionPane.showOptionDialog(null,\确实要警告用户\吗?\确认\ if(state==JOptionPane.OK_OPTION) {

warnMenuItemActionPerformed(e); }

第 11 页 共 69 页

11

} });

JMenuItem Delete = new JMenuItem(\删除\ Delete.addActionListener(new ActionListener() {

public void actionPerformed(ActionEvent e) {

int state=JOptionPane.showOptionDialog(null,\确实要删除用户\吗?\确认\ if(state==JOptionPane.OK_OPTION) {

kickMenuItemActionPerformed(e); } } });

menu.add(Admonition); menu.add(Delete);

jList1.setModel(new AbstractListModel() { String[] strings = {};

public int getSize() { return strings.length; }

public Object getElementAt(int i) { return strings[i]; } });

jList1.setFont(new Font(\ jList1.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);

jList1.addMouseListener(new MouseAdapter() {

public void mousePressed(MouseEvent evt) {

if (evt.getClickCount()==1) {

BlackList=(String)jList1.getSelectedValue(); } }

public void mouseReleased(MouseEvent evt) {

if (evt.isPopupTrigger()) {

menu.show(evt.getComponent(), evt.getX(), evt.getY()); } } });

jScrollPane1.setViewportView(jList1);

jPanel1.add(jScrollPane1, org.netbeans.lib.awtextra.AbsoluteConstraints(20, 45, 362, 190));

jLabel1.setIcon(new ImageIcon(\

第 12 页 共 69 页

12

new

jPanel1.add(jLabel1, new org.netbeans.lib.awtextra.AbsoluteConstraints(0, -10, -1, -1));

getContentPane().add(jPanel1, new org.netbeans.lib.awtextra.AbsoluteConstraints(0, 0, 400, 270));

menuBar.setBorder(null);

menuBar.setBackground(new Color(0, 0, 0));

fileMenu.setForeground(new Color(255, 255, 255)); fileMenu.setText(\文件\

fileMenu.setBackground(new Color(0, 0, 0)); fileMenu.setFont(new Font(\宋体\

startMenuItem.setForeground(new Color(255, 255, 255)); startMenuItem.setFont(new Font(\宋体\ startMenuItem.setText(\启动\

startMenuItem.setBackground(new Color(0, 0, 0)); startMenuItem.setBorder(null);

startMenuItem.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent evt) { startMenuItemActionPerformed(evt); } });

fileMenu.add(startMenuItem);

stopMenuItem.setForeground(new Color(255, 255, 255)); stopMenuItem.setFont(new Font(\宋体\ stopMenuItem.setText(\结束\

stopMenuItem.setBackground(new Color(0, 0, 0)); stopMenuItem.setBorder(null);

stopMenuItem.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent evt) { stopMenuItemActionPerformed(evt); } });

fileMenu.add(stopMenuItem);

menuBar.add(fileMenu);

commandMenu.setForeground(new Color(255, 255, 255)); commandMenu.setText(\命令\

commandMenu.setBackground(new Color(0, 0, 0)); commandMenu.setFont(new Font(\宋体\

msgMenuItem.setForeground(new Color(255, 255, 255)); msgMenuItem.setFont(new Font(\宋体\ msgMenuItem.setText(\公告\

msgMenuItem.setBackground(new Color(0, 0, 0)); msgMenuItem.setBorder(null);

msgMenuItem.addActionListener(new ActionListener() {

第 13 页 共 69 页

13

public void actionPerformed(ActionEvent evt) { msgMenuItemActionPerformed(evt); } });

commandMenu.add(msgMenuItem);

warnMenuItem.setForeground(new Color(255, 255, 255)); warnMenuItem.setFont(new Font(\宋体\ warnMenuItem.setText(\警告\

warnMenuItem.setBackground(new Color(0, 0, 0)); warnMenuItem.setBorder(null);

warnMenuItem.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent evt) { warnMenuItemActionPerformed(evt); } });

commandMenu.add(warnMenuItem);

kickMenuItem.setForeground(new Color(255, 255, 255)); kickMenuItem.setFont(new Font(\宋体\ kickMenuItem.setText(\踢人\

kickMenuItem.setBackground(new Color(0, 0, 0)); kickMenuItem.setBorder(null);

kickMenuItem.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent evt) { kickMenuItemActionPerformed(evt); } });

commandMenu.add(kickMenuItem);

menuBar.add(commandMenu);

helpMenu.setForeground(new Color(255, 255, 255)); helpMenu.setText(\帮助\

helpMenu.setBackground(new Color(0, 0, 0)); helpMenu.setFont(new Font(\宋体\

helpMenu.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent evt) { helpMenuActionPerformed(evt); } });

helpMenuItem.setForeground(new Color(255, 255, 255)); helpMenuItem.setFont(new Font(\宋体\ helpMenuItem.setText(\帮助主题\

helpMenuItem.setBackground(new Color(0, 0, 0)); helpMenuItem.setBorder(null);

helpMenuItem.addActionListener(new ActionListener() {

第 14 页 共 69 页

14

public void actionPerformed(ActionEvent evt) { helpMenuItemActionPerformed(evt); } });

helpMenu.add(helpMenuItem);

aboutMenuItem.setForeground(new Color(255, 255, 255)); aboutMenuItem.setFont(new Font(\宋体\ aboutMenuItem.setText(\关于\

aboutMenuItem.setBackground(new Color(0, 0, 0)); aboutMenuItem.setBorder(null);

aboutMenuItem.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent evt) { aboutMenuItemActionPerformed(evt); } });

helpMenu.add(aboutMenuItem);

menuBar.add(helpMenu);

setJMenuBar(menuBar);

pack(); }

public static void main(String args[]) //主函数 {

new Server().show(); }

class connection extends Thread {

private User fromUserMessage=new User(); private User toUserMessage=new User(); private Socket netUser;

private ObjectInputStream streamFromUser; private ObjectOutputStream streamToUser; private boolean existName,existPassword;

private String onlineNumber=\判断在线人数的变化

public connection(Socket UserSocket) {

netUser=UserSocket; try {

streamFromUser = ObjectInputStream(netUser.getInputStream()); streamToUser = ObjectOutputStream(netUser.getOutputStream());

第 15 页 共 69 页

15

new new

}

catch(IOException e) {

try {

netUser.close(); }

catch(IOException e1) {

System.out.print(\ return; } }

this.start(); }

public boolean validateName(String name) {

boolean validate;

String recode,message; RandomAccessFile logfile; FileInputStream fsread; InputStreamReader inputread; BufferedReader bfread; validate=false; try

{

fsread=new FileInputStream(\ inputread=new InputStreamReader(fsread); bfread=new BufferedReader(inputread);

while((recode=bfread.readLine()) != null)//验证用户信息 {

StringTokenizer st = new StringTokenizer(recode,\ while (st.hasMoreTokens()) {

message=st.nextToken(); if(message.equals(name)) {

validate=true; break;

} break;

} } }

catch(FileNotFoundException e) {

System.out.println(\ }

catch(IOException e) {

16

第 16 页 共 69 页

System.out.println(\ }

return validate; }

public boolean validatePassword(String password) {

boolean validate;

String recode,message; RandomAccessFile logfile; FileInputStream fsread; InputStreamReader inputread; BufferedReader bfread; validate=false; try

{

fsread=new FileInputStream(\ inputread=new InputStreamReader(fsread); bfread=new BufferedReader(inputread);

while((recode=bfread.readLine()) != null)//验证用户信息 {

StringTokenizer st = new StringTokenizer(recode,\ while (st.hasMoreTokens()) {

message=st.nextToken(); message=st.nextToken();

if(message.equals(password)) {

validate=true; break;

} break; } } }

catch(FileNotFoundException e) {

System.out.println(\ }

catch(IOException e) {

System.out.println(\ }

return validate; }

public void run() {

try

{

17

第 17 页 共 69 页

for(;;) {

String ButtonMessage;

fromUserMessage=(User)streamFromUser.readObject();//读用户信息

ButtonMessage=fromUserMessage.Command; //读按钮信息

existName=validateName(fromUserMessage.UserName); //验证用户名

existPassword=validatePassword(fromUserMessage.UserPassword);//验证用户密码

if(ButtonMessage.equals(\ {

Login(); }

if(ButtonMessage.equals(\ {

Enter(); }

if(ButtonMessage.equals(\ {

Leave(); }

if(!onlineNumber.equals(\ {

Updating(fromUserMessage.UserName);

}

if(ButtonMessage.equals(\|| ButtonMessage.equals(\ {

Message(); }

if(ButtonMessage.equals(\|| ButtonMessage.equals(\ {

toSinkMessage(); }

if(ButtonMessage.equals(\|| ButtonMessage.equals(\ {

toUserMessage();

} } }

catch(IOException e){}

catch(ClassNotFoundException e){} try {

streamFromUser.close();

第 18 页 共 69 页

18

streamToUser.close(); netUser.close(); }

catch(IOException e){} }

public void Login()//注册请求处理 {

try {

if(existName) {

toUserMessage.Command=\

streamToUser.writeObject((User)toUserMessage); //返回操作信息

streamToUser.flush();

} else {

//加入新用户信息 RandomAccessFile UserObj=new RandomAccessFile(\

UserObj.seek(UserObj.length());

UserObj.writeBytes(fromUserMessage.UserName+\\

+fromUserMessage.UserHeadPhoto+\age.UserAge+\

onlineNumber=\

toUserMessage.Command=\

toUserMessage.UserName=fromUserMessage.UserName;

toUserMessage.Message=\系统消息:大家欢迎\加入我们的DaoDao聊天室!!!\

Server.vectorUserList.addElement(fromUserMessage.UserName);//加入用户到用户在线列表

toUserMessage.vectorUserList=Server.vectorUserList;

streamToUser.writeObject((User)toUserMessage);//返回用户在线列表和操作信息

streamToUser.flush();

Server.vectorStreamToUser.addElement(streamToUser);//存储该对象的输出流

jLabel5.setText(\共有:\个客户在线\服务器刷新

jList1.setListData(Server.vectorUserList);

第 19 页 共 69 页

19

} }

catch(IOException e){} }

public void Enter()//登陆请求处理 {

try {

if(existName && existPassword) {

onlineNumber=\

toUserMessage.Command=\

toUserMessage.UserName=fromUserMessage.UserName;

toUserMessage.Message=\系统消息:大家欢迎\加入我们的欢乐聊天室!!!\

Server.vectorUserList.addElement(fromUserMessage.UserName);//加入用户到用户在线列表

toUserMessage.vectorUserList=Server.vectorUserList;

streamToUser.writeObject((User)toUserMessage);//返回用户在线列表和操作信息

streamToUser.flush();

Server.vectorStreamToUser.addElement(streamToUser);//存储该对象的输出流

jLabel5.setText(\共有:\个客户在线\服务器刷新

jList1.setListData(Server.vectorUserList); } else {

toUserMessage.Command=\

streamToUser.writeObject((User)toUserMessage);//返回操作信息

streamToUser.flush(); } }

catch(IOException e){} }

public void Leave()//离开请求处理 {

String name=fromUserMessage.UserName;

Server.vectorStreamToUser.removeElementAt(Server.vectorUserList.indexOf(name));

Server.vectorUserList.removeElement(name); onlineNumber=\ Updating(name);

第 20 页 共 69 页

20

}

public void Updating(String name)//群发新用户登陆通知,更新用户在线列表和对像框

{

try {

if(onlineNumber.equals(\ {

User toUserMessage=new User(); toUserMessage.Command=\ toUserMessage.UserName=name;

toUserMessage.Message=\系统消息:大家欢迎\加入我们的欢乐聊天室!!!\

for(int i=1;i

ObjectOutputStream newUserStream;

newUserStream=(ObjectOutputStream)Server.vectorStreamToUser.elementAt(i-1); newUserStream.writeObject((User)toUserMessage); newUserStream.flush(); } }

if(onlineNumber.equalsIgnoreCase(\ {

User toUserMessage=new User(); toUserMessage.Command=\ toUserMessage.UserName=name;

toUserMessage.Message=\系统消息:\悄悄的走了!!!\

for(int i=0;i

ObjectOutputStream newUserStream;

newUserStream=(ObjectOutputStream)Server.vectorStreamToUser.elementAt(i); newUserStream.writeObject((User)toUserMessage); newUserStream.flush(); } }

jLabel5.setText(\共有:\个客户在线\服务器刷新

jList1.setListData(Server.vectorUserList); onlineNumber=\ }

catch(IOException e){} }

public void Message()//聊天信息发送 {

User toUserMessage=new User(); try {

第 21 页 共 69 页

21

toUserMessage.Command=\

toUserMessage.Message=fromUserMessage.Message; if(fromUserMessage.Command.equals(\ {

for(int i=0;i

if(!(fromUserMessage.UserName.equals(Server.vectorUserList.elementAt(i)))) {

streamToUser=(ObjectOutputStream)Server.vectorStreamToUser.elementAt(i); streamToUser.writeObject((User)toUserMessage); streamToUser.flush(); } } }

if(fromUserMessage.Command.equals(\ {

for(int i=0;i

if(fromUserMessage.UserName.equals(Server.vectorUserList.elementAt(i))) {

streamToUser=(ObjectOutputStream)Server.vectorStreamToUser.elementAt(i); streamToUser.writeObject((User)toUserMessage); streamToUser.flush(); } } } }

catch(IOException e){} }

//文件传输信息---------------------------------- public void toSinkMessage() {

try {

streamToUser=(ObjectOutputStream)Server.vectorStreamToUser.elementAt(Server.vectorUserList.indexOf(fromUserMessage.SinkName));

streamToUser.writeObject(fromUserMessage); streamToUser.flush(); }

catch(IOException e){} }

public void toUserMessage() {

try

第 22 页 共 69 页

22

{

streamToUser=(ObjectOutputStream)Server.vectorStreamToUser.elementAt(Server.vectorUserList.indexOf(fromUserMessage.UserName));

streamToUser.writeObject(fromUserMessage); streamToUser.flush(); }

catch(IOException e){} } }

private void startMenuItemActionPerformed(ActionEvent evt) //启动事件 {

new AppServer();

jLabel4.setText(\服务器状态:已启动\ }

class AppServer extends Thread {

public AppServer() {

try {

serverSocket = new ServerSocket(1001);

//建立InetAddress对象

InetAddress intel=InetAddress.getLocalHost(); String SerName=intel.getHostName(); String SerIp=intel.getHostAddress(); System.out.println(\服务器名:\

System.out.println(\服务器IP:\ }

catch(IOException e) {

System.out.println(\ }

System.out.println(\ this.start(); }

public void run() {

try {

while(true) {

Socket UserSocket = serverSocket.accept(); connection con = new connection(UserSocket); } }

第 23 页 共 69 页

23

catch(IOException e) {

System.out.println(\ } } }

private void stopMenuItemActionPerformed(ActionEvent evt) //停止事件 {

jLabel4.setText(\服务器状态:即将关闭\

String Message=\各位用户请注意,服务器5秒钟后将关闭!敬请原谅!\ try {

User toUserMessage=new User();

toUserMessage.Command=\ toUserMessage.Message=Message;

for(int i=0;i

ObjectOutputStream

streamToUser=(ObjectOutputStream)Server.vectorStreamToUser.elementAt(i); streamToUser.writeObject((User)toUserMessage); streamToUser.flush(); } }

catch(IOException e){} try {

Thread.sleep(5000); }

catch(InterruptedException e){} System.exit(0); }

private void msgMenuItemActionPerformed(ActionEvent evt) //公告事件 {

try {

User toUserMessage=new User();

String Mesage=JOptionPane.showInputDialog(null,\请输入公告内容:\系统消息\

toUserMessage.Message=\系统消息:\ toUserMessage.Command=\

for(int i=0;i

ObjectOutputStream

streamToUser=(ObjectOutputStream)Server.vectorStreamToUser.elementAt(i); streamToUser.writeObject((User)toUserMessage); streamToUser.flush(); } }

catch(IOException e){}

第 24 页 共 69 页

24

}

private void warnMenuItemActionPerformed(ActionEvent evt) //警告事件 {

Object obj=evt.getSource(); try {

if(obj==warnMenuItem) {

BlackList=JOptionPane.showInputDialog(null,\请输入将警告的用户名:\系统消息\ }

User toUserMessage=new User();

toUserMessage.Message=\警告:请用文明用语!否则你将被强制退出!\\n\ toUserMessage.Command=\ ObjectOutputStream

streamToUser=(ObjectOutputStream)Server.vectorStreamToUser.elementAt(Server.vectorUserList.indexOf(BlackList));

streamToUser.writeObject((User)toUserMessage); streamToUser.flush(); BlackList=\ }

catch(IOException e){} }

private void kickMenuItemActionPerformed(ActionEvent evt) //踢人事件 {

Object obj=evt.getSource(); try {

if(obj==kickMenuItem) {

BlackList=JOptionPane.showInputDialog(null,\请输入将强制退出的用户名:\系统消息\ }

User toUserMessage=new User();

for(int i=0;i

if(BlackList.equals(Server.vectorUserList.elementAt(i))) {

toUserMessage.Command=\

toUserMessage.Message=\系统消息:对不起!你已被强制退出!\\n\ } else {

toUserMessage.UserName=BlackList; toUserMessage.Command=\

toUserMessage.Message=\系统消息:\已被强制退出!\\n\

}

ObjectOutputStream

第 25 页 共 69 页

25

streamToUser=(ObjectOutputStream)Server.vectorStreamToUser.elementAt(i); streamToUser.writeObject((User)toUserMessage); streamToUser.flush(); }

Server.vectorStreamToUser.removeElementAt(Server.vectorUserList.indexOf(BlackList)); //服务器刷新

Server.vectorUserList.removeElement(BlackList);

jLabel5.setText(\共有:\个客户在线\ BlackList=\ }

catch(IOException e){} }

private void aboutMenuItemActionPerformed(ActionEvent evt) //关于事件 { }

private void helpMenuItemActionPerformed(ActionEvent evt) //帮助事件 { }

private void helpMenuActionPerformed(ActionEvent evt) { }

private void exitForm(WindowEvent evt) //退出事件 {

System.exit(0); } }

//UserLogin.java

import javax.swing.*; import java.awt.*;

import java.awt.event.*; import java.net.*; import java.io.*; import java.util.*;

import javax.swing.border.*; import java.applet.*;

import java.applet.AudioClip; import java.net.URL;

import java.net.MalformedURLException; import java.awt.GridBagLayout;

class User implements Serializable //用户信息类

第 26 页 共 69 页

26

{

String UserName; String UserPassword; String UserHeadPhoto; String UserEmail; String UserAge;

String SinkName; String FileName; byte FileData[];

String Message; String Command;

Vector vectorUserList; }

class IllegalLengthException extends Exception //自定义异常类 {}

public class UserLogin extends JFrame //联接服务器窗口类 {

// 登陆窗口变量声明

private User fromServerMessage; private User toServerMessage;

private static Vector vectorUserList;

private UserLoginWindow frameEnter;

private Frame frameLogin; private JPanel panelObject; private JLabel Label;

private JComboBox ComboBoxUserName;

private JPasswordField textUserPassword;

private JButton buttonLogin,buttonEnter,buttonExit;

private Socket toServer;

private ObjectOutputStream streamToServer; private ObjectInputStream streamFromServer; private BufferedReader fromServer;

//聊天室窗口变量声明

private JLabel jLabelUserName; private JButton jButtonHelp; private JButton jButtonLoginout; private JButton jButtonMusic; private JButton jButtonOption; private JButton jButtonSend; private JButton jButtonTran; private JCheckBox jCheckBox1; private JComboBox jComboBoxFace;

第 27 页 共 69 页

27

private JComboBox jComboBoxFontsize; private JComboBox jComboBoxFontstyle; private JComboBox jComboBoxUserlist; private JLabel jLabelBackground; private JLabel jLabelWelcome; private JList jList1;

private JScrollPane jScrollPane1; private JScrollPane jScrollPane2; public JTextArea jTextArea1; private JPanel jPanel1;

private JTextField jTextFieldMsg;

private String Face[]={\说\大声的说\开心的说\大笑着说\惊讶的说\忧郁的说\伤心的说\犹豫着说\

\怯怯的说\皱着眉头说\做了个鬼脸说\吐了吐舌头说\愁眉苦脸的说\

//设置服务器IP地址窗口变量声明

private static UserLogin frameServerIP;

private JButton jButtonNext; private JLabel jLabel1; private JPanel jPanel2; private JTextField jTextFieldIpaddress; String ServerIPaddress;

public UserLogin() {

initComponents(); //设置窗口位置居中 int

locationX=(int)(Toolkit.getDefaultToolkit().getScreenSize().getWidth()-getSize().getWidth())/2; int

locationY=(int)(Toolkit.getDefaultToolkit().getScreenSize().getHeight()-getSize().getHeight())/2;

setLocation(locationX,locationY); }

public static void main(String args[]) //主函数 {

JWindow mainpage=new JWindow(); mainpage.setSize(400,300); JPanel content = new JPanel(); content.setOpaque(false);

mainpage.getContentPane().add(content); content.setLayout(null);

ImageIcon background = new ImageIcon(\ JLabel backlabel = new JLabel(background);

content.add(backlabel, new Integer(Integer.MIN_VALUE));

backlabel.setBounds(0,0,background.getIconWidth(),background.getIconHeight()); mainpage.setLocation(200,150);

第 28 页 共 69 页

28

mainpage.setVisible(true); try {

content.setOpaque(false);

Thread.sleep(2000); }

catch(InterruptedException e){}

mainpage.setVisible(false); frameServerIP=new UserLogin(); frameServerIP.setVisible(true); }

private void jButtonNextActionPerformed(ActionEvent evt) //下一步按钮事件 {

ServerIPaddress=jTextFieldIpaddress.getText().toString();

StringTokenizer str=new StringTokenizer(ServerIPaddress,\ while (str.hasMoreTokens()) {

String IP1=str.nextToken(); String IP2=str.nextToken(); String IP3=str.nextToken(); String IP4=str.nextToken(); int ip1=Integer.parseInt(IP1); int ip2=Integer.parseInt(IP2); int ip3=Integer.parseInt(IP3); int ip4=Integer.parseInt(IP4);

if((ip1>=1&&ip1<=223)&(ip2>=0&&ip2<=255)&(ip3>=0&&ip3<=255)&(ip4>=1&&ip4<=254)) {

frameServerIP.setVisible(false); frameEnter=new UserLoginWindow(); frameEnter.setSize(400,320);

frameEnter.setVisible(true); } else {

JOptionPane.showMessageDialog(this,\您输入了非法的IP地址,请再输入一次!\

jTextFieldIpaddress.setText(\ }

break; } }

private void exitForm(java.awt.event.WindowEvent evt) //退出按钮事件 {

System.exit(0); }

class UserLoginWindow extends JFrame implements Runnable //登录窗口

第 29 页 共 69 页

29

{

public UserLoginWindow() {

initComponents(); //调用组件初始化函数 //设置窗口位置居中 int

locationX=(int)(Toolkit.getDefaultToolkit().getScreenSize().getWidth()-getSize().getWidth())/2; int

locationY=(int)(Toolkit.getDefaultToolkit().getScreenSize().getHeight()-getSize().getHeight())/2;

setLocation(locationX,locationY); }

private void initComponents() //组件初始化 {

fromServerMessage=new User(); toServerMessage=new User(); vectorUserList = new Vector(1,1);

ComboBoxUserName = new JComboBox(); //用户名输入框 textUserPassword = new JPasswordField(); //密码输入框 buttonEnter = new JButton(); //确定按钮 buttonExit = new JButton(); //取消按钮 buttonLogin = new JButton(); //注册按钮 Label = new JLabel();

getContentPane().setLayout(new

org.netbeans.lib.awtextra.AbsoluteLayout()); //设置面板的布局方式为绝对布局

setTitle(\登录\ setResizable(false);

addWindowListener(new WindowAdapter() //点击窗口关闭按钮事件 {

public void windowClosing(WindowEvent evt) { exitForm(evt); } }); try {

String recode;

FileInputStream fsread=new FileInputStream(\ InputStreamReader inputread=new InputStreamReader(fsread); BufferedReader bfread=new BufferedReader(inputread); while((recode=bfread.readLine()) != null) {

ComboBoxUserName.addItem(recode); } }

catch(IOException e){}

ComboBoxUserName.setForeground(new Color(0,0,0));

第 30 页 共 69 页

30

ComboBoxUserName.setBackground(new Color(255, 255, 255)); ComboBoxUserName.setEditable(true);

ComboBoxUserName.setFont(new Font(\ ComboBoxUserName.setOpaque(false);

ComboBoxUserName.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent evt) { ComboBoxUserNameActionPerformed(evt); } });

getContentPane().add(ComboBoxUserName,

org.netbeans.lib.awtextra.AbsoluteConstraints(172, 116, 152, 28));

textUserPassword.setAlignmentY(1.0F); textUserPassword.setBorder(null);

textUserPassword.setFont(new Font(\ textUserPassword.setMargin(new Insets(12, 34, 0, 0));

getContentPane().add(textUserPassword,

org.netbeans.lib.awtextra.AbsoluteConstraints(172, 162, 150, 20));

buttonExit.setForeground(new Color(255, 255, 255)); buttonExit.setFont(new Font(\幼圆\ buttonExit.setText(\退出\

buttonExit.setBackground(new Color(255, 204, 0)); buttonExit.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent evt) { buttonExitActionPerformed(evt); } });

getContentPane().add(buttonExit,

org.netbeans.lib.awtextra.AbsoluteConstraints(240, 210, -1, -1));

buttonEnter.setForeground(new Color(255, 255, 255)); buttonEnter.setFont(new Font(\幼圆\ buttonEnter.setText(\登录\

buttonEnter.setBackground(new Color(255, 204, 51));

buttonEnter.addActionListener(new EnterActionListener());

getContentPane().add(buttonEnter,

org.netbeans.lib.awtextra.AbsoluteConstraints(120, 210, -1, -1));

buttonLogin.setForeground(new Color(255, 255, 255)); buttonLogin.setFont(new Font(\幼圆\ buttonLogin.setText(\注册向导\

buttonLogin.setBackground(new Color(255, 204, 0)); buttonLogin.setBorder(null);

buttonLogin.setOpaque(false);

buttonLogin.addActionListener(new LoginActionListener());

第 31 页 共 69 页

31

new

new

new

new

getContentPane().add(buttonLogin, new org.netbeans.lib.awtextra.AbsoluteConstraints(300, 260, -1, -1));

Label.setIcon(new ImageIcon(\ getContentPane().add(Label, new org.netbeans.lib.awtextra.AbsoluteConstraints(0, 0, -1, -1));

try {

toServer=new Socket(ServerIPaddress,1001); streamToServer = new ObjectOutputStream(toServer.getOutputStream()); streamFromServer = new ObjectInputStream(toServer.getInputStream()); }

catch(IOException e) {}

Thread thread = new Thread(this); thread.start(); pack(); }

void Detect(int lengthName,int lengthPassword) throws IllegalLengthException

{

if(lengthName<4 || lengthPassword<4) throw new IllegalLengthException(); }

private void buttonExitActionPerformed(ActionEvent evt) //取消按钮事件 {

System.exit(0); }

private void ComboBoxUserNameActionPerformed(ActionEvent evt) //用户名下拉列表事件 { }

private void exitForm(WindowEvent evt) //退出按钮事件 {

System.exit(0); }

public void run() {

try

{ for(;;) {

第 32 页 共 69 页

32

fromServerMessage=(User)streamFromServer.readObject();

String ButtonMessage=fromServerMessage.Command; if(ButtonMessage.equals(\ {

JOptionPane.showMessageDialog(null,\恭喜!注册成功!\

frameLogin.setVisible(false);

new chatroom().show();

AddEnterUser(); }

if(ButtonMessage.equals(\ {

frameEnter.setVisible(false); new chatroom().show(); AddEnterUser(); }

if(ButtonMessage.equals(\ {

JOptionPane.showMessageDialog(null,\错误:相同的用户名已注册!\

frameLogin.setVisible(false); frameServerIP=new UserLogin();

frameServerIP.setVisible(true); }

if(ButtonMessage.equals(\ {

JOptionPane.showMessageDialog(null,\警告:非法的用户名或密码!\

frameEnter.setVisible(false); frameServerIP=new UserLogin();

frameServerIP.setVisible(true);

}

if(ButtonMessage.equals(\

{

JOptionPane.showMessageDialog(null,fromServerMessage.Message);//fy System.exit(0); }

if(ButtonMessage.equals(\|| ButtonMessage.equals(\

{ Updating(); }

if(ButtonMessage.equals(\

{ SystemMessage(); }

if(ButtonMessage.equals(\|| ButtonMessage.equals(\

第 33 页 共 69 页

33

{ Message(); }

if(ButtonMessage.equals(\|| ButtonMessage.equals(\ ButtonMessage.equals(\|| ButtonMessage.equals(\ {

FileMessage(); }

continue; } }

catch(Exception e) {

JOptionPane.showMessageDialog(null, \\JOptionPane.ERROR_MESSAGE);//测试 } }

public void AddEnterUser() {

try {

String recode;

boolean find=false; RandomAccessFile EnterObj=new RandomAccessFile(\

FileInputStream fsread=new FileInputStream(\ InputStreamReader inputread=new InputStreamReader(fsread); BufferedReader bfread=new BufferedReader(inputread); while((recode=bfread.readLine()) != null) {

while (recode.equals(fromServerMessage.UserName)) {

find=true; break; }

} if(find==false)

{

EnterObj.seek(EnterObj.length());

EnterObj.writeBytes(fromServerMessage.UserName+\ } }

catch(IOException e){} }

public void Updating() //刷新信息 {

String newUser=fromServerMessage.UserName;

第 34 页 共 69 页

34

String message=fromServerMessage.Message; jTextArea1.append(message);

if(fromServerMessage.Command.equals(\ {

vectorUserList.addElement(newUser); jList1.setListData(vectorUserList);

jComboBoxUserlist.addItem(fromServerMessage.UserName); } else {

vectorUserList.removeElement(newUser); jList1.setListData(vectorUserList); jComboBoxUserlist.removeItem(newUser); } }

public void SystemMessage() //接受系统信息 {

JOptionPane.showMessageDialog(null,fromServerMessage.Message,\系统消息\ }

public void Message() //接受聊天信息 {

jTextArea1.append(fromServerMessage.Message); }

public void FileMessage() //文件传输处理 { try {

if(fromServerMessage.Command.equals(\ { int

State=JOptionPane.showOptionDialog(null,fromServerMessage.UserName+\请求发送一个文件给你,可以开始了吗?\提示\ if(State==JOptionPane.YES_OPTION) {

fromServerMessage.Command=\

streamToServer.writeObject(fromServerMessage); streamToServer.flush(); } else {

fromServerMessage.Command=\

streamToServer.writeObject(fromServerMessage); streamToServer.flush(); } }

else if(fromServerMessage.Command.equals(\

第 35 页 共 69 页

35

{

JOptionPane.showMessageDialog(null,\回复消息:对方已准备好,可以开始传送!\

JFileChooser chooser=new JFileChooser(); int State=chooser.showOpenDialog(null); if(State==JFileChooser.APPROVE_OPTION) {

String FileName=chooser.getSelectedFile().getName(); String FileDir=chooser.getCurrentDirectory().toString(); File file = new File(FileDir,FileName);

FileInputStream InputFile = new FileInputStream(file); fromServerMessage.FileData= new byte[(int)file.length()]; InputFile.read(fromServerMessage.FileData); InputFile.close();

fromServerMessage.Command=\ fromServerMessage.FileName=FileName;

streamToServer.writeObject(fromServerMessage); streamToServer.flush();

jButtonTran.setEnabled(false);

JOptionPane.showMessageDialog(null,\回复消息:请稍等!文件传送中 . . .\ }

if(State==JFileChooser.CANCEL_OPTION){} }

else if(fromServerMessage.Command.equals(\ {

JOptionPane.showMessageDialog(null,\回复消息:对不起!对方尚未准备好,请重新申请!\ }

else if(fromServerMessage.Command.equals(\ {;

JFileChooser chooser=new JFileChooser(); int State=chooser.showSaveDialog(null); if(State==JFileChooser.APPROVE_OPTION) {

String suffix; StringTokenizer st = new StringTokenizer(fromServerMessage.FileName,\ suffix=st.nextToken(); suffix=st.nextToken(); String

FileName=chooser.getSelectedFile().getName()+\

String FileDir=chooser.getCurrentDirectory().toString(); File file = new File(FileDir,FileName);

FileOutputStream OutputFile = new FileOutputStream(file); OutputFile.write(fromServerMessage.FileData); OutputFile.close();

fromServerMessage.Command=\

streamToServer.writeObject(fromServerMessage);

第 36 页 共 69 页

36

streamToServer.flush(); }

if(State==JFileChooser.CANCEL_OPTION){} }

else if(fromServerMessage.Command.equals(\ {

JOptionPane.showMessageDialog(null,\回复消息:拷贝成功!谢谢!\

jButtonTran.setEnabled(true); } else

{

JOptionPane.showMessageDialog(null,\回复消息:对不起!拷贝不成功!请重新再试!\

jButtonTran.setEnabled(true); } }

catch(IOException e){} }

class LoginActionListener implements ActionListener //注册申请事件 {

public void actionPerformed(ActionEvent evt) {

frameEnter.setVisible(false); new register(); } }

class EnterActionListener implements ActionListener //登陆申请事件

{

public void actionPerformed(ActionEvent evt) {

Object obj = evt.getSource();

toServerMessage.UserName=String.valueOf(ComboBoxUserName.getSelectedItem());

toServerMessage.UserPassword=String.valueOf(textUserPassword.getPassword()); int lengthName=toServerMessage.UserName.length();

int lengthPassword=toServerMessage.UserPassword.length(); try {

Detect(lengthName,lengthPassword); toServerMessage.Command=\

streamToServer.writeObject((User)toServerMessage); streamToServer.flush(); }

catch (IllegalLengthException e1) {

JOptionPane.showMessageDialog(null,\错误:用户名或密码

第 37 页 共 69 页

37

长度不合法!\

ComboBoxUserName.setSelectedItem(\ textUserPassword.setText(\ }

catch(IOException e1)

{System.out.println(\ } }

class ExitActionListener implements ActionListener //注销事件 {

public void actionPerformed(ActionEvent evt) { try {

streamToServer.close(); streamFromServer.close(); fromServer.close(); toServer.close(); System.exit(0); }

catch(IOException e){} } }

class register extends JFrame implements ActionListener //注册向导窗口类

{

private JButton buttonNext1,buttonExit1;

private JButton buttonPrevious2,buttonNext2,buttonExit2; private JButton buttonPrevious3,buttonSubmit,buttonExit3; private JLabel label1,label2,label3;

private JPasswordField PasswordField1,PasswordField2; private JTextField textUserName,textEmail,textAge; private JComboBox comboBoxHeadPhoto;

private Panel register1,register2,register3; private CardLayout cardLayout;

register() {

initComponents(); //调用组件初始化函数 }

private void initComponents() //组件初始化 {

frameLogin = new Frame (\注册向导\ cardLayout = new CardLayout(); frameLogin.setLayout(cardLayout);

register1 = new Panel(); register2 = new Panel(); register3 = new Panel();

第 38 页 共 69 页

38

frameLogin.addWindowListener(new java.awt.event.WindowAdapter() {

public void windowClosing(java.awt.event.WindowEvent evt)

{

exitForm(evt); } });

register1.setLayout(new org.netbeans.lib.awtextra.AbsoluteLayout());

buttonExit1=new JButton(\取 消\

buttonExit1.setForeground(new Color(255, 255, 255)); buttonExit1.setFont(new Font(\幼圆\ buttonExit1.setBackground(new Color(255, 204, 0)); buttonExit1.addActionListener(this);

register1.add(buttonExit1, new org.netbeans.lib.awtextra.AbsoluteConstraints(280, 250, -1, -1));

buttonNext1=new JButton(\下一步\

buttonNext1.setForeground(new Color(255, 255, 255)); buttonNext1.setFont(new Font(\幼圆\

buttonNext1.setBackground(new Color(255, 204, 0)); buttonNext1.addActionListener(this);

register1.add(buttonNext1, new org.netbeans.lib.awtextra.AbsoluteConstraints(180, 250, -1, -1));

textUserName=new JTextField(10);

textUserName.setForeground(new java.awt.Color(51, 153, 255));

textUserName.setFont(new java.awt.Font(\幼圆\ textUserName.setBorder(null); textUserName.setOpaque(false); register1.add(textUserName, new org.netbeans.lib.awtextra.AbsoluteConstraints(132, 153, 193, 30));

label1=new JLabel(new ImageIcon(\ register1.add(label1, new org.netbeans.lib.awtextra.AbsoluteConstraints(0, 0, -1, -1));

label1.setForeground(new Color(51, 153, 255)); label1.setFont(new Font(\幼圆\ label1.setBorder(null); // register1.add(label1, new org.netbeans.lib.awtextra.AbsoluteConstraints(132, 153, 193, 30));

第 39 页 共 69 页

39

本文来源:https://www.bwwdw.com/article/hgm.html

Top