当前位置:文档之家› JAVA实训评测报告--聊天室

JAVA实训评测报告--聊天室

JAVA实训评测报告--聊天室
JAVA实训评测报告--聊天室

《Java实训》设计报告

电子信息项目学院

专业:软件技术

班级:1班

实训:聊天室

系统总体设计

1、设计思路

聊天系统的设计跟普通网站设计有着许多不同的地方,普通网站设计所考虑的因素,例如,普通网站需要对布局进入大量美化以及动画设计等等,而聊天室只要提供满足访客双方直接实时聊天即可。因此,在设计聊天系统的过程中,必须要考虑好以下几个设计要点:

在Internet上的聊天程序一般都是以服务器提供服务端连接响应,使用者通过客户端程序登录到服务器,就可以与登录在同一服务器上的用户交谈,这是一个面向连接的通信过程。因此,程序要在TCP/IP环境下,实现服务器端和客户端两部分程序。

1.首先通过继承JFrame类构造服务器界面。

2.设计客户端程序使其能够完成正常的通信功能。

3.设计监听程序,使其显示登录的ip地址端口号,以及用户昵称,通过侦听按钮可以调用客户端程序,实现聊天功能。

2、各个模块详细的功能描述。

1、服务器端功能描述:

启动服务器端。

2、客户端功能描述:

启动客户端;

显示登录昵称:

显示聊天记录:

发送信息;

退出聊天室。

系统详细设计

1、界面设计

主要由类ChatRoom来实现,界面实际总体如下:输入昵称的文本框,输入IP地址的文本框以及输入端口的文本框;连接的按钮;退出按钮;接受消息的文本域;发送消息文本框;发送按钮。项目设计

在设计聊天室时,编写3个Java源文件:Client.java、Frame1.java、ServerThread.java;

分别放在两个包中,一个是client,放Client.java、Frame1.java;一个是server,放ServerThread.java;聊天室除了上述Java源文件所给出的类外,还需要Java系统提供的一些重要类,如JButton,JTextField等。

下面是Java源文件的总体设计。

Client<主类)客户端

Client类负责创建聊天室客户端的主窗口,该类含有main方法,计算器从该类开始执行。

ServerThread<主类)服务器

ServerThread类负责创建聊天室服务器的主窗口,该类含有main方法,计算器从该类开始执行。

二详细代码设计

聊天室程序设计详细代码如下:

客户端代码:

package client。

import javax.swing.UIManager。

