java课程设计聊天小程序_第1页
java课程设计聊天小程序_第2页
java课程设计聊天小程序_第3页
已阅读5页,还剩16页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、课程设计指导书姓名宣红东宛立生学号0983802409838027班级班课程名称Java课程设计课程性质设计时间2010年11月4日2010年12月31日设计名称聊天小程序设计目的本次课程设计是对前面学过的面向对象的编程思想以及编程方法的一个总结、回顾和实践。开始设计前学生一定要先回顾以前所学的内容,明确本次设计所要用到的技术点并到网上搜索以及查阅相关的书籍来搜集资料。通过编写一个基丁JAVA的应用系统综合实例,来掌握Java语言编程技巧。设计要求1、使用图形用户界面。2、能实现一个聊天室中多人聊天。3、可以两人私聊。设计思路与设计过程思路与原理:服务器端接受客户端的连接请求,问时启动一个线程

2、处理这个连接,线程不停的读取客户端输入,然后把输入加入队列中,等候处理。在线程启动的问时将线程加入队列中,以便在需要的时候定位和取出。过程:首先设计ChatServer服务端与ChatClinet客户端1、服务器(ChatServer),使用ServerSocket监听指定的端口,端口可以随挪定(由于1024以下的端口通常属于保留端口,在一些操作系统中E以随意使用,所以建议使用大于1024的端口),等待客户连接请求,客户连接后,会话产生;在完成会话后,关闭连接。2、客户端(ChatClinet),使用Socket对网络上某一个服务器的某一个端口发出连接请求,一旦连接成功,打开会话;会话完成后,

3、关闭Socket。客户端不需要指定打开的端口,通常临时的、动态的分配一个1024以上的端口。(具体详细的过程步骤及代码见卜面)计划在两个月内完成任务,首先在前半个月内(11月4日-11月19日),构思通过网上(图书馆)的知识与课本上的相关内容的了解与认识,确认好选择的课题与怎样设计,基本的思路想好。十五计划与进度天(11月19日-12月5日)内参考资料争取完成服务端的程序,在12月5日-12月20日完成客户端的程序设计,在12月20日一12月30日内完成实现报告的填写工作。在12月31日全面完成整个课题,并上交给老师。任课教师意见备注课程设计报告课程:Java语言程序设计学号:09838024

4、09838027姓名:宣红东宛立生班级:一班教师:江L庆如刍时间2010/11/42010/12/31计算机科学与技术设计名称:聊天小程序日期:2010年11月4日设计内容:设计一个在图形界面下,实现一个聊天室中多人聊天,也可以私聊的聊天小程序设计目的与要求:目的是为了更好的掌握java这门课程的内容,问时更好的理解与掌握socket编程,对所有面向对象的编程思想以及编程方法的一个总结、回顾和实践,掌握Java语言编程技巧。要求使用图形用户界面。能实现一个聊天室中多人聊天。可以两人私聊。(提示:使用socket通信)程序描述清晰准确,思路清晰,程序能够实现相应的功能。设计环境或器材、原理与说明

5、、主要完成的功能、设计思路和框图:设计环境或者器材:jdk或者jc编辑器,笔记本电脑两台,网线三条,小型交换机一个。原理与说明:建立服务端与客户端的一个或者多个连接,其中服务器,使用ServerSocket监听指正的端口,端口可以随意指7E(由于1024以下的端口通甬属于保留端口,在一些操作系统中E以随意使用,所以建议使用大于1024的端口),等待客户连接请求,客户连接后,会话产生;在完成会话后,关闭连接。客户端,使用Socket对网络上某一个服务器的某一个端口发出连接请求,一旦连接成功,打开会话;会话完成后,关闭Socket。客户端不需要指定打开的端口,通常临时的、动态的分配一个1024以上

