院
系: :
计算机科学学院
专
业: :
计算机科学与技术
年
级: :
3 2013 级
课程名称: :
软件工程
组
员: :
司少武
(2)
兰少雄
(2)
张宇
(2)
纳洪泽 (2) 指导教师: :
刘卫平
5 2015 年
2 12 月
26 日
聊天室
1 前言
1 1 、 1 即时消息系统的研究现状
即时消息系统[1](Instant Messenger,IM)就是一种在后 PC 时代兴起的,以 Internet 网络为基础的,允许交互双方即时地传送文字、语音、视频等信息,能够跟踪网络用户在线状态的网络应用软件。即时消息系统产生有着深刻的社会原因:人们都有渴望社交,获得社会尊重、实现自我的需求,这正就是即时消息软件风行的原动力,而物质文明的日益发达所带来副作用,又使得人们习惯与周围的人保持距离,以致人们更愿意对陌生人敞开心扉,在网络中可以跨越年龄、身份、行业、地域的限制,达到人与人、人与信息之间的零距离交流。从这点上讲,即时消息系统的出现改变了人们的沟通方式与交友文化,大大拓展了个人生活交流的空间。
1 1 、2 2 本工程的主要内容
随着互联网逐步普及,人们的生活与工作也越来越离不开信息网络的支持, 而聊天室就是人们最常见, 最直接的网上交流的方式。本聊天系统以聊天交流为主,为广大用户提供一个借助网络进行人际交往的平台,也就是网络与现实最贴近的实用型网站。本文所介绍的网络聊天系统就是基于开放的 JAVA 应用程序开发设计的,其主要特性就是能动态、实时的完成信息的传递,且具有高效的交互性,更有效的处理客户请求, 且具有脱离数据库技术方法, 易于维护与更新的特点。
2 需求分析
本系统所要实现的主要功能就是当用户聊天时,将当前用户名、聊天对象、聊天内容、聊天语气与就是否私聊进行封装,然后与服务器建立 Socket 连接,再用对象输出流包装 Socket 的输出流将聊天信息对象发送给服务器端 当用户发送聊天信息时,服务端将会收到客户端用 Socket 传输过来的聊天信息对象,然后将其强制转换为 Chat 对象,并将本次用户的聊天信息对象添加到聊天对象集 Message 中,以供所有聊天用户访问。
接收用户的聊天信息就是由多线程技术实现的,因为客户端必须时时关注更新服务器上就是否有最新消息,在本程序中设定的就是 3 秒刷新服务器一次,如果间隔时间太短将会增加客户端与服务器端的通信负担,而间隔时间长就会让人感觉没有时效性,所以经过权衡后认为3秒最佳,因为每个用户都不可能在3秒内连续发送信息。
当每次用户接收到聊天信息后将会开始分析聊天信息然后将适合自己的信息人性化地显示在聊天信息界面上。
2 2 、 1
业务需求
1、 与聊天室成员一起聊天。
2、 可以与聊天室成员私聊。
3、 可以改变聊天内容风格。
4、 用户注册(含头像)、登录。
5、 服务器监控聊天内容。
6、 服务器过滤非法内容。
7、 服务器发送通知。
8、 服务器踢人。
9、 保存服务器日志。
10、保存用户聊天信息。
2 2 、 2
系统功能模块
2 2 、2 2 、 1
服务器端
1、处理用户注册
2、处理用户登录
3、处理用户发送信息
4、处理用户得到信息
5、处理用户退出 2 2 、2 2 、 2
客户端
1、用户注册界面及结果
2、用户登录界面及结果
3、用户发送信息界面及结果
4、用户得到信息界面及结果
5、用户退出界面及结果 2 2 、 3
性能需求
运行环境:Windows All
必要环境:JDK 1、5 以上
硬件环境:CPU 400MHz 以上,内存 64MB 以上 3 3 数据结构
3 3 、 1 数据结构
此系统数据库中储存信息采用字符指针储存,将用户的信息用字符的形式进行处理并储存。
3 3 、 2 逻辑结构
逻辑结构:
用户向服务器发送请求,服务器获取对方 IP,若获取成功,用户向其发送消息,服务器将其处理并将其记录,然后将消息发给另一用户。其 E—R 图如下所示: 2
将 E-R 图转化为关系模型,建立关系模型为: 消息(内容,时间); 记录信息(内容,储存信息); 服务器(服务器 IP);
3 3 3 、 3 功能模块划分
3、3、1 结构框图 消息 发送 服务器 记录 记录信息 内容 时间 内容 储存信息 图 1、E-R 图 服务器 IP
3、3、2 程序流图 (1) 整个系统流程图如下:
聊天系统 发送消息 接受消息 服务器获取 IP 服务器发送消息 保存信息 时钟 图 2、结构图 用户发送的消息或请求 结束 服务器接收信息 查询请求? 向用请求户发送消息 保存信息 向目标用户发送消息 就 否 图 3、系统程序流程图
3、3、3 模块功能分析及外部设计 模块功能分析: (1)发送消息:用户选择好友,如果好友在线,服务器便获取其IP地址,用户打开消息盒编辑需要发送的消息,然后发送,服务器接受此消息,并处理记录到记录表中,然后将其发送给好友。
(2)接收消息:好友发送的信息通过服务器处理并发送到本用户,如果设置为接收消息,则系统提示并可以打开查瞧此消息,否则服务器不将此消息发送到本用户。
(3)消息记录查询:用户向服务器发送查询请求,服务器作出响应并将最近消息记录发送到此用户。
外部设计: 交互设计就是面向最终用户的设计,就是软件的外部设计,交互设计要求在研究软件技术问题的同时对人加以研究。用户就是什么样的人?用户怎样与新的计算机系统进行交互?用户怎样解释系统产生的信息?用户对系统有哪些期望?这些问题仅仅就是需要在用户交互设计时必须询问与回答的问题。
作为点对点的聊天系统,作为服务使用者得用户与提供服务的聊天系统有着互动与交换信息的过程,用户有请求,系统就必须有应答,需要双方参与。
(1)当用户选择好友向其发送消息时,点击好友,向服务器发送请求,如果好友在线,服务器自动获取好友 IP 并建立双方的连接,进行聊天。否则应该提示好友不在,不能聊天或发送离线信息。
(2)用户查询聊天信息时,向服务器发送查询请求,服务器作出响应并将相应记录发送到此用户界面。
通过对产品的界面与行为进行交互设计,让产品与它的使用者之间建立一种有机关系,从而可以有效的达到使用者的目标,而好的交互设计会使系统与使用者之间更好的交互,达到“愉悦地合作”,这就是交互设计的最终目的。
4 详细设计
4 4 、 1 类定义
ChatClient、java 为客户端程序启动类,负责客户端的启动与退出。
Login、java 为客户端程序登录界面,负责用户帐号信息的验证与反馈。
Register、java 为客户端程序注册界面,负责用户帐号信息的注册验证与反馈。
ChatRoom、java 为客户端程序聊天室主界面,负责接收、发送聊天内容与服务器端的 Connection、java 亲密合作。
Windowclose 为 ChatRoom、java 的内部类,负责监听聊天室界面的操作,当用户退出时返回给服务器信息。
Clock、java 为客户端程序的一个小程序,实现的一个石英钟功能。
4 4 、 2 主要模块内部设计
此点对点聊天系统主要包括以下模块:(1)发送消息;(2)接收消息;(3)查询消息记录。每个模块的主要执行功能函数及算法如下。
4 4 、2 2 、1 1 模块 1 1 设计
4、2、1、1 模块算法 模块一:发送消息:
发送消息函数:send messages(char *p,InetAdrress);
发送消息后自动执行储存函数:memory messages(InetAdrress,char *p); 4、2、1、2 流程图
4.2.2 模块 2 2 设计
4、2、2、1 模块算法 模块二:接收消息:
接收消息消息函数: *receive messages(InetAdrress,char *p);
接 收 消 息 后 自 动 执 行 储 存 消 息 函 数 :memory messages(InetAdrress,char *p); 4、2、2、2 流程图: 用户输入要发送的信息 就是否在线? 获取 IP 发送消息 保存记录 结束 就否 图 4、发送消息流程图
4.2.3 模块 3 3 设计
4、2、3、1 模块算法 模块三:消息记录查询:
执行发送请求函数:*check notes(InetAdrress,char *p);
删除记录函数:delete notes(InetAdrress);
自动执行接收消息函数:*receive messages(InetAdrress,char *p);
4、2、3、2
流程图: 好友发送的消息 就是否接收 打开消息 保存消息记 结束 图 5、接收消息流程图 就 否
5 测试分析与截图
在实现本系统的同时每设计一个模块,就实现模块测试,使其能实现该函数需要实现的功能,此阶段为白盒测试。此阶段将此模块作为单独的一个实体来测试,而且比较容易实际检验模块正确性的测试方案,保证每个模块单元的正确运行,来确定编码与详细设计的错误。
然后集成测试。集成测试阶段,先将单元测试成功的模块放在一起形成一个子系统来测试,以解决模块间的协调与通信问题。然后将子系统测试通过的模块放在一起形成一个完整的系统测试,检验功能,来发现需求报告中的错误。
5 5 、 1 测试用例
为了检验此系统的正确性,设计了以下的一些测试用例: (1)登录注册
(2)发送与接收消息 A:您好 B:您好
(3)保存聊天记录
用户发送的查询请求 就是否存在记录服务器向其发送记录 读取记录 结束 就 否 图 6、查询记录流程
(4)保存聊天记录
(5)保存服务器日志
(6)服务器踢人 不同的测试数据发现程序错误的能力差别很大,为了提高测试效率低测试成本,应该选择高效的测试用例,数据尽量少,做到尽可能完备的测试就可以了。
5 5 、 2 测试结果
5、2、1 登录界面
5、2、2 注册界面
5、2、3 服务器
5、2、4 聊天室聊天 对所有人,私人聊天,系统提示信息。
5、2、5 聊天记录保存
5、2、6 服务器日志保存
5、2、7 服务器踢人
5、2、8 时钟
6
结束语
Java面向对象程序设计就是一门应用广泛并且实用性极强的高级程序设计语言。通过本次课程设计,我们对面向对象的基本思想有了进一步的理解,对项目的各个阶段的任务也有了一定的了解。设计开始阶段必须明确设计的目的与需求分析,总体设计要全面分析聊天室系统的架构。通过这次设计,使我们认识到体系的架构就是最重要的,只有准确的系统设计、很好的定义各个模块及模块之间的关系,才能在编码阶段更轻松的的实现。
通过这次课程设计,对我们的逻辑思维能力就是一个很大的锻炼,它不仅加强了我们的系统思考问题的能力,而且还改变了我们以前不好的编程习惯,虽然花费了不少的时间,但就是我们学到了丰富的知识。
另外,此次课程设计也提高了我们的团对合作精神,让我们明白不就是不能一个人能单独完成,而就是要集思广益,结合更多的人的创意思维。让我们大家深刻的体会到理论与实际相结合的重要性与微妙之处。对于不同的想法我们都会集中讨论并对好的意见加以借鉴,在这个讨论的过程中,还更正了不少我们各自自身对于某个知识点的误区。
这次程序设计也就是一个毅力的考验过程。有时候往往只就是一个小小的错误,却要花出几小时甚至就是一两天的时间才可能发现它。所以在这个过程不能
过于急躁,要很有耐心将程序反复调试。
App server 、 java
import java、io、*; import java、net、*; import java、util、*; public class AppServer extends Thread {
private ServerSocket serverSocket;
private ServerFrame sFrame;
private static Vector userOnline = new Vector(1, 1);
private static Vector v = new Vector(1, 1);
public AppServer() {
sFrame = new ServerFrame();
try {
serverSocket = new ServerSocket(1001);
// 获取服务器的主机名与 IP 地址
InetAddress address = InetAddress、getLocalHost();
sFrame、txtServerName、setText(address、getHostName());
sFrame、txtIP、setText(address、getHostAddress());
sFrame、txtPort、setText("1001");
} catch (IOException e) {
fail(e, "不能启动服务!");
}
sFrame、txtStatus、setText("已启动、、、");
this、start(); // 启动线程
}
public static void fail(Exception e, String str) {
System、out、println(str + " 。" + e);
}
public void run() {
try {
while (true) {
Socket client = serverSocket、accept();
new Connection(sFrame, client, userOnline, v);
System、out、println("userLength:"+userLength);
}
} catch (IOException e) {
fail(e, "不能监听!");
}
}
public static void main(String args[]) {
new AppServer();
} } Login 、 java
import*; public class Login extends JFrame implements ActionListener {
private static final long serialVersionUID = -89657739L;
private JPanel pnlLogin;
private JButton btnLogin, btnRegister, btnExit;
private JLabel lblServer, lblUserName, lblPassword, lblLogo;
private JTextField txtUserName, txtServer;
private JPasswordField pwdPassword;
private String strServerIp;
private Dimension scrnsize;
private Toolkit toolkit = Toolkit、getDefaultToolkit();
public Login() {
super("登录[HappyChat]聊天室");
pnlLogin = new JPanel();
this、getContentPane()、add(pnlLogin);
lblServer = new JLabel("服务器(S):");
lblUserName = new JLabel("用户名(U):");
lblPassword = new JLabel("口
令(P):");
txtServer = new JTextField(20);
txtServer、setText("127、0、0、1");
txtUserName = new JTextField(20);
pwdPassword = new JPasswordField(20);
btnLogin = new JButton("登录(L)");
btnLogin、setToolTipText("登录到服务器");
btnLogin、setMnemonic("L");
btnRegister = new JButton("注册(R)");
btnRegister、setToolTipText("注册新用户");
btnRegister、setMnemonic("R");
btnExit = new JButton("退出(X)");
btnExit、setToolTipText("退出系统");
btnExit、setMnemonic("X");
pnlLogin、setLayout(null);
pnlLogin、setBackground(new Color(52, 130, 203));
lblServer、setBounds(50, 100, 100, 30);
txtServer、setBounds(150, 100, 120, 25);
lblUserName、setBounds(50, 130, 100, 30);
txtUserName、setBounds(150, 130, 120, 25);
lblPassword、setBounds(50, 160, 100, 30);
pwdPassword、setBounds(150, 160, 120, 25);
btnLogin、setBounds(50, 200, 80, 25);
btnRegister、setBounds(130, 200, 80, 25);
btnExit、setBounds(210, 200, 80, 25);
Font fontstr = new Font("宋体", Font、PLAIN, 12);
lblServer、setFont(fontstr);
txtServer、setFont(fontstr);
lblUserName、setFont(fontstr);
txtUserName、setFont(fontstr);
lblPassword、setFont(fontstr);
pwdPassword、setFont(fontstr);
btnLogin、setFont(fontstr);
btnRegister、setFont(fontstr);
btnExit、setFont(fontstr);
lblUserName、setForeground(Color、BLACK);
lblPassword、setForeground(Color、BLACK);
btnLogin、setBackground(Color、ORANGE);
btnRegister、setBackground(Color、ORANGE);
btnExit、setBackground(Color、ORANGE);
pnlLogin、add(lblServer);
pnlLogin、add(txtServer);
pnlLogin、add(lblUserName);
pnlLogin、add(txtUserName);
pnlLogin、add(lblPassword);
pnlLogin、add(pwdPassword);
pnlLogin、add(btnLogin);
pnlLogin、add(btnRegister);
pnlLogin、add(btnExit);
Icon logo1 = new ImageIcon("images\\loginlogo、jpg");
lblLogo = new JLabel(logo1);
lblLogo、setBounds(0, 0, 340, 66);
pnlLogin、add(lblLogo);
setResizable(false);
setSize(340, 260);
setVisible(true);
scrnsize = toolkit、getScreenSize();
setLocation(scrnsize、width / 2 - this、getWidth() / 2, scrnsize、height
/ 2 - this、getHeight() / 2);
Image img = toolkit、getImage("images\\appico、jpg");
setIconImage(img);
btnLogin、addActionListener(this);
btnRegister、addActionListener(this);
btnExit、addActionListener(this);
@SuppressWarnings({ "deprecation", "static-access" })
public void actionPerformed(ActionEvent ae) {
Object source = ae、getSource();
if (source、equals(btnLogin)) {
if (txtUserName、getText()、equals("")
|| pwdPassword、getText()、equals("")) {
JOptionPane op1 = new JOptionPane();
op1、showMessageDialog(null, "用户名或密码不能为空");
} else {
strServerIp = txtServer、getText();
login();
}
}
if (source、equals(btnRegister)) {
strServerIp = txtServer、getText();
this、dispose();
new Register(strServerIp);
}
if (source == btnExit) {
System、exit(0);
}
}
@SuppressWarnings("deprecation")
public void login() {
Customer data = new Customer();
data、custName = txtUserName、getText();
data、custPassword = pwdPassword、getText();
try {
Socket toServer;
toServer = new Socket(strServerIp, 1001);
ObjectOutputStream streamToServer = new ObjectOutputStream(toServer
、getOutputStream());
streamToServer、writeObject((Customer) data);
BufferedReader fromServer = new BufferedReader(
new InputStreamReader(toServer、getInputStream()));
String status = fromServer、readLine();
if (status、equals("登录成功")) {
new ChatRoom((String) data、custName, strServerIp);
this、dispose();
streamToServer、close();
fromServer、close();
toServer、close();
} else {
JOptionPane、showMessageDialog(null, status);
streamToServer、close();
fromServer、close();
toServer、close();
}
} catch (ConnectException e1) {
JOptionPane、showMessageDialog(null, "未能建立到指定服务器的连接!");
} catch (InvalidClassException e2) {
JOptionPane、showMessageDialog(null, "类错误!");
} catch (NotSerializableException e3) {
JOptionPane、showMessageDialog(null, "对象未序列化!");
} catch (IOException e4) {
JOptionPane、showMessageDialog(null, "不能写入到指定服务器!");
}
}
public static void main(String args[]) {
new Login();
} }
Register 、 java
import *; public class Register extends JFrame
implements ActionListener {
private JComboBox comboBox;
private static final long serialVersionUID = 97522180L;
JPanel
pnlRegister;
JLabel
lblUserName,lblGender,lblAge;
JLabel
lblPassword,lblConfirmPass,lblEmail,logoPosition;
JTextField
txtUserName,txtAge,txtEmail;
JPasswordField
pwdUserPassword,pwdConfirmPass;
JRadioButton
rbtnMale,rbtnFemale;
ButtonGroup
btngGender;
JButton
btnOk,btnCancel,btnClear;
String
strServerIp;
final JLabel headLabel = new JLabel();
Dimension scrnsize;
Toolkit toolkit=Toolkit、getDefaultToolkit();
public Register(String ip)
{
super("[HappyChat]聊天室注册窗口");
strServerIp=ip;
pnlRegister=new JPanel();
this、getContentPane()、add(pnlRegister);
lblUserName=new JLabel("用 户 名:");
lblGender=new JLabel("性
别:");
lblAge=new JLabel("年
龄:");
lblPassword=new JLabel("口
令:");
lblConfirmPass=new JLabel("确认口令:");
lblEmail=new JLabel("电子邮件:");
txtUserName=new JTextField(30);
txtEmail=new JTextField(30);
txtAge=new JTextField(10);
pwdUserPassword=new JPasswordField(30);
pwdConfirmPass=new JPasswordField(30);
rbtnMale=new JRadioButton("男",true);
rbtnFemale=new JRadioButton("女");
btngGender=new ButtonGroup();
btnOk=new JButton("确定(O)");
btnOk、setMnemonic("O");
btnOk、setToolTipText("保存注册信息");
btnCancel=new JButton("返回(B)");
btnCancel、setMnemonic("B");
btnCancel、setToolTipText("返回登录窗口");
btnClear=new JButton("清空(L)");
btnClear、setMnemonic("L");
btnClear、setToolTipText("清空注册信息");
pnlRegister、setLayout(null);
pnlRegister、setBackground(new Color(52,130,203));
lblUserName、setBounds(30,80,100,30);
txtUserName、setBounds(110,85,120,20);
lblPassword、setBounds(30,141,100,30);
pwdUserPassword、setBounds(110,146,120,20);
lblConfirmPass、setBounds(30,166,100,30);
pwdConfirmPass、setBounds(110,171,120,20);
lblGender、setBounds(30,191,100,30);
rbtnMale、setBounds(110,196,60,20);
rbtnFemale、setBounds(190,196,60,20);
lblAge、setBounds(30,216,100,30);
txtAge、setBounds(110,221,120,20);
lblEmail、setBounds(30,241,100,30);
txtEmail、setBounds(110,246,120,20);
btnOk、setBounds(246,166,80,25);
btnCancel、setBounds(246,201,80,25);
btnClear、setBounds(246,241,80,25);
Font fontstr=new Font("宋体",Font、PLAIN,12);
lblUserName、setFont(fontstr);
lblGender、setFont(fontstr);
lblPassword、setFont(fontstr);
lblConfirmPass、setFont(fontstr);
lblAge、setFont(fontstr);
lblEmail、setFont(fontstr);
rbtnMale、setFont(fontstr);
rbtnFemale、setFont(fontstr);
txtUserName、setFont(fontstr);
txtEmail、setFont(fontstr);
btnOk、setFont(fontstr);
btnCancel、setFont(fontstr);
btnClear、setFont(fontstr);
lblUserName、setForeground(Color、BLACK);
lblGender、setForeground(Color、BLACK);
lblPassword、setForeground(Color、BLACK);
lblAge、setForeground(Color、BLACK);
lblConfirmPass 、setForeground(Color、BLACK);
lblEmail、setForeground(Color、BLACK);
rbtnMale、setForeground(Color、BLACK);
rbtnFemale、setForeground(Color、BLACK);
rbtnMale、setBackground(Color、white);
rbtnFemale、setBackground(Color、white);
btnOk、setBackground(Color、ORANGE);
btnCancel、setBackground(Color、ORANGE);
btnClear、setBackground(Color、ORANGE);
rbtnMale、setOpaque(false);
rbtnFemale、setOpaque(false);
pnlRegister、add(lblUserName);
pnlRegister、add(lblGender);
pnlRegister、add(lblPassword);
pnlRegister、add(lblConfirmPass);
pnlRegister、add(lblEmail);
pnlRegister、add(lblAge);
pnlRegister、add(txtAge);
pnlRegister、add(txtUserName);
pnlRegister、add(txtEmail);
pnlRegister、add(pwdUserPassword);
pnlRegister、add(pwdConfirmPass);
pnlRegister、add(btnOk);
pnlRegister、add(btnCancel);
pnlRegister、add(btnClear);
pnlRegister、add(rbtnMale);
pnlRegister、add(rbtnFemale);
btngGender、add(rbtnMale);
btngGender、add(rbtnFemale);
Icon logo = new ImageIcon("images\\registerlogo、jpg");
logoPosition = new JLabel(logo);
logoPosition、setBounds(0, 0, 360,78);
pnlRegister、add(logoPosition);
this、setSize(360,313);
this、setVisible(true);
this、setResizable(false);
scrnsize=toolkit、getScreenSize();
this、setLocation(scrnsize、width/2-this、getWidth()/2,
scrnsize、height/2-this、getHeight()/2);
Image img=toolkit、getImage("images\\appico、jpg");
this、setIconImage(img);
btnOk
、addActionListener(this);
btnCancel、addActionListener(this);
btnClear
、addActionListener(this);
final JLabel label = new JLabel();
label、setText("头
像:");
label、setBounds(30, 120, 60, 15);
pnlRegister、add(label);
comboBox = new JComboBox();
comboBox、setAutoscrolls(true);
comboBox、setModel(new DefaultComboBoxModel(new String[] {"1", "2", "3"}));
comboBox、setBounds(110, 116, 47, 23);
comboBox、addItemListener(new ItemListener() {
public void itemStateChanged(ItemEvent arg0) {
Icon logo = new ImageIcon("face\\"+comboBox 、getSelectedItem()、toString()+"、jpg");
headLabel、setIcon(logo);
}
});
pnlRegister、add(comboBox);
headLabel、setHorizontalAlignment(SwingConstants、CENTER);
// 、 setIcon(SwingResourceManager 、 getIcon(Register 、 class, "face/1、jpg"));
headLabel、setIcon(new ImageIcon("face//1、JPG"));
headLabel、setBounds(247, 88, 74, 72);
pnlRegister、add(headLabel);
}
public void actionPerformed(ActionEvent ae)
{
Object source=new Object();
source=ae、getSource();
if (source、equals(btnOk))
{
register();
}
if (source、equals(btnCancel))
{
new Login();
this、dispose();
}
if (source、equals(btnClear))
{
txtUserName、setText("");
pwdUserPassword、setText("");
pwdConfirmPass、setText("");
txtAge、setText("");
txtEmail、setText("");
}
}
@SuppressWarnings({ "deprecation", "static-access" })
public void register()
{
Register_Customer data=new Register_Customer();
data、custName
= txtUserName、getText();
data、custPassword = pwdUserPassword、getText();
data、age
= txtAge、getText();
data、sex
= rbtnMale、isSelected()?"男":"女";
data、email
= txtEmail、getText();
//chenmin
data、head
= comboBox、getSelectedItem()、toString();
if(data、custName、length()==0)
{
JOptionPane、showMessageDialog(null,"用户名不能为空");
return;
}
if(data、custPassword、length()==0)
{
JOptionPane、showMessageDialog(null,"密码不能为空");
return;
}
if(!data、custPassword、equals(pwdConfirmPass、getText()))
{
JOptionPane、showMessageDialog(null,"密码两次输入不一致,请重新输入");
return;
}
if(data、age、length()==0)
{
JOptionPane、showMessageDialog(null,"年龄不能为空");
return;
}
int age=Integer、parseInt(txtAge、getText());
if (age<=0||age>100){
JOptionPane、showMessageDialog(null,"年龄输入不合法");
return;
}
int Found_flag=0;
for (int i=0;i<data、email、length();i++)
{
if(data、email、charAt(i)=="@")
{
Found_flag++;
}
}
if(Found_flag!=1)
{
JOptionPane、showMessageDialog(null,"电子邮箱格式不正确,请重新输入");
return;
}
try
{
Socket toServer;
toServer = new Socket(strServerIp,1001);
ObjectOutputStream streamToServer=new ObjectOutputStream (toServer、getOutputStream());
streamToServer、writeObject((Register_Customer)data);
BufferedReader fromServer=new BufferedReader(new InputStreamReader(toServer、getInputStream()));
String status=fromServer、readLine();
JOptionPane op=new JOptionPane();
op、showMessageDialog(null,status);
if(status、equals(data、custName+"注册成功"))
{
txtUserName、setText("");
pwdUserPassword、setText("");
pwdConfirmPass、setText("");
txtAge、setText("");
txtEmail、setText("");
}
streamToServer、close();
fromServer、close();
}
catch(InvalidClassException e1)
{
JOptionPane、showMessageDialog(null,"类错误!");
}
catch(NotSerializableException e2)
{
JOptionPane、showMessageDialog(null,"对象未序列化!");
}
catch(IOException e3)
{
JOptionPane、showMessageDialog(null,"不能写入到指定服务器!");
}
}
public static void main(String args[])
{
new Register("127、0、0、1");
} }
ChatRoom 、 java
public ChatRoom(String name, String ip) {
// Dialog d = new FontDialog();
strServerIp = ip;
strLoginName = name;
frmChat = new JFrame("聊天室" + "[用户:" + name + "]");
pnlChat = new JPanel();
frmChat、setDefaultCloseOperation(JFrame、EXIT_ON_CLOSE);
frmChat、getContentPane()、add(pnlChat);
Font fntDisp1 = new Font("宋体", Font、PLAIN, 12);
String list[] = { "所有人" };
btnCls = new JButton("清屏(C)");
btnExit = new JButton("退出(X)");
btnSend = new JButton("发送(N)");
btnSave = new JButton("保存(S)");
btnTimer = new JButton("时钟(T)");
lblUserList = new JLabel("【在线用户列表】");
lblUserMessage = new JLabel("【聊天信息】");
lblSendMessage = new JLabel("聊天内容:");
lblChatUser = new JLabel("您对:");
lblUserTotal = new JLabel("在线人数:");
lblCount = new JLabel("0");
lstUserList = new java、awt、List();
txtMessage = new JTextField(170);
cmbUser = new JComboBox(list);
// chenmin
cmbUser、addItemListener(new ItemListener() {
public void itemStateChanged(ItemEvent arg0) {
freshHead();
}
});
chPrivateChat = new JCheckBox("私聊");
taUserMessage = new TextArea("", 300, 200,
TextArea、SCROLLBARS_VERTICAL_ONLY);// 只能向下滚动
// taUserMessage、setText("aaaaaa 汉字 aaaa");
taUserMessage、setForeground(new Color(0, 0, 0));
taUserMessage、setEditable(false); // 不可写入 Clock 、 java
public class Clock extends JFrame implements ActionListener
{
private static final long serialVersionUID = 67908093L;
Timer timer;
int x,y,old_X,old_Y, r,x0,y0,w,h,ang;
int sdo,mdo,hdo,old_M,old_H;
TimeZone tz =TimeZone、getTimeZone("JST");
final double RAD=Math、PI/180、0;
@SuppressWarnings("deprecation") public Clock()
{
super("[HappyChat]时钟");
setSize(300,300);
setBackground(new Color(0,0,192));
setResizable(false);
Dimension scr=Toolkit、getDefaultToolkit()、getScreenSize();
Dimension fra=this、getSize();
if(fra、width>scr、width)
{
fra、width=scr、width;
}
if(fra、height>scr、height)
{
fra、height=scr、height;
}
this、setLocation((scr、width-fra、width)/2,(scr、height-fra、height)/2);
show();
int delay = 1000;
ActionListener taskPerformer = new ActionListener()
{
public void actionPerformed(ActionEvent evt)
{
repaint();
}
};
new Timer(delay, taskPerformer)、start();
}
public void actionPerformed(ActionEvent e)
{
timer、restart();
}
public void paint( Graphics g )
{
Insets insets = getInsets();
int L0 = (insets、left)/2, T0 = (insets、top)/2;
int hh,mm,ss;
String st;
h=getSize()、height;
g、setColor(Color、white);
g、drawOval(L0+30,T0+30,h-60,h-60);
g、drawOval(L0+32,T0+32,h-64,h-64);
r=h/2-30;
x0=30+r-5+L0;
y0=30+r-5-T0;
ang=60;
for (int i=1; i<=12; i++)
{
x=(int)((r+10)*Math、cos(RAD*ang)+x0);
y=(int)((r+10)*Math、sin(RAD*ang)+y0);
g、drawString(""+i,x,h-y);
ang-=30;
}
x0=30+r+L0; y0=30+r+T0;
Calendar now=Calendar、getInstance();
hh=now、get(Calendar、HOUR_OF_DAY);
mm=now、get(Calendar、MINUTE);
ss=now、get(Calendar、SECOND);
g、setColor(Color、pink);
g、fillRect(L0,T0,60,28);
g、setColor(Color、blue);
if (hh < 10) st="0"+hh;
else st=""+hh;
if (mm < 10) st=st+":0"+mm; else st=st+":"+mm;
if (ss < 10) st=st+":0"+ss; else st=st+":"+ss;
g、drawString(st,L0,T0+25);
sdo=90-ss*6;
mdo=90-mm*6;
hdo=90-hh*30-mm/2;
if (old_X > 0)
{
g、setColor(getBackground());
g、drawLine(x0,y0,old_X,(h-old_Y));
} else
{
old_M=mdo;
old_H=hdo;
}
g、setColor(Color、yellow);
x=(int)((r-8)*Math、cos(RAD*sdo)+x0);
y=(int)((r-8)*Math、sin(RAD*sdo)+y0)-2*T0;
g、drawLine(x0,y0,x,(h-y));
old_X=x;
old_Y=y;
if (mdo != old_M)
{
line(g,old_M,(int)(r*0、7),getBackground());
old_M=mdo;
}
if (hdo != old_H)
{
line(g,old_H,(int)(r*0、5),getBackground());
old_H=hdo;
}
line(g,mdo,(int)(r*0、7),Color、green);
line(g,hdo,(int)(r*0、5),Color、red);
}
public void line(Graphics g, int t, int n, Color c)
{
int [] xp = new int[4];
int [] yp = new int[4];
xp[0]=x0;
yp[0]=y0;
xp[1]=
(int)((n-10)*Math、cos(RAD*(t-4))+x0);
yp[1]=h-(int)((n-10)*Math、sin(RAD*(t-4))+y0);
xp[2]=
(int)( n
*Math、cos(RAD* t
)+x0);
yp[2]=h-(int)( n
*Math、sin(RAD* t
)+y0);
xp[3]=
(int)((n-10)*Math、cos(RAD*(t+4))+x0);
yp[3]=h-(int)((n-10)*Math、sin(RAD*(t+4))+y0);
g、setColor(c);
g、fillPolygon(xp,yp,4);
}
public static void main(String args[])
{
new Clock();
}}