基于CS简单聊天程序课程设计

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

计算机网络课程设计任务书
基于C/S模式的简单聊天程序设计说明书
学院名称:计算机与信息工程学院
班级名称:网络工程142
学生姓名:张三
学号:2014211540
题目:基于C/S模式的简单聊天程序
指导教师
姓名:陈海宝
起止日期: 2016.6.13-2016.6.26
目录
一、选题背景 (1)
二、方案论证 (1)
三、过程论述 (2)
3.1 服务器端 (2)
3.2 客户机端 (8)
四、结果分析 (15)
五、结论 (17)
第一部分:正文部分
一、选题背景
使用Socket实现网上聊天功能。

用户可以通过客户端连接到服务器端并进行网上聊天。

聊天时可以启动多个客户端。

服务器端启动后,接收客户端发来的用户名和密码验证信息。

验证通过则以当前的聊天客户列表信息进行响应;此后接收客户端发来的聊天信息,转发给客户端指定的聊天客户(即私聊)或所有其他客户端;在客户断开连接后公告其退出聊天系统的信息。

客户端启动后在GUI界面接收用户输入的服务器端信息、账号和密码等验证客户的身份。

验证通过则显示当前系统在线客户列表。

客户可以与指定对象进行私聊,也可以向系统中所有在线客户发送信息。

二、方案论证
基于C/S的简单聊天室可以实现用户与服务器间,服务器与多个用户间的通信。

聊天室程序通常需要完成以下一些基本功能:
(1)登录聊天室;
(2)启动服务器;
(3)关闭服务器;
(4)用户之间的聊天;
(5)退出聊天室。

本系统其体功能需求如下:
(1)聊天室管理员经登录界面登录到管理界面,即系统的服务器端。

用户
经登录界面进入聊天大厅。

(2)不论是管理员还是用户都需要在登录界面输入正确的用户名和密码
后才可以登录到各自的界面中去。

(3)系统的两个主要界面都是为方便管理员和用户操作的。

首先,管理员
进入到管理界面后可以方便的启动/停止服务器,看到在线用户的信息和聊天信息。

用户进入到聊天大厅中可以聊天,查看服务器状态。

(4) 一个用户退出聊天室对其他用户不能产生影响,而服务器断开与客
户端的连接则所有的用户都失去与服务器的连接。

(5)用户的聊天信息录入,重写,发送,接收方便,快捷。

(6)服务器状态,聊天信息和在线用户人数及时刷新。

