java课程设计聊天小程序解析.docx
- 文档编号:10735787
- 上传时间:2023-02-22
- 格式:DOCX
- 页数:18
- 大小:32.60KB
java课程设计聊天小程序解析.docx
《java课程设计聊天小程序解析.docx》由会员分享,可在线阅读,更多相关《java课程设计聊天小程序解析.docx(18页珍藏版)》请在冰豆网上搜索。
java课程设计聊天小程序解析
课程设计指导书
姓
名
宣红东
宛立生
学
号
09838024
09838027
班
级
一
班
课程名称
Java课程设计
课程性质
设计时间
2010年11月4日——2010年12月31日
设计名称
聊天小程序
设计目的
本次课程设计是对前面学过的面向对象的编程思想以及编程方法的一个总结、回顾和实践。
开始设计前学生一定要先回顾以前所学的内容,明确本次设计所要用到的技术点并到网上搜索以及查阅相关的书籍来搜集资料。
通过编写一个基于JAVA的应用系统综合实例,来掌握Java语言编程技巧。
设计要求
1、使用图形用户界面。
2、能实现一个聊天室中多人聊天。
3、可以两人私聊。
设计思路
与
设计过程
思路与原理:
服务器端接受客户端的连接请求,同时启动一个线程处理这个连接,线程不停的读取客户端输入,然后把输入加入队列中,等候处理。
在线程启动的同时将线程加入队列中,以便在需要的时候定位和取出。
过程:
首先设计ChatServer服务端与ChatClinet客户端
1、服务器(ChatServer),使用ServerSocket监听指定的端口,端口可以随意指定(由于1024以下的端口通常属于保留端口,在一些操作系统中不可以随意使用,所以建议使用大于1024的端口),等待客户连接请求,客户连接后,会话产生;在完成会话后,关闭连接。
2、客户端(ChatClinet),使用Socket对网络上某一个服务器的某一个端口发出连接请求,一旦连接成功,打开会话;会话完成后,关闭Socket。
客户端不需要指定打开的端口,通常临时的、动态的分配一个1024以上的端口。
(具体详细的过程步骤及代码见下面)
3、
计划与进度
计划在两个月内完成任务,首先在前半个月内(11月4日--11月19日),构思通过网上(图书馆)的知识与课本上的相关内容的了解与认识,确认好选择的课题与怎样设计,基本的思路想好。
十五天(11月19日--12月5日)内参考资料争取完成服务端的程序,在12月5日--12月20日完成客户端的程序设计,在12月20日—12月30日内完成实现报告的填写工作。
在12月31日全面完成整个课题,并上交给老师。
任课教师
意见
备注
课程设计报告
课程:
学号:
姓名:
班级
教师:
时间
计算机科学与技术
设计名称:
聊天小程序
日期:
2010年11月4日
设计内容:
设计一个在图形界面下,实现一个聊天室中多人聊天,也可以私聊的聊天小程序
设计目的与要求:
目的是为了更好的掌握java这门课程的内容,同时更好的理解与掌握socket编程,对所有面向对象的编程思想以及编程方法的一个总结、回顾和实践,掌握Java语言编程技巧。
要求使用图形用户界面。
能实现一个聊天室中多人聊天。
可以两人私聊。
(提示:
使用socket通信)程序描述清晰准确,思路清晰,程序能够实现相应的功能。
设计环境或器材、原理与说明、主要完成的功能、设计思路和框图:
设计环境或者器材:
jdk或者jc编辑器,笔记本电脑两台,网线三条,小型交换机一个。
原理与说明:
建立服务端与客户端的一个或者多个连接,其中服务器,使用ServerSocket监听指定的端口,端口可以随意指定(由于1024以下的端口通常属于保留端口,在一些操作系统中不可以随意使用,所以建议使用大于1024的端口),等待客户连接请求,客户连接后,会话产生;在完成会话后,关闭连接。
客户端,使用Socket对网络上某一个服务器的某一个端口发出连接请求,一旦连接成功,打开会话;会话完成后,关闭Socket。
客户端不需要指定打开的端口,通常临时的、动态的分配一个1024以上的端口。
主要功能:
1、实现服务端与客户端的连接,实现两者之间的信息交换。
2、实现了一个服务器可以与多个客户端实现连接,即实现了一个聊天室里面可以多人聊天。
3、亦可以实现私聊的功能。
设计思路与框图:
服务器端接受客户端的连接请求,同时启动一个线程处理这个连接,线程不停的读取客户端输入,然后把输入加入队列中,等候处理。
在线程启动的同时将线程加入队列中,以便在需要的时候定位和取出。
大概的框图:
chatServer端chatclient端
︳
创建ServerSocket对象在某
端口提供监听服务
等待来自chartclient的服务
请求
接受chartclient端的请求用建立连接创建Socket对象向server的监听端
返回的Socket建立连接口请求
通过向Socket中读写数据来数据通信通过向新的Socket中读写数据来
与chartclient端通信与server端通信
关闭Socket结束与当前的拆除连接关闭Socket结束与server的通信
client的通信等待其他的请求
关闭ServerSocket对象结束
监听服务
设计过程(步骤)或程序代码(可以加页):
主要代码:
服务端ChatServer
classSocketThreadextendsThread{//线程类,用于和每个客户端连接
staticVector
privateSocketsocket;//存放每个线程的Socket对象
Stringnick;//存放每个线程的昵称
privatebooleanfirstRead;//用于判断是否为第一次接收数据
SocketThread(Sockets){//构造函数
socket=s;
nick=null;
firstRead=true;
}
privatevoidnoticeDelUser(){//通告所有线程的客户端,本用户退出
Stringmsg="###"+this.nick;
for(inti=0;i if(clientVector.get(i).nick.equals(this.nick)==false) sendMsg(i,msg); } privatevoiddelSocket(){//关闭socket noticeDelUser();//通告所有线程的客户端,本用户退出 clientVector.remove(this);//从clientVector中移除本线程 try{ socket.close(); System.out.println(socket.getInetAddress()+"断开连接! ! "); } catch(IOExceptioncloseError){} } privatevoidnoticeAddUser(){//通告所有线程的客户端,本用户进入 Stringmsg="##"+this.nick; for(inti=0;i sendMsg(i,msg); } privatevoidrequestAllUser(){//本线程请求其他有用户信息 intindex=0; inti=0; for(i=0;i if(clientVector.get(i).nick.equals(this.nick)) break; index=i; for(i=0;i if(index! =i){ Stringmsg="##"+clientVector.get(i).nick; sendMsg(index,msg); } } privateStringmsgForward(Stringmsg){//对接收到的信息转发 Stringname;//存放目的用户昵称 StringtempMsg;//存放生成的转发数据 if(firstRead==true){//若为第一次收到数据 inti; for(i=0;i if(clientVector.get(i).nick.equals(msg)==true) break; if(i>=clientVector.size()){//昵称不存在则: nick=msg;//在clientVector中添加本线程信息 msg="#您使用的昵称: "+msg;//并通告所有线程的客户端,本用户进入 noticeAddUser();//以及请求其他有用户信息 clientVector.add(this); requestAllUser(); firstRead=false; } else{ msg="#您输入的昵称已经存在,请重新输入: ";//昵称存在,发送系统提示 } returnmsg; } if(msg.startsWith("! ")==true){//若客户端发送密语 name=msg.substring(1,msg.indexOf(''));//获得目的用户昵称,生成发送信息 tempMsg=this.nick+"悄悄对"+name+"说: \r\n\t"+msg.substring(msg.indexOf('')); } else{ tempMsg=this.nick+": \r\n\t"+msg;//若为全体聊天 name="610665c2a05631a7bc460993bae36ee6";//此name为特殊值,专指全体聊天 } if(name.equals("610665c2a05631a7bc460993bae36ee6")==false){//若为密语 inti=0; for(;i if(clientVector.get(i).nick.equals(name)==true) break; if(i>=clientVector.size()){//若找不到目的客户线程,则返回系统提示 msg="#您所发送的用户名昵称不存在! ! "; } else{ sendMsg(i,tempMsg);//找到目的客户线程并转发 } } else{//为全体聊天,全体转发 inti=0; for(;i sendMsg(i,tempMsg); } returnmsg; } privatevoidsendMsg(intindex,Stringmsg){//向特定客户转发,msg为转发信息 SockettempSocket=clientVector.get(index).socket;//index为客户在clientVector中位置 try{ PrintWriterpw=newPrintWriter(tempSocket.getOutputStream(),true); pw.println(msg); } catch(IOExceptionprintError){} } publicvoidrun(){//建立读写流 Stringmsg=null; InputStreamReaderisr=null; BufferedReaderbr=null; try{ isr=newInputStreamReader(socket.getInputStream()); br=newBufferedReader(isr); } catch(IOExceptioninOutError){ System.out.println("无法与客户建立流! ! "); delSocket(); return; } do{ try{ msg=br.readLine(); } catch(IOExceptionreadError){ System.out.println("读取流数据错误! ! "); delSocket(); return; } System.out.println(msg); msg=msgForward(msg);//处理读取的数据 if(msg.startsWith("#")==true){//若有系统提示返回,则返回系统提示 try{ PrintWriterpw=newPrintWriter(socket.getOutputStream(),true); pw.println(msg); } catch(IOExceptionprintError){} } } while(true); } } publicclassChatServer{ publicstaticvoidmain(Stringargs[]){ ServerSocketserverSocket=null; Socketsocket=null; SocketThreadst; try{ serverSocket=newServerSocket(8324);//监听端口8324 System.out.println("服务器启动成功,正在监听8324端口! ! "); } catch(IOExceptione){ System.out.println("不能使用端口8324,无法启动服务器! ! "); return; } while(true){ try{ socket=serverSocket.accept();//获得连接,并建立Socket } catch(IOExceptione){ System.out.println("不能建立连接: "+socket.getInetAddress().toString()+"/"+socket.getPort()); } st=newSocketThread(socket);//创建新线程 System.out.println("建立连接: "+socket.getInetAddress().toString()+"/"+socket.getPort()); st.start();//开始新线程 } } } 客户端ChartClient 主要代码: packagech02; privatevoidinitSocket(){//对socket的初始化 try{ transferSocket=newSocket("localhost",8324);//与服务器建立连接 ReceiveThreadrt=newReceiveThread(transferSocket,this); rt.start();//开启新线程用于读取数据流 } catch(IOExceptioncreateError){//出现错误则退出程序 welcomeInfo.setText("无法连接服务器! ! "); try{ transferSocket.close(); welcomeInfo.setText("与服务器连接已经断开! ! "); System.exit(0); } catch(IOExceptioncloseError){} System.exit(0); }//对输出流的初始化 try{ socketWriter=newPrintWriter(transferSocket.getOutputStream(),true); } catch(IOExceptionstreamError){ welcomeInfo.setText("流建立错误! ! "); try{ transferSocket.close(); welcomeInfo.setText("与服务器连接已经断开! ! "); System.exit(0); } catch(IOExceptioncloseError){} System.exit(0); } } publicvoidaddNewMsg(Stringmsg){//向chatRecord中追加数据 chatRecord.append(msg+"\r\n"); } publicvoidsetWelcome(Stringmsg){//改变welcomeInfo值 welcomeInfo.setText(msg); } publicvoidwindowIconified(WindowEvente){} publicvoidwindowClosed(WindowEvente){} publicvoidwindowDeactivated(WindowEvente){} publicvoidwindowActivated(WindowEvente){} publicvoidwindowClosing(WindowEvente){//窗体关闭事件 System.exit(0); } publicvoidwindowDeiconified(WindowEvente){} publicvoidwindowOpened(WindowEvente){} publicvoidkeyPressed(KeyEvente){//对键盘事件的监视 switch(e.getKeyCode()){ caseKeyEvent.VK_ENTER: //回车键,就发送信息 sendMsg();//向服务器发送信息 break; caseKeyEvent.VK_CANCEL: //esc键则,friendList选中第0项 friendList.select(0); transName.setText("发送给: "+friendList.getSelectedItem().toString()); break; default: } } publicvoidkeyTyped(KeyEvente){} publicvoidkeyReleased(KeyEvente){} publicvoiditemStateChanged(ItemEvente){//监视friendList选中项变化 if(e.getSource().equals(friendList)){//改变transName值 transName.setText("发送给: "+friendList.getSelectedItem().toString()); } } publicvoidtextValueChanged(TextEvente){//若chatRecod字符多余100000 if(chatRecord.getText().length()>100000){//则清除部分历史记录,防止占用过大内存 chatRecord.setText(chatRecord.getText().substring(chatRecord.getText().indexOf("\r\n")+2)); } } publicvoidactionPerformed(ActionEvente){//点击sendButton则发送信息 if(e.getSource()==sendButton){ sendMsg(); } } publicvoidsendMsg(){//向服务器发送信息 if(msgEditor! =null){ if(friendList.getSelectedIndex()==0){//发送全体聊天信息 socketWriter.println(msgEditor.getText()); } else{//发送密语,并回显 socketWriter.println("! "+friendList.getSelectedItem().toString()+""+msgEditor.getText()); chatRecord.append(this.nick+"对"+friendList.getSelectedItem().toString()+"悄悄说: \r\n\t"+msgEditor.getText()+"\r\n"); } } else//若发送信息为空,则系统提示 chatRecord.append("! 不能发送空消息\r\n"); msgEditor.setText("");//将发送信息栏置空 } } classReceiveThreadextendsThread{//监视输入流的类 Socketsocket
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- java 课程设计 聊天 程序 解析