王茜的信息技术系综合实训报告
计算机科学与技术专业
综合实训报告 2013 — 2014 学年第 3 学期
实训名称: c/s程序开发模拟实习 姓 名: 王茜
学 号: 2012911227
所在系别: 信息技术系
所在专业: 计算机科学与技术
所在班级: 计算机科学与技术本科2班 起止日期:
实训题目 c/s程序开发模拟实习
1.1实训目的(不少于200字)
在当今信息时代,越来越多的聊天工具被应用,java语言是当今流行的网络编程语言,它具有面向对象,与平台无关,安全,多线程等特点。使用java语言不仅可以实现大型企业级的分布式应用系统,还能够为小型的的,嵌入式设备进行应用程序的开发。面向对象的开发是当今世界最流行的开发方法,它不仅具有更贴近自然地语义,而且有利于软件的维护和继承,锻炼我们熟练地应用面向对象的思想和设计方法解决实际问题的能力。此次设计的题目为聊天室,可以巩固所学的java语言基础知识,增进java语言的编辑基本功,拓宽常用类库的应用,使我们通过教学环节与手段,把所学的课程及相关知识加以融会贯通,全面掌握java语言的编程思想及面向对象程序设计的方法,为今后从事实际工作打下坚实的基础
1.2实训过程
1.2.1基本概念(不少于500字)
运用java程序编写聊天室,实现简单的聊天功能。它是图形界面,线程,流与文件系统等技术的综合应用。其界面主要采用了java.awt包,java.swing包等。程序实现了聊天室的基本功能,其中有:
1.启动服务器。
2启动登陆界面。
3.进入客户端界面。
4.发送信息。
5.离开客户端界面。
6.关闭服务器。
概要设计:
1.首先通过继承JFrame类构造服务器界面。使服务器能够为每一个客户启动
一个线程,记录客户的上下线行为、登陆的ip,放送消息的时刻,监视客户的聊天记录。对于出现不文明的话语,在客户端进行屏蔽,并统计出现不文明话语的次数,超过三次提示警告信息,并将其踢出聊天室。(初步设想,还没实现)
2.设计客户端程序使其能够完成正常的通信功能,并且可以更改背景颜色,设置字体颜色。
3.设计登录程序,使其显示登录的ip地址端口号,以及用户昵称,通过登录按钮可以调用客户端程序,实现聊天功能。
相关知识:
程序中引入的包:
import java.net.*;
import java.io.*;
import java.util.*;
import java.awt.event.*;
import java.awt.*;
import javax.swing.*;
服务器端代码中用户自定义的类:
类名;server
作用:服务器的启动
继承的类:JFrame构造服务器界面。
定义的对象:TextArea 文本域
java.awt.List 在线客户列表
ServerSocket 服务器
Socket 客户端
主要的成员方法:void init() 构造服务器端的界面
public void actionPerformed(ActionEvent e) 按钮监听器
public void keyPressed(KeyEvent e) 键盘监听器
类名:start 作用: 启动服务器的线程 继承的类名:thread 主要的成员方法: public void run() 启动服务器的线程
类名;SgService
继承的类名:thread
主要的成员方法:public void run() 处理单个客户的线程
(2)用户登录相关的类:类名:login
作用:构造登录界面继承的类:JFrame
实现的接口ActionListener 构造方法 public Login()
主要的成员方法:public void actionPerformed(ActionEvent e)
实现
(3)客户端相关的类类名:Client
继承的类:JFrame
构造方法:public Client(PrintStream out,BufferedReader in,String name) 主要的成员方法:public void receive()接受服务端发来的信息
1.2.2实训步骤
1.软硬件环境准备(不少于100字以内)
平台是程序运行的硬件或软件环境。大多数平台可以被描述为操作系统和硬件的组合。Java平台与大多数其他平台的不同之处在于,它是一种运行在其他硬件平台上的纯软件平台。Java虚拟机和Java应用程序编程接口是Java平台的两个重要组件。
在编写Java程序之前,要首先安装J2SDK,其次还要进行相应的环境变量的设置,主要包括环境变量path和classpath的设置。
安装J2SDK的具体操作步骤如下:
一、到网站上下载两个文件:jdk-1_5_0_11-windows-i586-p.exe文件和jdk-1_5_0-doc.zip文件。
二、运行jdk-1_5_0_11-windows-i586-p.exe文件,把jdk安装到C:\j2sdk1.5.0目录下。安装完成之后,双击jdk-1_5_0-doc.zip文件,WINRAR压缩软件会自动把所有文件展开到C:\j2sdk1.5.0\docs目录中。
2.实现过程(不少于1000)
创建一个简单的聊天室 :
客户端:package com.hnnd.wangxi;
import java.awt.*;
import javax.swing.*;
import java.awt.event.*;
import java.net.*;
import java.io.*;
public class Client extends JFrame implements ActionListener, ItemListener {
Socket s;
JButton connectbutton = new JButton(
JButton sendbutton = new JButton(
List list = new List(); // 列表框
JTextField content = new JTextField(20); // 文本框
JTextField servername = new JTextField(
JLabel label = new JLabel(
JComboBox jc = new JComboBox(); // 下拉列表
String ren;
static int id=0;
public Client() {
this.setTitle(
p2.add(sendbutton); p3.setLayout(new BorderLayout()); // 设置p3的布局为BorderLayout
p3.add(list);// 添加列表框到中央
p3.add(
// 面板1加到窗体的南边,面板3加到窗体的中央
this.add(BorderLayout.SOUTH, p1);// 框架
BorderLayout
this.add(
// 注册监听器
connectbutton.addActionListener(this);
sendbutton.addActionListener(this);
jc.addItemListener(this);
jc.addItem(
jc.addItem(
}
jc.addItem(
public static void main(String[] args) {
}
Client c = new Client(); c.setVisible(true); Client c1 = new Client(); c1.setVisible(true); Client c2 = new Client(); c2.setVisible(true);
@Override
public void actionPerformed(ActionEvent e) {
称
器名
可用
try { s = new Socket(fuwuqi, 9009);// 连接服务器,生成 servername.setText(
PrintWriter pw = new PrintWriter(s.getOutputStream(), true);
pw.println(
CliIn(s,list,this.getTitle())).start();//开启线程接收服务器发回的消息
可用
可用
} } catch (IOException e1) { System.out.println(
} } else { // 点击发送按钮 String msg = content.getText(); try {
PrintWriter pw = new PrintWriter(s.getOutputStream(), true);
if(
pw.println(
pw.println(ren+
}
list.add(
/*BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(
s.getOutputStream())); bw.write(msg); bw.newLine(); bw.flush();*/ } catch (IOException ee) { System.out.println(
示
}
} //list.add(content.getText());// 将发送的内容在列表框中显 } content.setText(
@Override
public void itemStateChanged(ItemEvent e) {// 下拉列表框中选中某个人
}
}
class CliIn implements Runnable { ren = (String) jc.getSelectedItem();
Socket s;
List list;
String user;
public CliIn(Socket s,List l,String u) {
this.s = s;
this.list=l;
this.user=u;
}
@Override
public void run() {
// 接收来自的消息,并在控制台打印输出
try {
BufferedReader br = new
InputStreamReader(s
.getInputStream()));
while (true) { BufferedReader(new
String str = br.readLine();//login-0 System.out.println(
} } else if(user.equals(temp[0])){ } //list.add(str); list.add(temp[1]+
}
} }catch (SocketException ee) { } catch (IOException e) { } e.printStackTrace(); System.out.println(
服务端:
package com.hnnd.wangxi;
import java.util.*;
import java.io.*;
import java.net.*;
public class Server {
public static void main(String[] args) {
ServerSocket ss = null; try { ss = new ServerSocket(9009);// 生成服务器端Socket,监听9000端口
} try { Vector v=new Vector(); while (true) { Socket s = ss.accept();// 等待客户端连接如连接生成int num = 0; System.out.println(
String yonghu = num +
num++; System.out.println(yonghu +
PrintWriter pw = new PrintWriter(((Socket) v.get(i)).getOutputStream(), true);
的消息
} ServerThread st = new ServerThread(s, yonghu, v); new Thread(st).start(); }*/ // 为每一个客户端开启一个线程以接收客户端发送过来pw.println(yonghu +
}
}
class ServerThread implements Runnable {
Socket s;
Vector all;
//Hashtable ht;
String yonghu;
public ServerThread(Socket s, String yonghu,Vector v) { } catch (IOException e) { } System.out.println(
}
this.s = s; this.yonghu = yonghu; this.all=v; //this.ht = ht;
@Override
public void run() {
// 接收来自客户端的消息,并在控制台打印输出 try { BufferedReader br = new BufferedReader(new InputStreamReader(s
while (true) { String str=br.readLine(); System.out.println(str);//接收客户端发送过来的消息并 .getInputStream())); 打印:接收者-发送者—发送的内容(发送过程)
//System.out.println(yonghu +
for (int i = 0; i
// 发回给客户端,从容器中取一个socket,则向该socket转发
Socket sock = all.get(i); PrintWriter pw = new PrintWriter(sock.getOutputStream(),
true); pw.println(str);//向客户端转发消息:接受者-发送者-发送的内容
} } } catch (SocketException ee) { System.out.println(
给每个客户端
PrintWriter pw; try { pw = new PrintWriter(((Socket) all.get(i)).getOutputStream(), true);
}
} }*/ pw.println(yonghu +
3.实现中的注意事项或重难点(不少于200字)
在编程过程中,很容易造成服务器与客户端连接不了,客户端输入数据时服务器端接收不到,以及发出的消息不能再控制台显示出来,按钮单击没反应,有的要调用run()方法,在调用中总是出错,还有一个难点就是对面板的布局,对按钮的监听功能容易出问题,以及接口的实现,socket和serversocket类的使用要特别注意,在创建前一定要理清思路,注意代码的编写,要注意构造方法的调用等。为了能使一个程序中多行语句同时执行,一定要掌握多线程的使用,而程序最重要的是服务器端与客户端连接,所以通过调用Socket的getInputStream()方法从服务程序获得输入流读传送来的信息,也可以通过调用Socket的getOutputStream()方法获得输出流来发送消息,这些都是重点要掌握的,聊天室的编程一定要细心,有耐心,不然很容易出错,而且有些错误都找不出来,所以一定要理清思路,再开始创建聊天室。
1.3实训总结(不少于300字)
通过本次实训,在老师的指导下,我了解并完成了一个简单聊天室的设计,它实现了简单的实时聊天功能,经过细心的调试和排错解决了绝大部分问题,但是计算机程序总是会有些不足之处,一些无法实现的功能等,对于以前感觉陌生的界面设计、异常处理等问题有了新的认识,再次面对问题是有了自己的程序设计思路,这算是最大的收获了。也深刻体会到了程序设计的严谨性与创造性,在此过程中我受益匪浅,与此同时通过对系
统的需要分析和在代码中对错误的处理,培养了自己的独立思考,独立分析和自学能力以及解决问题的能力,我认为这对我以后的学习和生活都有很大的帮助。