《面向对象程序的设计课程设计》由会员分享,可在线阅读,更多相关《面向对象程序的设计课程设计(39页珍藏版)》请在金锄头文库上搜索。
1、课 程 设 计 报 告课程名称:面向对象程序设计课程设计任课教师:尹剑伟设计题目:网络聊天室所学专业:信息管理与信息系统(二年制)班级学号:0916150320学生姓名:黄萌萌报告完成日期: 2016 年 01 月 10日一、题目描述及功能要求实现的是局域网中的聊天功能,运行服务程序后,服务器创建成功,然后使服务器对某一个设定的端口处于监听状态,当有客户端请求建立连接时,服务器就可接受请求,建立连接!这样服务器和客户端就可相互发送消息,实现聊天功能!1服务端主要功能:l 服务端等待多客户连接(守护进程)。l 服务端与客户端建立连接。l 服务端与客户端交互信息。l 服务端与客户端断开连接。l 服
2、务端更新客户列表。2客户端主要功能:l 客户端登录。l 客户端与服务端建立连接。l 客户端与服务端交互信息。l 客户端与服务端断开连接。l 客户端更新客户列表。二、系统设计1功能设计启动客户端主界面聊天下线按钮输入界面清屏按钮发送按钮图1 聊天室功能结构图2界面设计图2 聊天窗口界面3技术原理网络连接: 方法:TCP/IP协议叫做传输控制/网际协议,它是Internet国际互联网络的基础。 TCP/IP是网络中使用的基本的通信协议。 虽然从名字上看TCP/IP包括两个协议,传输控制协议(TCP)和网际协议(IP),但TCP/IP实际上是一组协议,它包括上百个各种功能的协议,如:远程登录、文件传
3、输和电子邮件等,而TCP协议和IP协议是保证数据完整传输的两个基本的重要协议。通常说TCP/IP是Internet协议族,而不单单是TCP和IP。 介绍方法:客户端步骤: 1.创建Socket。根据指定的IP地址或端口号构造Socket类对象。如服务器端响应,则建立客户端到服务器的通信线路。 2.打开连接到Socket的输入/出流。使用getInputStream()方法获得输入流,使用getOutputStream()方法获得输出流。 3.按照一定的协议对Socket进行读/写操作。通过输入流读取服务器放入线路的信息(但不能读取自己放入线路的信息),通过输出流将信息写入线程。 4.关闭Soc
4、ket。断开客户端到服务器的连接,释放线路 。服务器端步骤: 1.创建ServerSocket。 2.使用accept()产生一个Socket用于与客户端Socket通信。多线程: 方法一:继承Thread类 建立thread的子类,并覆盖run()方法(thread实现了Runnable接口)对象.start(); /开始线程方法二:实现Runnable接口(常用)建立一个类实现Runnable接口,完成run()方法Runnable p = new 类名();Thread t = new Thread(p);t.start(); /开始线程4类说明 XX类静态属性int PORT=8000
5、端口号为8000Int count=3面板上的按钮为3个实例属性Lable lableTitle标签静态方法Piblic static void main主方法实例方法void send(String)向服务端发送信息。Public void run()实现线程Public void inList列表5难点及其解决方法(1)如何使服务器端保留并区别与客户端的socket连接?与N个客户端相连的话;服务器都有一个对应的socket;也就是N个 。为什么TCP的C/S应用中,服务器程序要先于客户端程序执行 因为客户端要连接服务器之前先要知道服务器的IP地址和端口号 而且这个端口号是处于监听状态的.
6、(2) 如何使客户端更新列表信息?一、服务器端写一个WEBSERVICE的回调方法,在客户端调用,只接返回服务器所更新的列表就行了。二、在客户端用一个文件存,并指定时间将文件以XML格式发送给服务器端保持更新。三、系统实现1源代码见附件。客户端 ChatClient.javaimport javax.swing.*;import java.awt.*;import java.awt.event.*;import java.io.*;import .*;public class ChatClient extends JFrame implements ActionListenerJTextAre
7、a getArea =new JTextArea(收发信息:n);JLabel gLabel=new JLabel(请输入:);JTextArea sendArea =new JTextArea();JButton clickButton = new JButton(发送);JButton clickButton1 = new JButton(下线);JButton clickButton2 = new JButton(清屏);JMenuBar jmb = new JMenuBar();JMenu fontMenu = new JMenu(字体);JMenuItem colorMenu = n
8、ew JMenu(颜色);JMenuItem redMenuItem=new JMenuItem(红色);JMenuItem blueMenuItem=new JMenuItem(蓝色);JMenuItem greenMenuItem=new JMenuItem(绿色);JMenuItem blackMenuItem=new JMenuItem(黑色);JTextArea textDemo=new JTextArea();Socket s = null;boolean bConnected = false;BufferedReader in = null;PrintWriter out = n
9、ull;String msg;public ChatClient()super(客户端); this.setSize(410,385); this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); Container container = getContentPane(); container.setLayout(null); /创建并向框架添加多行文本 container.add(getArea); getArea.setBounds(0,0,390,200); container.add(gLabel); gLabel.setBounds(0
10、,202,150,20); container.add(sendArea); sendArea.setBounds(0,222,390,50); container.add(clickButton); container.add(clickButton1); container.add(clickButton2); clickButton.setBounds(300,270,70,50); clickButton1.setBounds(180,270,70,50); clickButton2.setBounds(60,270,70,50); clickButton.addActionListe
11、ner(this); setJMenuBar(jmb); jmb.add(fontMenu); fontMenu.add(colorMenu); fontMenu.addSeparator(); colorMenu.add(redMenuItem); colorMenu.add(blueMenuItem); colorMenu.add(greenMenuItem); colorMenu.add(blackMenuItem); getContentPane().add(textDemo); redMenuItem.addActionListener(this); blueMenuItem.add
12、ActionListener(this); greenMenuItem.addActionListener(this); blackMenuItem.addActionListener(this);public static void main(String args) throws IOExceptionChatClient test = new ChatClient();test.setVisible(true);test.start();public void start() throws IOExceptionconnect();new Thread(new RecvThread().
13、start();while(true)out.flush();if(msg.equalsIgnoreCase(exit) break;disconnect();public void actionPerformed(ActionEvent e) if(e.getSource() instanceof JButton) msg=sendArea.getText(); out.println(msg);/向服务器发送数据 sendArea.setText(); if (e.getActionCommand().equals(红色) getArea.setForeground(Color.red); if (e.getActionCommand().equals(蓝色) getArea.setForeground(Color.blue); if (e.getActionCommand().equals(绿色) getArea.setForeground(Color.green); if (e.getActionCommand().equals(黑色) getArea.se