基于CS简单聊天程序课程设计.docx
- 文档编号:30441140
- 上传时间:2023-08-15
- 格式:DOCX
- 页数:22
- 大小:46.60KB
基于CS简单聊天程序课程设计.docx
《基于CS简单聊天程序课程设计.docx》由会员分享,可在线阅读,更多相关《基于CS简单聊天程序课程设计.docx(22页珍藏版)》请在冰豆网上搜索。
基于CS简单聊天程序课程设计
计算机网络课程设计任务书
学院
计算机与信息工程学院
专业
网络工程
课程名称
计算机网络
题目
基于C/S模式的简单聊天程序
完成期限
自2016年6月13日至2016年6月26日共两周
容
及
任
务
一、项目的目的
利用socket。
实现客户与服务器间的信息互通。
二、项目任务的主要容和要求
(1)用户聊天室具有群发,私聊,输入昵称与端口号等基本设置。
点击“连接”按钮实现与服务器的连接。
点击“断开”按钮实现与服务器的断开连接。
(2)服务器聊天室具有启动服务器,停止服务器,显示当前在线的用户功能。
点击“启动”按钮实现与服务器的连接。
点击“停止”按钮实现与服务器的断开连接。
(3)设计一个登录程序。
验证通过后才能进入聊天室。
(4)当服务器与客户机连接成功后。
能够互相接受和发送消息。
当多个客户机启动时,服务器会创建子线程处理对应线程的消息。
三、项目设计(研究)思路
(1)设计步骤:
先画出聊天室的模型,布局。
(2)设计要点:
设计主类与子类,分别实现不同的功能
(3)主要技术分析:
需要掌握socket通信,swing和awt,io的简单应用.
(4)解决思路:
先按照草稿图设计出聊天室布局。
再写各个类的功能。
简单测试与修改代码。
最后完善。
四、具体成果形式和要求
(见第一部分)
进
度
安
排
起止日期
工作容
6.13-6.18
设计聊天室的模型,布局
6.19-6.20
编写代码,初步实现聊天程序
6.21-6.26
完善代码,优化界面,完成任务
主
要
参
考
资
料
[1]生慧.《Java面向对象程序设计》(第二版)[M].:
中国水利水电,2013.
[2]万常选.《数据库系统原理与设计》(第二版)[M].:
清华大学,2012.
[3]钧,希仁.《计算机网络教程》(第四版)[M].:
人民邮电,2014.
[4]刚.《疯狂JAVA讲义》[M].(第三版).:
电子工业,2014.
[5]耿祥义、跃平.《Java2实用教程》[M].(第三版).:
清华大学,2006.
[6]海杰.《Java编程设计》[M].:
中国铁道,2006.
指导教师
意见
(签字):
年月日
系(教研室)主任意见
(签字):
年月日
基于C/S模式的简单聊天程序设计说明书
学院名称:
计算机与信息工程学院
班级名称:
网络工程142
学生:
三
学号:
2014211540
题目:
基于C/S模式的简单聊天程序
指导教师
姓名:
海宝
起止日期:
2016.6.13-2016.6.26
第一部分:
正文部分
一、选题背景
使用Socket实现网上聊天功能。
用户可以通过客户端连接到服务器端并进行网上聊天。
聊天时可以启动多个客户端。
服务器端启动后,接收客户端发来的用户名和密码验证信息。
验证通过则以当前的聊天客户列表信息进行响应;此后接收客户端发来的聊天信息,转发给客户端指定的聊天客户(即私聊)或所有其他客户端;在客户断开连接后公告其退出聊天系统的信息。
客户端启动后在GUI界面接收用户输入的服务器端信息、账号和密码等验证客户的身份。
验证通过则显示当前系统在线客户列表。
客户可以与指定对象进行私聊,也可以向系统中所有在线客户发送信息。
二、方案论证
基于C/S的简单聊天室可以实现用户与服务器间,服务器与多个用户间的通信。
聊天室程序通常需要完成以下一些基本功能:
(1)登录聊天室;
(2)启动服务器;
(3)关闭服务器;
(4)用户之间的聊天;
(5)退出聊天室。
本系统其体功能需求如下:
(1)聊天室管理员经登录界面登录到管理界面,即系统的服务器端。
用户经登录界面进入聊天大厅。
(2)不论是管理员还是用户都需要在登录界面输入正确的用户名和密码后才可以登录到各自的界面中去。
(3)系统的两个主要界面都是为方便管理员和用户操作的。
首先,管理员进入到管理界面后可以方便的启动/停止服务器,看到在线用户的信息和聊天信息。
用户进入到聊天大厅中可以聊天,查看服务器状态。
(4)一个用户退出聊天室对其他用户不能产生影响,而服务器断开与客户端的连接则所有的用户都失去与服务器的连接。
(5)用户的聊天信息录入,重写,发送,接收方便,快捷。
(6)服务器状态,聊天信息和在线用户人数及时刷新。
(7)聊天室系统运行稳定、安全性高、
三、过程论述
3.1服务器端
(1)首先实现的是服务器开始工作 界面,如图3-1所示:
图3-1
代码如下:
publicChatServer(){
try{
System.out.println("服务器开始工作......");
server=newServerSocket(port);//初始化服务器套接字
while(true){
socket=server.accept();//等待连接
System.out.println(socket.getInetAddress()+"连接\n");//得到客户机地址
Clientclient=newClient(socket);//实例化一个客户线程(其中线程Client中Socket,这里的Socket只是起个过渡作用)
clients.add(client);//增加客户线程到向量中
client.start();//启动线程
notifyChatRoom();//监视聊天室连接变化
}
}catch(Exceptionex){
ex.printStackTrace();
}
}
(2)监视聊天室连接情况,并显示出来,如图3-2所示:
图3-2
代码如下:
publicstaticvoidnotifyChatRoom(){
StringBuffernewUser=newStringBuffer("newUser");
for(inti=0;i Clientc=(Client)clients.elementAt(i); newUser.append(": "+c.name); } sendClients(newUser); } publicstaticvoidsendClients(StringBuffermessage){ for(inti=0;i { Clientclient=(Client)clients.elementAt(i); client.send(message); } } publicvoidcloseAll(){ while(clients.size()>0){ Clientclient=(Client)clients.firstElement(); try{ client.socket.close(); }catch(IOExceptione){ e.printStackTrace(); } clients.removeElement(client);//移出客户端 } } publicstaticvoiddisconnect(Clientc){//断开客户端 try{ System.err.println(c.ip+"断开连接\n"); }catch(Exceptionex){ ex.printStackTrace(); } clients.removeElement(c); c.socket=null; } (3)再次是实现服务器与客户机连接机制,如果有客户机申请连接,则为此客户机创建线程,代码如下: publicChatServer(){ try{ System.out.println("服务器开始工作......"); server=newServerSocket(port);//初始化服务器套接字 while(true){ socket=server.accept();//等待连接 System.out.println(socket.getInetAddress()+"连接\n");//得到客户机地址 Clientclient=newClient(socket);//实例化一个客户线程(其中线程Client中Socket,这里的Socket只是起个过渡作用) clients.add(client);//增加客户线程到向量中 client.start();//启动线程 notifyChatRoom();//监视聊天室连接变化 } }catch(Exceptionex){ ex.printStackTrace(); } publicChatServer(){ try{ System.out.println("服务器开始工作......"); server=newServerSocket(port);//初始化服务器套接字 while(true){ socket=server.accept();//等待连接 System.out.println(socket.getInetAddress()+"连接\n");//得到客户机地址 Clientclient=newClient(socket);//实例化一个客户线程(其中线程Client中Socket,这里的Socket只是起个过渡作用) clients.add(client);//增加客户线程到向量中 client.start();//启动线程 notifyChatRoom();//监视聊天室连接变化 } }catch(Exceptionex){ ex.printStackTrace(); } (4)再次是实现服务器的消息发送和接受的处理机制,如图3-3所示: 图3-3 代码如下: publicClient(Sockets){ socket=s; try{ reader=newBufferedReader(newInputStreamReader(s.getInputStream()));//得到输入流 ps=newPrintStream(s.getOutputStream());//到输出流 Stringinfo=reader.readLine();//读取接收到的信息 StringTokenizerstinfo=newStringTokenizer(info,": ");//分解字符串 Stringhead=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(IOExceptionex){ ex.printStackTrace(); } System.out.println(name); System.out.println(ip); } publicvoidsend(StringBuffermsg){ ps.println(msg);//输出信息 ps.flush(); } publicvoidrun(){ while(true){ Stringline=null; try{ line=reader.readLine(); System.out.println("line: "+line); }catch(IOExceptionex){ ex.printStackTrace();//输出错误信息 ChatServer.disconnect(this);//断开连接 ChatServer.notifyChatRoom();//更新信息 } if(line==null){//客户离开 ChatServer.disconnect(this); ChatServer.notifyChatRoom(); } StringTokenizerst=newStringTokenizer(line,": ");//分解字符串 Stringkeyword=st.nextToken(); if(keyword.equals("MSG")){//发送来的聊天信息 StringBuffermsg=newStringBuffer("MSG: "); msg.append(name);//在信息上增加用户名 msg.append(st.nextToken("\0\n")); ChatServer.sendClients(msg);//发送聊天语句到各个客户端 System.out.println(msg); }elseif(keyword.equals("quit")){//退出命令 ChatServer.disconnect(this);//断开连接 ChatServer.notifyChatRoom();//刷新信息 } } } } } 3.2客户机端 (1)客户机登录界面如图3-4所示: 图3-4 代码如下: publicclassChatClientextendsJFrameimplementsActionListener{ TextFieldtfName=newTextField();//输入文本域 ButtonbtConnect=newButton("登陆");//连接按钮 ButtonbtDisconnect=newButton("退出");//断开连接按钮 TextAreatfChat=newTextArea();//显示聊天信息文本域 ButtonbtSend=newButton("发送"); TextFieldtfMessage=newTextField();//聊天输入 java.awt.Listlist1=newjava.awt.List(9);//显示在线用户信息 Socketsocket=null;//连接端口 PrintStreamps=null;//输出流 Listenlisten=null;//监听线程类 classListenextendsThread{ BufferedReaderreader; PrintStreamps; Stringame; Socketsocket; ChatClientchatClient; publicListen(ChatClientclient,Stringname,Socketsocket){ try{ this.chatClient=client; this.socket=socket; ame=name; reader=newBufferedReader(newInputStreamReader(socket.getInputStream())); ps=newPrintStream(socket.getOutputStream()); }catch(IOExceptione){ e.printStackTrace(); } } publicvoidrun(){ while(true){ Stringline=null; try{ line=reader.readLine();//读取数据流 System.out.println("客户端: "+line); }catch(IOExceptionex){ ex.printStackTrace(); ps.println("quit");;//断开连接 return; } StringTokenizerstinfo=newStringTokenizer(line,": ");//分解字符串 Stringkeyword=stinfo.nextToken(); if(keyword.equals("MSG")){ chatClient.tfChat.append(line+"\n"); } elseif(keyword.equals("newUser")){ chatClient.list1.clear(); chatClient.list1.add("users",0); inti=1; while(stinfo.hasMoreTokens()){ chatClient.list1.add(stinfo.nextToken(),i++); } } } } } publicChatClient(Socketsocket){ this.setLayout(newBorderLayout()); JPanelpanel1=newJPanel(); Labellabel=newLabel("账号"); panel1.setBackground(Color.pink); panel1.add(label); panel1.add(tfName); panel1.add(btConnect); panel1.add(btDisconnect); this.add(panel1,BorderLayout.SOUTH); JPanelpanel2=newJPanel(); tfChat.setBackground(Color.yellow); panel2.add(tfChat); panel2.add(list1); this.add(panel2,BorderLayout.CENTER); JPanelpanel3=newJPanel(); Labellabel2=newLabel("聊天板"); 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)其次是实现消息的接受和发送处理机制,代码如下: publicvoidrun(){ while(true){ Stringline=null; try{ line=reader.readLine();//读取数据流 System.out.println("客户端: "+line); }catch(IOExceptionex){ ex.printStackTrace(); ps.println("quit");;//断开连接 return; } StringTokenizerstinfo=newStringTokenizer(line,": ");//分解字符串 Stringkeyword=stinfo.nextToken(); if(keyword.equals("MSG")){ chatClient.tfChat.append(line+"\n"); } elseif(keyword.equals("newUser")){ chatClient.list1.clear(); chatClient.list1.add("users",0); inti=1; while(stinfo.hasMoreTokens()){ chatClient.list1.add(stinfo.nextToken(),i++); } } } } } (3)再次是实现客户端登陆界面以及功能的实现,如图3-5所示: 图3-5 代码如下: publicclassChatClientextendsJFrameimplementsActionListener{ TextFieldtfName=newTextField();//输入文本域 ButtonbtConnect=newButton("登陆");//连接按钮 ButtonbtDisconnect=newButton("退出");//断开连接按钮 TextAreatfChat=newTextArea();//显示聊天信息文本域 ButtonbtSend=newButton("发送"); TextFieldtfMessage=newTextField();//聊天输入 java.awt.Listlist1=newjava.awt.List(9);//显示在线用户信息 Socketsocket=null;//连接端口 PrintStreamps=null;//输出流 Listenlisten=null;//监听线程类 classListenextendsThread{ BufferedReaderreader; PrintStreamps; Stringame; Socketsocket; ChatClientchatClient; publicLis
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 基于 CS 简单 聊天 程序 课程设计