6、的端口。主要功能:1、实现服务端与客户端的连接,实现两者之间的信息交换。2、实现了一个服务器可以与多个客户端实现连接,即实现了一个聊天室里面可以多人聊天。3、亦可以实现私聊的功能。设计思路与框图:服务器端接受客户端的连接请求,同时启动一个线程处理这个连接,线程不停的读取客户端输入,然后把输入加入队列中,等候处理。在线程启动的同时将线程加入队列中,以便在需要的时候定位和取出。大概的框图:chatServer端chatclient端I创建ServerSocket对象在某端口提供监听服务等待来自chartclient的服务请求接受chartclient端的请求用建立连接创建Socket对象向serv

7、er的监听端一返回的Socket建立连接口请求.通过向Socket中读写数据来数据通信-通过向新的Socket中读写数据来与chartclient端通信与server端通信关闭Socket结束与当前的拆除连接一-关闭Socket结束与server的通client的通信等待其他的请求关闭ServerSocket对象结束监听服务/线程类,用于和存放/存放每个线程/存放每个线程/用于判断是否构造函数/通告所有线程/关闭socket/通告所有线程/从断开连接!");/通告所有线程/本线程请求其设计过程(步骤)或程序代码(可以加页):主要代码:服务端ChatServerclassSocketT