publicclass Client {

public Client(>{

Frame1 frame=new Frame1(>。

frame.setVisible(true>。

frame.validate(>。

}

publicstaticvoid main(String[] args>{

try{

UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName(>>。

}catch(Exception e>{

e.printStackTrace(>。

}

new Client(>。

}

}

package client。

import java.awt.*。

import java.awt.event.*。

import javax.swing.*。

import https://www.doczj.com/doc/875554065.html,.*。

import java.io.*。

public class Frame1 extends JFrame implements Runnable{

private JPanel contentPane。

private TextArea textArea1=new TextArea(>。

private Label label1=new Label(>。

private JTextField textField1=new JTextField(>。

private JButton button1=new JButton(>。

private JButton button2=new JButton(>。

private JButton button3=new JButton(>。

Socket socket=null。

BufferedReader in=null。

PrintWriter out=null。

JTextField server=new JTextField(>。

JLabel jLabel1=new JLabel(>。

JLabel jLabel2=new JLabel(>。

JTextField port=new JTextField(>。

JScrollPane jScrollPane1=new JScrollPane(>。

JList jList1=new JList(>。

JLabel jLabel3=new JLabel(>。

DefaultListModel l1=new DefaultListModel(>。

public Frame1(>{

try{

init(>。

}catch(Exception e>{

e.printStackTrace(>。

}

}

private void init(> throws Exception{

server.setText(InetAddress.getLocalHost(>.getHostAddress(>>。

server.setBounds(new Rectangle(69,252,74,22>>。

contentPane=(JPanel>this.getContentPane(>。

textArea1.setEditable(false>。

textArea1.setFont(new java.awt.Font("Dialog",Font.PLAIN,14>>。textArea1.setBounds(new Rectangle(11,9,383,199>>。

textArea1.setBackground(new Color(66,00,233>>。

textArea1.setForeground(new Color(255,00,00>>。

contentPane.setLayout(null>。

this.setSize(new Dimension(506,314>>。

this.setTitle("客户端">。

label1.setFont(new java.awt.Font("Dialog",Font.PLAIN,12>>。label1.setForeground(new Color(110,110,250>>。

label1.setText("消息:">。

label1.setBounds(new Rectangle(26,213,32,27>>。

button1.setActionCommand("发送">。

button1.setBounds(new Rectangle(334,216,62,23>>。

button1.setEnabled(false>。

button1.setFont(new java.awt.Font("Dialog",Font.PLAIN,12>>。button1.setText("发送">。

button1.setForeground(new Color(110,110,250>>。

button1.addActionListener(new java.awt.event.ActionListener(>{ public void actionPerformed(ActionEvent e>{

button1_actionPerformed(e>。

}

}>。

button2.setBounds(new Rectangle(266,251,58,24>>。

button2.setFont(new java.awt.Font("Dialog",Font.PLAIN,12>>。button2.setText("连接">。

button2.setForeground(new Color(110,110,250>>。

button2.addActionListener(new java.awt.event.ActionListener(>{ public void actionPerformed(ActionEvent e>{

button2_actionPerformed(e>。

}

}>。

button3.setBounds(new Rectangle(333,251,62,22>>。

button3.setFont(new java.awt.Font("Dialog",Font.PLAIN,12>>。

button3.setText("退出">。

button3.setForeground(new Color(110,110,250>>。

button3.addActionListener(new java.awt.event.ActionListener(>{ public void actionPerformed(ActionEvent e>{

button3_actionPerformed(e>。

}

}>。

jLabel1.setFont(new java.awt.Font("Dialog",Font.PLAIN,12>>。

jLabel1.setToolTipText("">。

jLabel1.setHorizontalAlignment(SwingConstants.RIGHT>。

jLabel1.setHorizontalTextPosition(SwingConstants.RIGHT>。

jLabel1.setText("服务器:">。

jLabel1.setForeground(new Color(110,110,250>>。

jLabel1.setBounds(new Rectangle(11,254,58,20>>。

jLabel2.setFont(new java.awt.Font("Dialog",Font.PLAIN,12>>。

jLabel2.setToolTipText("">。

jLabel2.setHorizontalAlignment(SwingConstants.RIGHT>。

jLabel2.setHorizontalTextPosition(SwingConstants.RIGHT>。

jLabel2.setText("端口:">。

jLabel2.setForeground(new Color(110,110,250>>。

jLabel2.setBounds(new Rectangle(172,253,27,18>>。

port.setText("8000">。

port.setBounds(new Rectangle(202,251,40,22>>。

jList1.setFont(new java.awt.Font("Dialog",Font.PLAIN,12>>。

jLabel3.setBounds(new Rectangle(406,254,91,21>>。

jLabel3.setForeground(new Color(110,110,250>>。

textField1.setBounds(new Rectangle(58,215,271,24>>。

jScrollPane1.setBounds(new Rectangle(404,14,94,226>>。

jScrollPane1.getViewport(>.add(jList1>。

contentPane.add(button3,null>。

contentPane.add(button2,null>。

contentPane.add(button1,null>。

contentPane.add(server,null>。

contentPane.add(jLabel1,null>。

contentPane.add(textField1,null>。

contentPane.add(textArea1,null>。

contentPane.add(jLabel2,null>。

contentPane.add(port,null>。

contentPane.add(label1,null>。

contentPane.add(jScrollPane1,null>。

contentPane.add(jLabel3,null>。

jList1.setModel(l1>。

}

void button1_actionPerformed(ActionEvent e>{

out.println(jLabel3.getText(>+"对"+l1.getElementAt(jList1.getSelectedIndex(>>+"说:"+textField1.getText(>>。

out.flush(>。

textField1.setText("">。

}

void button3_actionPerformed(ActionEvent e>{

try{

out.println("大家尽情聊,再见!">。

out.flush(>。

}catch(Exception e2>{}

finally{

System.exit(0>。

}

}

void button2_actionPerformed(ActionEvent e>{

Thread thread=new Thread(this>。

thread.start(>。

}

public void run(>{

try{

socket=new Socket(server.getText(>,Integer.parseInt(port.getText(>>>。

in=new BufferedReader(new InputStreamReader(socket.getInputStream(>>>。

out=new PrintWriter(socket.getOutputStream(>>。

button1.setEnabled(true>。

receiver r=new receiver(>。

Thread t=new Thread(r>。

t.start(>。

textArea1.append("欢迎加入聊天室\n">。

// button2.setEnabled(false>。

} catch(Exception e>{

textArea1.append("连接失败!请确认服务器地址并且服务器已启动\n">。

}

}

private class receiver implements Runnable{

public void run(>{

String s1=null。

try{

s1=in.readLine(>。

while(s1!=null>{

if(s1.equals("Clear users!">>{

l1.removeAllElements(>。

l1.addElement("大家">。

jList1.setSelectedIndex(0>。

}else if(jLabel3.getText(>.equals("">>{

jLabel3.setText(s1>。

}else

if(s1.length(><8&&!jLabel3.getText(>.equals(s1>>{

l1.addElement(s1>。

}else if(!jLabel3.getText(>.equals(s1>>{

textArea1.append(s1+"\n">。

}

s1=in.readLine(>。

}

in.close(>。

out.close(>。

socket.close(>。

}catch(Exception e>{}

button1.setEnabled(false>。

}

}

}

服务器端代码:

package server。

import https://www.doczj.com/doc/875554065.html,.*。

import java.io.*。

public class ServerThread implements Runnable{

ServerSocket server=null。

BufferedReader in=null。

PrintWriter out=null。

InetAddress myServer=null。

Object users[]=new Object[1000]。

static int userCount=0。

public ServerThread(>{

try{

init(>。

}catch(Exception e>{

e.printStackTrace(>。

}

}

private void init(> throws Exception{

Thread thread=new Thread(this>。

thread.start(>。

}

public void run(>{

try{

server=new ServerSocket(8000>。

Socket socket。

while(true>{

socket=server.accept(>。

if(socket!=null>{

users[userCount]=socket。

Receiver r=new Receiver(socket,userCount>。

Thread t=new Thread(r>。

t.start(>。

userCount++。

}

}

}catch(Exception e>{

e.printStackTrace(>。

}

}

private class Receiver implements Runnable{

Socket socket。

int user。

Receiver(Socket socket,int user>{

this.socket=socket。

https://www.doczj.com/doc/875554065.html,er=user。

}

public void run(>{

BufferedReader in=null。

PrintWriter out=null。

String s1=null。

int userNo。

try{

out=new PrintWriter(socket.getOutputStream(>>。

out.println("user"+user>。

out.flush(>。

for(int j=0。j{

if(users[j]==null>

continue。

out=new

PrintWriter(((Socket>users[j]>.getOutputStream(>>。

out.println("Clear users!">。

out.flush(>。

for(int k=0。k{

out.println("user"+k>。

out.flush(>。

}

}

in=new BufferedReader(new

InputStreamReader(socket.getInputStream(>>>。

s1=in.readLine(>。

while(!s1.equals("大家尽情聊,再见!">>{

int temp=s1.indexOf("对">。

int temp1=s1.indexOf("说">。

String temps=s1.substring(temp+1,temp1>。

if(temps.equals("大家">>{

for(int j=0。j{

if(users[j]==null>

continue。

out=new

PrintWriter(((Socket>users[j]>.getOutputStream(>>。

out.println(s1>。

out.flush(>。

}

}else{

try{

userNo=Integer.parseInt(temps.substring(4>>。

out=new

PrintWriter(((Socket>users[userNo]>.getOutputStream(>>。

out.println(s1>。

out.flush(>。

}catch(Exception e>{}

}

s1=in.readLine(>。

}

System.out.print("User go">。

in.close(>。

out.close(>。

socket.close(>。

}catch(Exception e>{}

}

}

public static void main(String[]args>{

new ServerThread(>。

}

}

运行结果

1、连接服务器

小结

这次设计经过长期的不懈努力,程序基本满足聊天的需要。完成后的程序实现了用户登陆聊天室、用户在线聊天、用户退出等功能。

程序设计期间,通过询问老师,同学和网上搜索相关解答等多种方式学习到很多课堂上没有的知识,还积累了一定的实践经验,增强了动手能力和解决实际问题的能力。在此之前,对于Java 编程技术或网络socket编程知识都只是略知皮毛,缺乏深入的认识,对其工作方式和原理缺乏透彻的认识。在这段时间里,我认真学习了Java语言开发,Applet小程序实现,对编程思想有了进一步的体会,养成了一些良好的编程习惯。程序虽然完成,但是距离优秀仍存在一定差距,用JAVA开发大型项目还有很多我需要去努力学习的知识。希望自己能不断学习和实践,争取以后做得更好。

相关主题
文本预览
相关文档 最新文档