JAVA大作业.docx
《JAVA大作业.docx》由会员分享,可在线阅读,更多相关《JAVA大作业.docx(20页珍藏版)》请在冰豆网上搜索。
JAVA大作业
商务学院
课程论文
题目:
JAVA期末大作业
姓 名:
王姗
学 号:
2007030331205
学院:
商务学院
专业:
信息管理与信息系统
指导教师:
沈桂兰
2010年12月7日
JAVA期末大作业
一、系统的功能介绍
本系统是一个聊天室系统分为服务端与客户端,服务端有发送和退出功能,客户端有连接、发送、退出功能,客户端可以通过连接与服务端连接上,向服务端发送数据,服务端可以通过客户端的连接,接受客户端发送的数据,也可以向客户端发送数据。
且本系统与数据库进行连接,数据库记载了聊天记录和所有登录用户端信息。
二、界面的设计截图
(一)服务器
(二)客户端
三、核心代码说明
(一)ClientWindow的代码
packagews;
importjava.awt.*;
importjavax.swing.*;
importjava.io.*;
import.*;
publicclassClientWindowextendsThread
{
staticClientFramemyWindow=newClientFrame("聊天室:
客户");
publicstaticvoidmain(Stringargs[])
{
myWindow.setBounds(50,100,400,300);
myWindow.setVisible(true);
Threadreceiver=newServerWindow();
receiver.setDaemon(true);//后台程序
receiver.start();//创建并启动接收线程
}
publicvoidrun()//接收信息线程
{
booleandone=true;
while(done)
{
//接收信息
//如不为空,则在输出文本区显示
//否则,done=false;
try
{
Stringstr=myWindow.in.readLine();//接收服务器信息
if(str!
=null)
myWindow.showText("服务器:
"+str);
}
catch(IOExceptione)
{
System.out.println("连接断开!
");
done=false;
}
}
}
}
(二)ClientFrame的代码
packagews;
importjava.awt.*;
importjavax.swing.*;
importjava.awt.event.*;
importjava.io.*;
import.*;
importjavax.swing.border.*;
publicclassClientFrameextendsJFrame//创建JFrame的子类
{
publicSocketsocket=null;//连接时获取的socket放在这里
publicBufferedReaderin=null;//从这里读入数据
publicPrintWriterout=null;//从这里输出数据
publicbooleanconnectFlag=false;//当建立连接时,该标志为true
privateContainercontent=getContentPane();
privateJTextAreatext=newJTextArea(30,100);//生成输出文本组件
privateJTextAreakeyIn=newJTextArea(30,100);//生成输入文本组件
publicstaticfinalintCONNECT=001;//按钮标示号
publicstaticfinalintSEND=002;
publicstaticfinalintQUIT=003;
publicClientFrame(Stringtitle)//构造方法
{
super(title);//调用JFrame的构造方法
setDefaultCloseOperation(EXIT_ON_CLOSE);
Boxroom=Box.createVerticalBox();//创建聊天室
text.setEditable(false);
text.setLineWrap(true);
JScrollPanescrollText=newJScrollPane(text);//加滚动条
scrollText.setAutoscrolls(true);
scrollText.setPreferredSize(newDimension(400,1000));
room.add(scrollText);
keyIn.setLineWrap(true);
JScrollPanescrollKey=newJScrollPane(keyIn);//加滚动条
scrollKey.setAutoscrolls(true);
room.add(scrollKey);
JPanelcontrol=newJPanel();//创建控制面板
Dimensionsize=newDimension(80,20);
Borderborder=BorderFactory.createRaisedBevelBorder();
JButtonconnect=newJButton("连接");
JButtonsend=newJButton("发送");
JButtonquit=newJButton("退出");
connect.setBorder(border);
send.setBorder(border);
quit.setBorder(border);
connect.setPreferredSize(size);
send.setPreferredSize(size);
quit.setPreferredSize(size);
connect.addActionListener(newControlAction(CONNECT));
send.addActionListener(newControlAction(SEND));
quit.addActionListener(newControlAction(QUIT));
control.add(connect);
control.add(send);
control.add(quit);
room.add(control);
content.add(room,BorderLayout.CENTER);
}
publicvoidshowText(Stringstr)//在输出文本区显示文本
{
text.append(str+"\n");
}
classControlActionimplementsActionListener//按钮事件处理
{
intcontrolType=CONNECT;
publicControlAction(inttype)
{
controlType=type;
}
publicvoidactionPerformed(ActionEvente)
{
switch(controlType)
{
caseCONNECT:
//按了连接键
if(!
connectFlag)
{
try{
socket=newSocket("192.168.1.85",8189);//与服务器建立连接
connectFlag=true;
in=
newBufferedReader(
newInputStreamReader(socket.getInputStream()));//输入数据流//创建并启动接收线程
out=
newPrintWriter(socket.getOutputStream(),true);//输出数据流
//booleandone=true;
}
catch(IOExceptionie)
{
System.out.println("连接断开!
");
connectFlag=true;
}
}
break;
caseSEND:
//按了发送键
if(connectFlag)
{
StringkeyText=keyIn.getText();
//在输出文本区显示输入的文本
showText("客户:
"+keyText);//发送键入的文本
keyIn.setText("");
out.println(keyText);//将输入文本发送给服务器
}
break;
caseQUIT:
//按了退出键
connectFlag=false;
try
{
out.println("QUIT");
out.close();
in.close();
System.exit
(1);
socket.close();
}
catch(IOExceptionioe)
{
}
}
}
}
}
(三)ServerWindow的代码
packagews;
importjava.awt.*;
importjavax.swing.*;
importjava.io.*;
import.*;
publicclassServerWindowextendsThread
{
publicstaticServerFramemyWindow=newServerFrame("聊天室:
服务器");
publicstaticServerSocketserverSocket=null;
publicstaticvoidmain(Stringargs[])
{
myWindow.setBounds(500,100,400,300);
myWindow.setVisible(true);
myWindow.showText("等待连接....");
try
{
ServerSocketserverSocket=newServerSocket(8189);//建立服务器socket,port=8189
Socketincoming=serverSocket.accept();//等待客户建立连接
myWindow.connectFlag=true;
myWindow.in=
newBufferedReader(
newInputStreamReader(incoming.getInputStream()));//输入数据流
myWindow.out=
newPrintWriter(incoming.getOutputStream(),true);//输出数据流*/
myWindow.showText("连接建立!
");
myWindow.out.println("连接建立!
请发送信息,输入BYE结束\n");//向客户发登录信息
Threadreceiver=newServerWindow();
receiver.setDaemon(true);//后台程序
receiver.start();//创建并启动接收线程
}
catch(IOExceptione)
{
myWindow.showText(""+e);
}
}
publicvoidrun()//接收信息线程
{
booleandone=true;
while(done)
{
//接收信息
//如不为空,则在输出文本区显示
//否则,done=false;
try
{
Stringstr=myWindow.in.readLine();//接收服务器信息
if(str!
=null)
myWindow.showText("客户:
"+str);
}
catch(IOExceptionie)
{
System.out.println("连接断开!
");
done=false;
}
}
}
}
(四)ServerFrame的代码
packagews;
importjava.awt.*;
importjavax.swing.*;
importjava.awt.event.*;
importjava.io.*;
import.*;
importjavax.swing.border.*;
publicclassServerFrameextendsJFrame//创建JFrame的子类
{
publicSocketsocket=null;//连接时获取的socket放在这里
publicBufferedReaderin=null;//从这里读入数据
publicPrintWriterout=null;//从这里输出数据
publicbooleanconnectFlag=false;//当建立连接时,该标志为true
publicstaticServerSocketserverSocket=null;
privateContainercontent=getContentPane();
privateJTextAreatext=newJTextArea(30,100);//生成输出文本组件
privateJTextAreakeyIn=newJTextArea(30,100);//生成输入文本组件
publicstaticfinalintCONNECT=001;
publicstaticfinalintSEND=002;
publicstaticfinalintQUIT=003;
publicServerFrame(Stringtitle)//构造方法
{
super(title);//调用JFrame的构造方法
setDefaultCloseOperation(EXIT_ON_CLOSE);
Boxroom=Box.createVerticalBox();
text.setEditable(false);
text.setLineWrap(true);
JScrollPanescrollText=newJScrollPane(text);//加滚动条
scrollText.setAutoscrolls(true);
scrollText.setPreferredSize(newDimension(400,1000));
room.add(scrollText);
keyIn.setLineWrap(true);
JScrollPanescrollKey=newJScrollPane(keyIn);//加滚动条
scrollKey.setAutoscrolls(true);
room.add(scrollKey);
JPanelcontrol=newJPanel();
Dimensionsize=newDimension(80,20);
Borderborder=BorderFactory.createRaisedBevelBorder();
JButtonconnect=newJButton("连接");
JButtonsend=newJButton("发送");
JButtonquit=newJButton("退出");
connect.setBorder(border);
send.setBorder(border);
quit.setBorder(border);
connect.setPreferredSize(size);
send.setPreferredSize(size);
quit.setPreferredSize(size);
//connect.addActionListener(newControlAction(CONNECT));
send.addActionListener(newControlAction(SEND));
quit.addActionListener(newControlAction(QUIT));
//control.add(connect);
control.add(send);
control.add(quit);
room.add(control);
content.add(room,BorderLayout.CENTER);
}
publicvoidshowText(Stringstr)
{
text.append(str+"\n");
}
classControlActionimplementsActionListener//按钮事件处理
{
intcontrolType=CONNECT;
publicControlAction(inttype)
{
controlType=type;
}
publicvoidactionPerformed(ActionEvente)
{
switch(controlType)
{
caseSEND:
//按了发送按钮
if(connectFlag)
{
StringkeyText=keyIn.getText();
//在输出文本区显示输入的文本
showText("服务器:
"+keyText);
//发送键入的文本
keyIn.setText("");
out.println(keyText);
//将输入文本发送给服务器
}
break;
caseQUIT:
//按了退出按钮
connectFlag=false;
try
{
out.println("QUIT");
out.close();
in.close();
System.exit
(1);
}
catch(IOExceptionioe)
{
System.out.println("QuitError!
!
");
}
}
}
}
}
四、涉及到的知识点的说明
窗体(Frame)――容器(Container)――(设置容器布局)――面板(Panel)――(设置面板布局)――控件、
1窗体
在Java程序中,我们如果想创建并运行一个窗体,就必须让我们编写的类继承自JFrame类,而使用JFrame类之前必须导入java.awt.*和java.swing.*如:
publicclassClientWindowextendsThread
{
staticClientFramemyWindow=newClientFrame("聊天室:
客户");
publicstaticvoidmain(Stringargs[])
{
myWindow.setBounds(50,100,400,300);
myWindow.setVisible(true);
Threadreceiver=newServerWindow();
receiver.setDaemon(true);//后台程序
receiver.start();//创建并启动接收线程
}
publicvoidrun()//接收信息线程
{
booleandone=true;
while(done)
{
//接收信息
//如不为空,则在输出文本区显示
//否则,done=false;
try
{
Stringstr=myWindow.in.readLine();//接收服务器信息
if(str!
=null)
myWindow.showText("服务器:
"+str);
}
catch(IOExceptione)
{
System.out.println("连接断开!
");
done=false;
}
}
}
}
2窗体中的Container
如果我们要往空白的窗体中加入其它东西,我们首先需要一个Container(容器)为基础,就像在一个中空的架子上搭了一块木板,然后我们就可以在板子上放我们想放的东西。
我们可以在构造函数中加入
3面板
面板(Panel)是包含在窗口中盛放控件的中间级别的容器。
它将被Container对象包容。
我们用它来归纳各种各样的控件,就像我们平常放置小东西用的带有格子的抽屉。
4加载控件
控件类包括JTextField、JLabel、JButton等等。
声明您想加入窗体的控件,并调用面板对象的add()方法把控件放入面板。
5界面设计
使了BroderLayout时,放在CENTER部位的控件会尽可能的得到窗体的空间。
而其他位置的控件会尽可能地变小(长)。