(7)聊天室系统运行稳定、安全性高、
三、过程论述
3.1 服务器端
(1)首先实现的是服务器开始工作界面,如图3-1所示:
图3-1
代码如下:
public ChatServer() {
try {
System.out.println("服务器开始工作......");
server=new ServerSocket(port);//初始化服务器套接字
while (true){
socket=server.accept();//等待连接
System.out.println(socket.getInetAddress()+"连接\n");//得到客户机地址
Client client=new Client(socket);//实例化一个客户线程(其中线程Client中Socket,这里的Socket只是起个过渡作用)
clients.add(client);//增加客户线程到向量中
client.start();//启动线程
notifyChatRoom();//监视聊天室连接变化 }
}catch(Exception ex){
ex.printStackTrace();
}
}
(2)监视聊天室连接情况,并显示出来,如图3-2所示:
图3-2
代码如下:
public static void notifyChatRoom(){
StringBuffer newUser=new StringBuffer("newUser");
for(int i =0;i<clients.size();i++){
Client c=(Client)clients.elementAt(i);
newUser.append(":"+);
}
sendClients(newUser);
}
public static void sendClients(StringBuffer message){ for(int i =0;i<clients.size();i++)
{
Client client=(Client)clients.elementAt(i);
client.send(message);
}
}
public void closeAll(){
while(clients.size()>0){
Client client=(Client)clients.firstElement();
try{
client.socket.close();
}catch(IOException e){
e.printStackTrace();
}
clients.removeElement(client); //移出客户端
}
}
public static void disconnect(Client c) {// 断开客户端 try {
System.err.println(c.ip+"断开连接\n");
} catch (Exception ex) {
ex.printStackTrace();
}
clients.removeElement(c);
c.socket = null;
}
(3)再次是实现服务器与客户机连接机制,如果有客户机申请连接,则为此
客户机创建线程,代码如下:
public ChatServer() {
try {
System.out.println("服务器开始工作......");
server=new ServerSocket(port);//初始化服务器套接字
while (true){
socket=server.accept();//等待连接
System.out.println(socket.getInetAddress()+"连接\n");//得到客户机地址
Client client=new Client(socket);//实例化一个客户线程(其中线程Client中Socket,这里的Socket只是起个过渡作用)
clients.add(client);//增加客户线程到向量中
client.start();//启动线程
notifyChatRoom();//监视聊天室连接变化 }
}catch(Exception ex){
ex.printStackTrace();
}
public ChatServer() {
try {
System.out.println("服务器开始工作......");
server=new ServerSocket(port);//初始化服务器套接字 while (true){
socket=server.accept();//等待连接
System.out.println(socket.getInetAddress()+"连接\n");//得到客户机地址
Client client=new Client(socket);//实例化一个客户线程(其中线程Client中Socket,这里的Socket只是起个过渡作用)
clients.add(client);//增加客户线程到向量中
client.start();//启动线程
notifyChatRoom();//监视聊天室连接变化 }
}catch(Exception ex){
ex.printStackTrace();
}
(4)再次是实现服务器的消息发送和接受的处理机制,如图3-3所示:
图3-3
代码如下:
public Client(Socket s) {
socket = s;
try {
reader = new BufferedReader(new InputStreamReader(s.getInputStream()));//得到输入流
ps = new PrintStream(s.getOutputStream());//到输出流
String info = reader.readLine();//读取接收到的信息
StringTokenizer stinfo = new StringTokenizer(info,":"); //分解字符串
String head = stinfo.nextToken(); //获取关键字 System.out.println(stinfo.toString());
System.out.println(head);
if (stinfo.hasMoreTokens()){
name = stinfo.nextToken(); //获取用户名
}
if (stinfo.hasMoreTokens()) {
ip = stinfo.nextToken(); //获取IP地址
}
} catch (IOException ex) {
ex.printStackTrace();
}
System.out.println(name);
System.out.println(ip);
}
public void send (StringBuffer msg) {
ps.println(msg); //输出信息
ps.flush();
}
public void run() {
while (true) {
String line = null;
try {
line = reader.readLine();
System.out.println("line:"+line);
} catch (IOException ex) {
ex.printStackTrace(); //输出错误信息
ChatServer.disconnect(this);//断开连接
ChatServer.notifyChatRoom();//更新信息
}
if (line == null) { //客户离开
ChatServer.disconnect(this);
ChatServer.notifyChatRoom();
}
StringTokenizer st = new
StringTokenizer(line,":");//分解字符串
String keyword = st.nextToken();
if (keyword.equals("MSG")) { //发送来的聊天信息
StringBuffer msg = new StringBuffer("MSG:");
msg.append(name); //在信息上增加用户名
msg.append(st.nextToken("\0\n"));
ChatServer.sendClients(msg);//发送聊天语句到各个客户端
System.out.println(msg);
} else if (keyword.equals("quit")) { //退出命令
ChatServer.disconnect(this); //断开连接
ChatServer.notifyChatRoom(); //刷新信息
}
}
}
}
}
3.2 客户机端
(1)客户机登录界面如图3-4所示:
图3-4
代码如下:
public class ChatClient extends JFrame implements ActionListener{
TextField tfName = new TextField();//姓名输入文本域
Button btConnect = new Button("登陆");//连接按钮
Button btDisconnect = new Button("退出");//断开连接按钮
TextArea tfChat = new TextArea();//显示聊天信息文本域
Button btSend = new Button("发送");
TextField tfMessage = new TextField();//聊天输入
java.awt.List list1 = new java.awt.List(9);//显示在线用户信息
Socket socket = null;//连接端口
PrintStream ps = null;//输出流
Listen listen = null; //监听线程类
class Listen extends Thread {
BufferedReader reader;
PrintStream ps;
String cname;
Socket socket;
ChatClient chatClient;
public Listen(ChatClient client,String name,Socket socket) {
try {
this.chatClient = client;
this.socket = socket;
ame = name;
reader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
ps = new PrintStream(socket.getOutputStream());
} catch (IOException e) {
e.printStackTrace();
}
}
public void run() {
while (true) {
String line=null;
try {
line = reader.readLine(); //读取数据流
System.out.println("客户端:"+line);
}catch (IOException ex) {
ex.printStackTrace();
ps.println("quit");; //断开连接
return;
}
StringTokenizer stinfo = new StringTokenizer(line,":"); //分解字符串
String keyword = stinfo.nextToken();
if (keyword.equals("MSG")) {
chatClient.tfChat.append(line+"\n");
}
else if (keyword.equals("newUser")){
chatClient.list1.clear();
chatClient.list1.add("users", 0);
int i = 1;
while (stinfo.hasMoreTokens()) {
chatClient.list1.add(stinfo.nextToken(), i++);
}
}
}
}
}
public ChatClient(Socket socket) {
this.setLayout(new BorderLayout());
JPanel panel1 = new JPanel();
Label label = new Label("账号");
panel1.setBackground(Color.pink);
panel1.add(label);
panel1.add(tfName);
panel1.add(btConnect);
panel1.add(btDisconnect);
this.add(panel1,BorderLayout.SOUTH);
JPanel panel2 = new JPanel();
tfChat.setBackground(Color.yellow);
panel2.add(tfChat);
panel2.add(list1);
this.add(panel2,BorderLayout.CENTER);
JPanel panel3 = new JPanel();
Label label2 = new Label("聊天板");
panel3.add(label2);
panel3.add(tfMessage);
panel3.add(btSend);
this.add(panel3,BorderLayout.NORTH);
this.setBounds(50,50,400,350);
this.setVisible(true);
btConnect.addActionListener(this);
btDisconnect.addActionListener(this);
btSend.addActionListener(this);
}
(2)其次是实现消息的接受和发送处理机制,代码如下:
public void run() {
while (true) {
String line=null;
try {
line = reader.readLine(); //读取数据流
System.out.println("客户端:"+line);
}catch (IOException ex) {
ex.printStackTrace();
ps.println("quit");; //断开连接
return;
}
StringTokenizer stinfo = new StringTokenizer(line,":"); //分解字符串
String keyword = stinfo.nextToken();
if (keyword.equals("MSG")) {
chatClient.tfChat.append(line+"\n");
}
else if (keyword.equals("newUser")){
chatClient.list1.clear();
chatClient.list1.add("users", 0);
int i = 1;
while (stinfo.hasMoreTokens()) {
chatClient.list1.add(stinfo.nextToken(),
i++);
}
}
}
}
}
(3)再次是实现客户端登陆界面以及功能的实现,如图3-5所示:
图3-5
代码如下:
public class ChatClient extends JFrame implements ActionListener{
TextField tfName = new TextField();//姓名输入文本域
Button btConnect = new Button("登陆");//连接按钮
Button btDisconnect = new Button("退出");//断开连接按钮
TextArea tfChat = new TextArea();//显示聊天信息文本域
Button btSend = new Button("发送");
TextField tfMessage = new TextField();//聊天输入
java.awt.List list1 = new java.awt.List(9);//显示在线用户
信息
Socket socket = null;//连接端口
PrintStream ps = null;//输出流
Listen listen = null; //监听线程类
class Listen extends Thread {
BufferedReader reader;
PrintStream ps;
String cname;
Socket socket;
ChatClient chatClient;
public Listen(ChatClient client,String name,Socket socket) {
try {
this.chatClient = client;
this.socket = socket;
ame = name;
reader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
ps = new PrintStream(socket.getOutputStream());
} catch (IOException e) {
e.printStackTrace();
}
}
public void run() {
while (true) {
String line=null;
try {
line = reader.readLine(); //读取数据流
System.out.println("客户端:"+line);
}catch (IOException ex) {
ex.printStackTrace();
ps.println("quit");; //断开连接
return;
}
StringTokenizer stinfo = new StringTokenizer(line,":"); //分解字符串
String keyword = stinfo.nextToken();
if (keyword.equals("MSG")) {
chatClient.tfChat.append(line+"\n");
}
else if (keyword.equals("newUser")){
chatClient.list1.clear();
chatClient.list1.add("users", 0);
int i = 1;
while (stinfo.hasMoreTokens()) {
chatClient.list1.add(stinfo.nextToken(), i++);
}
}
}
四、结果分析
(1)首先启动服务器,如图4-1所示:
图4-1
(2)其次登陆客户端,如图4-2所示:
图4-2
(3)验证通过之后会自动进入客户端聊天室,如图4-3所示:
图4-3
(4)下面是对话部分,如图4-4所示:
图4-4
五、结论
通过课程设计的编程和对编程过程中遇到的问题的思考,有效的提高了我对数据结构的认识和理解,切实的提高了我的编程能力,补全了我的不足。

通过这次课程设计,我巩固所了学过的知识,能用JAVA熟练地运用其中的一些,进一步掌握了各个指令的功能是转向。

课程设计是对我们所学的这些东西一个综合的运用。

在整个程序的编写中,调试占了很大部分的时间。

要想写好程序,必须认真对待代码的每一个细节,还必须熟练的掌握各种命令,这对程序的调试是非常重要的。

通过这次实际动手能力的培养,我进一步熟悉了使用方法,基本达到了能独立阅读、编制和调试一定规模的水平。

课程设计是对自己所学知识掌握程度最好的检验,特别是对于一些细节问题。

考试还并不能完全的说明什么,因为考题都是一些单个的问题,大多只是知识的某一方面。

而课程设计不同,我们要用到很多的单个知识点,把他们综合起来运用到自己的课题当中。

虽然实践时间不长,但给我们对知识的运用,利用都有了很好的发挥。

人多力量大这句话是真理啊,不懂得地方问同学,不会的地方也问同学,自己努力的同时跟别人共同进步,这就是合作,学会合作是我们以后必备的重要的一项人际技能。

第三部分:参考文献
[1]赵生慧.《Java面向对象程序设计》(第二版)[M].北京:中国水利水电
出版社,2013.
[2]万常选.《数据库系统原理与设计》(第二版)[M].北京:清华大学出版
社,2012.
[3]谢钧,谢希仁.《计算机网络教程》(第四版)[M].北京:人民邮电出版
社,2014.
[4]李刚.《疯狂JAVA讲义》[M].(第三版).北京:电子工业出版社,2014.
[5]耿祥义、张跃平.《Java2实用教程》[M].(第三版).北京:清华大学出
版社, 2006.
[6]刘海杰.《Java编程设计》[M].北京:中国铁道出版社,2006.
学生签名:填表日期:年月日
第四部分:指导教师评语
第五部分:成绩评定
指导教师签名:填表日期:年月日。

相关文档
最新文档