8、hreadextendsThread(每个客户端连接staticVector<SocketThread>clientVector=newVector<SocketThread>();/每个线程信息privateSocketsocket;的Socket对象Stringnick;的昵称privatebooleanfirstRead;为第一次接收数据SocketThread(Sockets)(socket=s;nick=null;firstRead=true;privatevoidnoticeDelUser()的客户端,本用户退出Stringmsg="#"

9、+this.nick;for(inti=0;i<clientVector.size();i+)if(clientVector.get(i).nick.equals(this.nick)=false)sendMsg(i,msg);privatevoiddelSocket()noticeDelUser();的客户端,本用户退出clientVector.remove(this);clientVector中移除本线程trysocket.close();System.out.println(socket.getInetAddress()+"catch(IOExceptioncloseEr

10、ror)privatevoidnoticeAddUser()的客户端,本用户进入Stringmsg="#"+this.nick;for(inti=0;i<clientVector.size();i+)sendMsg(i,msg);privatevoidrequestAllUser()他有用户信息intindex=0;inti=0;for(i=0;i<clientVector.size();i+)if(clientVector.get(i).nick.equals(this.nick)break;index=i;for(i=0;i<clientVector.

11、size();i+)if(index!=i)Stringmsg="#"+clientVector.get(i).nick;sendMsg(index,msg);privateStringmsgForward(Stringmsg)息转发Stringname;昵称StringtempMsg;发数据if(firstRead=true)到数据inti;for(i=0;i<clientVector.size();i+)存在if(clientVector.get(i).nick.equals(msg)=true)break;if(i>=clientVector.size()

12、nick=msg;clientVector中添加本线程信息msg="#您使用的昵称:"+msg;有线程的客户端,本用户进入noticeAddUser();有用户信息clientVector.add(this);requestAllUser();firstRead=false;elsemsg="#您输入的昵称已经存在,请重新输入:存在,发送系统提示returnmsg;if(msg.startsWith("!")=true)/对接收到的信/存放目的用户/存放生成的转/若为第一次收/检查昵称是否/昵称不存在则:/在/并通告所/以及请求其他/昵称/若客

13、户端发送密语name=msg.substring(1,msg.indexOf('');/获得目的用户昵称,生成发送信息tempMsg=this.nick+"悄悄对"+name+"说:rnt"+msg.substring(msg.indexOf('');elsetempMsg=this.nick+":rnt"+msg;/右为全体聊天name="610665c2a05631a7bc460993bae36ee6"/此name为特殊值,专指全体聊天if(name.equals("6

14、10665c2a05631a7bc460993bae36ee6")=false)/若为密语inti=0;for(;i<clientVector.size();i+)线程在clientVector中的位置if(clientVector.get(i).nick.equals(name)=true)break;if(i>=clientVector.size()客户线程,则返回系统提示msg="#您所发送的用户名昵称不存在!"elsesendMsg(i,tempMsg);线程并转发else体转发inti=0;for(;i<clientVector.siz

15、e();i+)sendMsg(i,tempMsg);returnmsg;privatevoidsendMsg(intindex,Stringmsg)发,msg为转发信息SockettempSocket=clientVector.get(index).socket;/查找目的客户/若找不到目的/找到目的客户/为全体聊天,全/向特定客户转/index为客户在clientVector中位置tryPrintWriterpw=newPrintWriter(tempSocket.getOutputStream(),true);pw.println(msg);catch(IOExceptionprintEr

16、ror)publicvoidrun()/建立读写流Stringmsg=null;InputStreamReaderisr=null;BufferedReaderbr=null;try(isr=newInputStreamReader(socket.getInputStream();br=newBufferedReader(isr);catch(IOExceptioninOutError)System.out.println("无法与客户建立流!”);delSocket();return;dotrymsg=br.readLine();catch(IOExceptionreadError

17、)System.out.println("读取流数据错误!”);delSocket();return;System.out.println(msg);msg=msgForward(msg);据if(msg.startsWith("#")=true)返回,则返回系统提示tryPrintWriterPrintWriter(socket.getOutputStream(),true);pw.println(msg);catch(IOExceptionprintError)while(true);publicclassChatServerpublicstaticvoidm

18、ain(Stringargs)ServerSocketserverSocket=null;Socketsocket=null;SocketThreadst;try/处理读取的数/若有系统提示pw=new/监听端口8324serverSocket=newServerSocket(8324);System.out.println("服务器启动成功,正在监听8324端口!”);catch(IOExceptione)System.out.println("不能使用端口8324,无法启动服务器!”);return;while(true)trysocket=serverSocket.a

19、ccept();立Socketcatch(IOExceptione)System.out.println("不能建"+socket.getInetAddress().toString()+"/"+socket.getPort();st=newSocketThread(socket);System.out.println("建立"+socket.getInetAddress().toString()+"/"+socket.getPort();st.start();客户端ChartClient主要代码:packagec

20、h02;privatevoidinitSocket()trytransferSocket=newSocket("localhost”,8324);连接/获得连接,并建立连接:/创建新线程连接:/开始新线程/对socket的初始化/与服务器建立ReceiveThreadrt=newReceiveThread(transferSocket,this);rt.start();/开启新线程用于读取数据流catch(IOExceptioncreateError)/出现错误则退出程序welcomeInfo.setText("无法连接服务器!”);trytransferSocket.cl

21、ose();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("与服务器连

22、接已经断开!System.exit(0);catch(IOExceptioncloseError)System.exit(0);publicvoidaddNewMsg(Stringmsg)中追加数据chatRecord.append(msg+"rn");publicvoidsetWelcome(Stringmsg)welcomeInfo值welcomeInfo.setText(msg);publicvoidwindowIconified(WindowEvente)publicvoidwindowClosed(WindowEvente)publicvoidwindowDeac

23、tivated(WindowEvente)publicvoidwindowActivated(WindowEvente)publicvoidwindowClosing(WindowEvente)System.exit(0);publicvoidwindowDeiconified(WindowEvente)publicvoidwindowOpened(WindowEvente)publicvoidkeyPressed(KeyEvente)监视switch(e.getKeyCode()caseKeyEvent.VK_ENTER:信息sendMsg();信息break;caseKeyEvent.VK

24、_CANCEL:/对输出流的初!");/向chatRecord/改变/窗体关闭事件/对键盘事件的/回车键,就发送/向服务器发送/esc键则,friendList选中第0项friendList.select(0);transName.setText("发"+friendList.getSelectedItem().toString();break;default:publicvoidkeyTyped(KeyEvente)publicvoidkeyReleased(KeyEvente)publicvoiditemStateChanged(ItemEvente)frie

25、ndList选中项变化if(e.getSource().equals(friendList)transName值transName.setText("发"+friendList.getSelectedItem().toString();publicvoidtextValueChanged(TextEvente)字符多余100000if(chatRecord.getText().length()>100000)/监视/改变送给:/若chatRecod/则清除部分历chatRecord.setText(chatRecord.getText().substring(chat

26、Record.getText().indexOf("rn")+2);publicvoidactionPerformed(ActionEvente)sendButton则发送信息if(e.getSource()=sendButton)sendMsg();publicvoidsendMsg()/向服务器发送信息if(msgEditor!=null)if(friendList.getSelectedIndex()=0)/发送全体聊天信息socketWriter.println(msgEditor.getText();else/发送密语,并回socketWriter.println

27、("!”+friendList.getSelectedItem().toString()+"+msgEditor.getText();史记录,防止占用过大内存chatRecord.append(this.nick+""+friendList.getSelectedItem().toString()+"rnt"+msgEditor.getText()+"rn");else空,则系统提示chatRecord.append("!不能发送空消息rn");msgEditor.setText("&

28、quot;);置空classReceiveThreadextendsThread(类Socketsocket;socketClientwindowsclientwindow;ReceiveThread(Sockets,ClientWindowscw)(socket=s;clientWindow=cw;publicvoidrun()(Stringmsg=null;BufferedReaderbr=null;try(br=newInputStreamReader(socket.getInputStream();悄悄说/若发送信息为/将发送信息栏/监视输入流的/连接服务器的/主窗口/初始化/建立输入

29、流BufferedReader(newcatch(IOExceptionReadError)(clientWindow.setWelcome("读入流建立错误,程序关闭!”);try(socket.close();clientWindow.setWelcome("与服务器连接已经断开!”);System.exit(O);catch(IOExceptioncloseError)System.exit(O);while(true)/读取数据流的信息try/获得信息msg=br.readLine();catch(IOExceptione)(trysocket.close();cl

30、ientWindow.setWelcome("与服务器连接已经断开!System.exit(0);catch(IOExceptioncloseError)System.exit(0);msg=msgChange(msg);/信息if(msg!=null)clientWindow.addNewMsg(msg);/天新聊天内容privateStringmsgChange(Stringmsg)if(msg.startsWith("#”)/户的信息for(inti=1;i<clientWindow.friendList.getItemCount();i+)!");转

31、变读取到的向聊天窗口添删除摸一个用if(clientWindow.friendList.getItem(i).toString().equals(msg.substring(3)clientWindow.friendList.remove(i);clientWindow.friendList.select(0);returnnull;elseif(msg.startsWith("#")/增加某一个用户信息clientWindow.friendList.add(msg.substring(2);clientWindow.friendList.select(0);returnn

32、ull;elseif(msg.startsWith("#")/系统提示msg="!”+msg.substring(1);if(msg.startsWith("!您使用的昵称:")clientWindow.nick=msg.substring(8);returnmsg;设计结果与分析(可以加页):运行ChatServer服务端e:PRO<5RAlJCREATlGE200L«(e服务器启动成功.正在监听昭宣端口!,运行ChatClient端的界面如下图:当打开两个或者多个客户端时:实现多人会话或者一对一的会话,界面如下图全沁日凝矢d

33、程序富慕添赫云嘘他人獴想篷用的昵称并发送!您使用的昵称Ms如1wls002:fflsOOOSOOwlsOQSi122313wls002;/123143可族唳小程序好友列表:所有人wls002wls003!请植入您想猿用的昵称并麦!您使用的昵祢:MM03wls002:wLsOCwlsOOSs1223110000好友;wIsOiwlsOi!谚值人霞想便用的昵称并发送K!您使用的昵秘成网2wls002iwlsOOOOOOwls003:122313wls002;123143EePILOGRA*lJC-ltEAT-lGE200Lexe应务器启动成功,正在监听的勇端口建接!/127.».0.1/53578ulstiHl建立注接;/127-0.0,1X53574uls602建立莲接:Z127-B-0-1/5357Suls0312H313123143私聊即点击想要私聊的用户名即可;冬心职天小程序院壅入笈想便用的昵称并发送:!您使用的昵felsOOlvlsOOS:tjlsOOO

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论