《某学院面向对象程序设计实训报告20464.docx》由会员分享,可在线阅读,更多相关《某学院面向对象程序设计实训报告20464.docx(54页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、广西科技大学鹿山学院课程设计报告 广西科技大大学鹿山学学院面向对象程程序设计实实训报告题 目: 网络中国国象棋 系 别: 电气气与计算机机工程系 专业班级: 计计软1411班 姓 名: 邓康言 学 号: 2011414009 成绩评定: 指导教师签签字: 20116 年 1 月10 日53广西科技大学鹿山学院java实训报告目录目录1、需求求分析11.1 开发的背背景11.2 算法11.3 要求12、总体体分析与设设计12.1 总体设设计方案12.2 功能描述述22.2.11服务器端端22.2.22客户端22.3 算法设计计-32.5 系统流程程图-43、 数数据结构设设计43.1 功能模模块
2、的设计计43.1.11 服务务器端框架架类设计43.1.22 服务器器线程设计计83.1.33 服务器器代理线程程设计83.1.44 棋子的的开发类设设计133.1.55 客户端端的框架类类设计143.1.66 客户端端的框架类类设计163.1.77 棋子的的规则类设设计193.1.88 棋盘的的规则类设设计224、系统实实现264.1服务务器端界面面264.2客户户端界面264.3 未未启动服务务器,客户户端连接失失败274.4服务务器启动274.5 服服务器启动动客户端成成功连接284.6 显显示在线用用户284.7 不不允许重名名294.8发起起挑战294.9拒绝绝挑战304.10接接受
3、挑战304.11 对战走走棋314.12 不能向向正在下棋棋的用户发发起挑战314.13 赢棋324.14 认输324.15 服务器关关闭33总 结33参考文献341、 需求分析1.1 开发的背背景中国象棋棋有着悠久久的历史,象象棋爱好者者更是不计计其数,但但是由于人人们的工作作地点从、时时间的限制制,原始的的那种面对对面的下棋棋方式已经经不再适应应人们的生生活,人们们已经开始始走向网络络象棋博弈弈网络象棋棋有着很多多的优点,通通过网络象象棋,对弈弈的双方是是网络上任任意的两个个象棋爱好好者,甚至至是不认识识。网络让让对弈的范范围更加的的广泛,让让象棋爱好好者可以与与更多的象象棋爱好者者切磋棋
4、艺艺。1.2 算法指定服服务器端口口号支持多多人同时在在线显示在线线用户信息息显示当前前在线所有有用户从在线用用户列表中中选择玩家家进行挑战战接受或拒拒绝挑战1.3 要求用Jaava语言言实现系统统,源程序序要有适当当的注释,使使程序容易易阅读函数功功能要划分分好(结构构化程序设设计)可以增增加新功能能模块2、 总体分析与与设计2.1 总体设计计方案系统功能能模块图: 2.2 功能描述述 2.2.11服务器端端可以指定定服务器端端口号。可以支持持多人同时时在线。可以显示示在线用户户信息。不允许玩玩家同名2.2.22客户端 能够通通过主机IIP号及端端口号登陆陆到服务器器。可以显示示当前在线线所
5、有用户户。可以从在在线用户列列表中选择择玩家进行行挑战。可以接受受或拒绝挑挑战。如果对方方在和其他他玩家对弈弈中,则应应该给与相相应的提示示信息。象棋规则则一定要严严密。棋子样式式采用最普普通的橡胶胶式象棋。棋棋子为黑色色,字为红红色和白色色2.3 算法设计计- 本程序功能能模块根据据程序设计计的需要。综综合程序的的实用性、智智能化的考考虑。将程程序划分为为8个模块块来写。(1)服务务器端的框框架设计类类(2)服务务器线程类类(3)服务务器代理线线程类(4)棋子子类的开发发类(5)客户户端的框架架设计类(6)客户户端线程类类(7)棋子子的规则类类(8)棋盘盘的设计类类2.5 系统流程程图- 3
6、、 数数据结构设设计3.1 功能模模块的设计计3.1.11 服务务器端框架架类设计imporrt jaava.uutil.*;imporrt jaava.aawt.*;/界界面包imporrt jaava.aawt.eeventt.*;/事件处处理包imporrt jaavax.swinng.*;/图形形化界面包包imporrt javaax.swwing.evennt.*;/图形形化界面包包事件进行行处理imporrt jaava.nnet.*;/网网络包imporrt javaa.io.*;/IO流publiic classs Servver exteends JFraame iimple
7、ementts AcctionnListtenerrJLabbel jjlPorrt=neew JLLabell(端 口 号);/创建提示示输入端口口号标签JTexxtFieeld jjtfPoort=nnew JJTexttFielld(99457);/用于输入入端口号的的文本框JButtton jbSttart=new JJButtton(启动);/创创建启动动按钮JButtton jbSttop=nnew JJButtton(关闭);/创创建关闭闭按钮JPannel jjps=nnew JJPaneel();/创建建一个JPPanell对象JLisst jllUserrOnliine=n
8、new JLisst();/创建建用于显示示当前用户户的JLiistJScrrollPPane jspxx=neww JSccrolllPanee(jlUUserOOnlinne);/将显示示当前用户户的JLiist放在在JScrrollPPane中中JSpllitPaane jjspz=new JJSpliitPanne(JSSplittPanee.HORRIZONNTAL_SPLIIT,jsspx,jjps);/创建建JSpllitPaane对象象ServverSoockett ss;/声明明ServverSoockett引用ServverThhreadd st;/声明明ServverTh
9、hreadd引用Vecttor oonlinneLisst=neew Vecttor();/创创建存放当当前在线用用户的Veectorr对象publlic SServeer()thiis.innitiaalCommponeent();/初初始化控件件thiis.adddLissteneer();/为相相应的控件件注册事件件监听器thiis.innitiaalFraame();/初初始化窗体体thiis.seetDeffaulttClosseOpeeratiion(JJFramme.EXXIT_OON_CLLOSE);publlic voidd iniitiallCompponennt()jps
10、s.settLayoout(nnull);/设设为空布局局jlPPort.setBBoundds(200,20,50,220);jpss.addd(jlPPort);/添添加用于提提示输入端端口号的标标签thiis.jttfPorrt.seetBouunds(85,220,600,20);jpss.addd(thiis.jttfPorrt);/添加用用于输入端端口号的文文本框thiis.jbbStarrt.seetBouunds(18,550,600,20);jpss.addd(thiis.jbbStarrt);/添加开始按按钮thiis.jbbStopp.settBounnds(885,50
11、0,60,20);jpss.addd(thiis.jbbStopp);/添加关关闭按钮钮thiis.jbbStopp.settEnabbled(falsse);/将关关闭按钮钮设为不可可用publlic voidd adddListtenerr()thiis.jbbStarrt.adddActtionLListeener(thiss);/为开始始按钮注注册事件监监听器thiis.jbbStopp.adddActiionLiistenner(tthis);/为为关闭按钮注册册事件监听听器publlic voidd iniitiallFramme()thiis.seetTittle(象棋-服务器端
12、端);/设置窗窗体标题Imaage iimagee=neww ImaageIccon(ico.gif).geetImaage();thiis.seetIcoonImaage(iimagee);thiis.addd(jsspz);/将JJSpliitPanne添加到到窗体中jsppz.seetDivviderrLocaationn(2500);jsppz.seetDivviderrSizee(4);/设置置分割线的的位置和宽宽度thiis.seetBouunds(20,220,4220,3220);thiis.seetVissiblee(truue);/设置可可见性thiis.adddWinnd
13、owLListeener(/为窗窗体关闭事事件注册监监听器neew WiindowwAdappter()ppubliic voidd winndowCClosiing(WWindoowEveent ee)if(stt=nuull)/当服务务器线程为为空时直接接退出Systtem.eexit(0);/退出retuurn;tryVecttor vv=onllineLList;int ssize=v.siize();for(int ii=0;iisizze;i+)/当不不为空时,向向在线用户户发送离线线信息ServverAggentTThreaad teempSaat=(SServeerAgeent
14、Thhreadd)v.gget(ii);temppSat.doutt.wriiteUTTF();temppSat.flagg=fallse;/终止服服务器代理理线程st.fflag=falsse;/终止服务务器线程st=nuull;ss.cclosee();/关闭SServeerSoccketv.cllear();/将在线用用户列表清清空refrreshLList();/刷新列表表catcch(Exxcepttion ee)ee.pprinttStacckTraace();Systtem.eexit(0);/退出);publlic voidd acttionPPerfoormedd(Actti
15、onEEventt e)if(e.geetSouurce()=tthis.jbSttart)/当单击启动按按钮时thhis.jjbStaart_eeventt();elsse if(e.getSSourcce()=thiis.jbbStopp)/单击关关闭按钮钮后thhis.jjbStoop_evvent();publlic voidd jbSStartt_eveent()/单单击启动动按钮的的业务处理理代码intt porrt=0;tryy/获得用户户输入的端端口号,并并转化为整整型poort=IIntegger.pparseeInt(thiss.jtfPPort.getTText().tr
16、rim();cattch(EExcepptionn ee)/端口号不不是整数,给给出提示信信息JOOptioonPanne.shhowMeessaggeDiaalog(thiss,端口口号只能是是整数,错误, JOpptionnPanee.ERRROR_MMESSAAGE);reeturnn;if(portt655535|portt0)/断口号不不合法,给给出提示信信息JOOptioonPanne.shhowMeessaggeDiaalog(thiss,端口口号只能是是0-655535的的整数,错误, JOpptionnPanee.ERRROR_MMESSAAGE);reeturnn;tryy
17、thhis.jjbStaart.ssetEnnableed(faalse);/将将开始按钮钮设为不可可用thhis.jjtfPoort.ssetEnnableed(faalse);/将将用于输入入端口号的的文本框设设为不可用用thhis.jjbStoop.seetEnaabledd(truue);/将停止止按钮设为为可用sss=neww SerrverSSockeet(poort);/创建建ServverSoockett对象stt=neww SerrverTThreaad(thhis);/创建建服务器线线程stt.staart();/启启动服务器器线程/给出服务务器启动成成功的提示示信息JOO
18、ptioonPanne.shhowMeessaggeDiaalog(thiss,服务务器启动成成功,提示, JOpptionnPanee.INFFORMAATIONN_MESSSAGEE);cattch(EExcepptionn ee)/给出服务务器启动失失败的提示示信息JOOptioonPanne.shhowMeessaggeDiaalog(thiss,服务务器启动失失败,错误, JOpptionnPanee.ERRROR_MMESSAAGE);thhis.jjbStaart.ssetEnnableed(trrue);/将开开始按钮设设为可用thhis.jjtfPoort.ssetEnnab
19、leed(trrue);/将用用于输入端端口号的文文本框设为为可用thhis.jjbStoop.seetEnaabledd(fallse);/将停停止按钮设设为不可用用publlic voidd jbSStop_evennt()/单单击关闭闭按钮的的业务处理理代码tryyVeectorr v=oonlinneLisst;innt siize=vv.sizze();foor(int ii=0;iisizze;i+)/向在线线用户发送送离线信息息SServeerAgeentThhreadd temmpSatt=(SeerverrAgenntThrread)v.geet(i);ttempSSat.d
20、dout.writteUTFF();ttempSSat.fflag=falsse;/关闭服务务器代理线线程stt.flaag=faalse;/关闭闭服务器线线程stt=nulll;sss.cloose();/关关闭SerrverSSockeetv.cleaar();/将在在线用户列列表清空reefresshLisst();/刷新新列表thhis.jbSStartt.settEnabbled(truee);/将开始按按钮设为可可用 thiss.jtffPortt.settEnabbled(truee);/将用于输输入端口号号的文本框框设为可用用 thiis.jbbStopp.settEnabbl
21、ed(falsse);/将停止止按钮设为为不可用cattch(EExcepptionn ee)eee.priintSttackTTracee();publlic voidd reffreshhListt()/更更新在线用用户列表的的业务处理理代码Vecctor v=neew Vecttor();intt sizze=thhis.oonlinneLisst.siize();forr(int ii=0;iisizze;i+)/遍历在线线列表SeerverrAgenntThrread temppSat=(SerrverAAgenttThreead)tthis.onliineLiist.gget(ii
22、);Sttringg temmps=ttempSSat.ssc.geetIneetAdddresss().ttoStrring();teemps=tempps+|+teempSaat.geetNamme();/获得得所需信息息v.add(tempps);/添加到到Vecttor中thiis.jllUserrOnliine.ssetLiistDaata(vv);/更新列表表数据publlic stattic voidd maiin(Sttringg arggs)neww Serrver();说明:此服服务器端类类既为服务务器的运行行类,用户户通过该类类进入服务务器的主界界面。进行行相应的操操作。
23、3.1.22 服务器器线程设计计/*服务器器线程*/imporrt javaa.utiil.*;imporrt java.awt.*;imporrt javaa.awtt.eveent.*;imporrt javaax.swwing.*;imporrt javaax.swwing.evennt.*;imporrt jaava.nnet.*;imporrt javaa.io.*;publiic classs SeerverrThreead eextennds TThreaadServver ffatheer; /声明SServeer的引用用ServverSoockett ss;/声明明Servv
24、erSoockett的引用boollean flagg=truue;/线程存在在为truuepubllic SServeerThrread(Servver ffatheer)/构构造器thiis.faatherr=fatther;ss=fathher.sss;/和服务器器端关联publlic voidd runn()whiile(fflag)/定义义一个死循循环。为ffalsee时跳出trrySSockeet scc=ss.acceept();/等等待客户端端连接SServeerAgeentThhreadd satt=neww SerrverAAgenttThreead(ffatheer,sc
25、c);ssat.sstartt();/创建并并启动服务务器代理线线程caatch(Exceeptioon e)/trry caatch捕捕获异常ee.priintSttackTTracee();/打印异异常,可有有可无类功能说明明:服务器器线程类在在服务器启启动后创建建并启动的的第一个线线程,该线线程主要用用于接收客客户端的连连接,并为为每一个连连接分配一一个服务器器代理线程程。3.1.33 服务器器代理线程程设计【部分代码码(过长不不适复制完完)】:/*服务器器代理线程程*/先想到到需要用什什么函数imporrt jaava.uutil.*;imporrt jaava.aawt.*;/界界面
26、包imporrt jaava.aawt.eeventt.*;/事件处处理包imporrt jaavax.swinng.*;/图形形化界面包包imporrt jaavax.swinng.evvent.*;/图形化界界面包事件件进行处理理imporrt jaava.nnet.*;/网网络包imporrt jaava.iio.*;/IOO流publiic cllass ServverAggentTThreaad exxtendds Thhreadd /同同服务器类类一样Servver ffatheer;/声明Seerverr的引用Sockket ssc;/声明Soockett的引用。用用他来与客客户
27、端一一一对应。分分配给它资资源DataaInpuutStrream din;/声明明数据输入入流与输出出流的引用用DataaOutpputSttreamm douut;boollean flagg=truue;/控制线程程的标志位位publlic SServeerAgeentThhreadd(Serrver fathher,SSockeet scc)thiis.faatherr=fatther;thiis.scc=sc;tryydiin=neew DaataInnputSStreaam(scc.gettInpuutStrream();/创建数数据输入流流doout=nnew DDataOOut
28、puutStrream(sc.ggetOuutputtStreeam();/创建数据据输出流cattch(EExcepptionn e)e.prinntStaackTrrace();publlic vvoid run()whiile(fflag)/线程程在存活期期。就是死死循环。trrySStrinng mssg=diin.reeadUTTF().trimm();/接收客客户端传来来的信息iif(mssg.sttartssWithh()/收到新用用户的信息息thiss.nicck_naame(mmsg);eelse if(mmsg.sstarttsWitth()/收到用用户离开的的信息this
29、s.cliient_leavve(mssg);eelse if(mmsg.sstarttsWitth()/收到到用户发出出的挑战信信息thiss.tiaao_zhhan(mmsg);eelse if(mmsg.sstarttsWitth()/收到接受受挑战的信信息thiss.tonng_yii(msgg);eelse if(mmsg.sstarttsWitth()/收到到拒绝挑战战的信息thiss.buttong_yi(mmsg);eelse if(mmsg.sstarttsWitth()/收到被被挑战者忙忙的信息thiss.bussy(mssg);eelse if(mmsg.sstartts
30、Witth()/收到走走棋的信息息thiss.movve(mssg);eelse if(mmsg.sstarttsWitth()/收收到某用户户认输的信信息thiss.rennshu(msg);caatch(Exceeptioon e)ee.priintSttackTTracee();publlic vvoid nickk_namme(Sttringg msgg)tryySttringg namme=mssg.suubstrring(13);/获得得用户的昵昵称thhis.ssetNaame(nname);/用用该昵称给给该线程取取名Veectorr v=ffatheer.onnlineeLi
31、stt;/获获得在线用用户列表boooleaan issChonngMinng=faalse;innt siize=vv.sizze();/获得得用户列表表的大小foor(innt i=0;isizee;i+)/遍历列列表,查看看是否已经经有该用户户名SServeerAgeentThhreadd temmpSatt=(SeerverrAgenntThrread)v.geet(i);iif(teempSaat.geetNamme().equaals(nname)isChhongMMing=truee;/有有重名,将将标志位设设为truuebreaak;iff(isCChonggMingg=trr
32、ue)/如果重重名ddout.writteUTFF();/将重名名信息发送送给客户端端ddin.cclosee();/关闭数数据输入流流ddout.closse();/关闭闭数据输出出流ssc.cllose();/关闭Soockettfflag=falsse;/终止该服服务器代理理线程ellse/如果不重重名vv.addd(thiis);/将该线线程添加到到在线列表表ffatheer.reefresshLisst();/刷新新服务器在在线信息列列表SStrinng niickLiistMssg=;ssize=v.siize();/获获得在线列列表大小ffor(iint ii=0;iisizze
33、;i+)ServverAggentTThreaad teempSaat=(SServeerAgeentThhreadd)v.gget(ii);nickkListtMsg=nickkListtMsg+|+temppSat.getNName();/将在在线列表内内容住组织织成字符串串nnickLListMMsg=+nnickLListMMsg;VVectoor teempv=fathher.oonlinneLisst;ssize=temppv.siize();ffor(iint ii=0;iisizze;i+)/遍历历在线列表表ServverAggentTThreaad saatTemmp=(SS
34、erveerAgeentThhreadd)temmpv.gget(ii);satTTemp.doutt.wriiteUTTF(niickLiistMssg);/将最新新的列表信信息发送到到各个客户户端if(ssatTeemp!=thiss)/给给其他客户户端发送新新用户上线线的信息satTTemp.doutt.wriiteUTTF(+thiss.gettNamee()+上线了.);cattch(IIOExcceptiion ee)e.prinntStaackTrrace();服务器代理理线程类功功能及实现现:服务器器代理线程程主要是用用于接收客客户端传来来的信息,并并将该信息息转发给相相对应的
35、另另一个客户户端。服务务器为所有有客户端都都分配了一一个该类线线程,单独独为特定客客户端进行行服务。同同时每一个个服务器代代理线程都都有能位移移标示其的的名称3.1.44 棋子的的开发类设设计imporrt jaava.uutil.*;imporrt jaava.aawt.*;imporrt jaavax.swinng.*;publiic cllass QiZii/定义义棋子的属属性privvate Coloor coolor;/棋子子的颜色privvate Striing nname;/棋子子的名字,即即是什么棋棋privvate int x;/所在的xx方向位置置将用二维维数组实现现pri
36、vvate int y;/所在的yy方向位置置 将 用二维数数组实现privvate boollean focuus=faalse;/是否否被选中,以以至于只能能选一子走走publlic QQiZi()/无无参函数publlic QQiZi(Coloor coolor,Striing nname,int x,innt y)/颜色色,名字,坐坐标/构造造器thiis.coolor=coloor;thiis.naame=nname;thiis.x=x;thiis.y=y;thiis.foocus=falsse;/为未选中中状态publlic CColorr gettColoor()/获得棋棋子颜色
37、的的方法retturn thiss.collor;publlic vvoid setCColorr(Collor ccolorr)/设设置棋子颜颜色的方法法thiis.coolor=coloor;publlic SStrinng geetNamme()/获得棋棋子名字的的方法retturn thiss.namme;publlic vvoid setNName(Striing nname)/设置置棋子名字字的方法thiis.naame=nname;publlic iint ggetX()/获获得棋子xx方向位置置的方法retturn thiss.x;publlic vvoid setXX(intt x)/设置棋棋子x方向向位置的方方法thiis.x=x;publlic iint ggetY()/获获得棋子yy方向位置置的方法retturn thiss.y;publlic vvoid setYY(intt y)/设置棋棋子y方向向位置的方方法thiis.y=y;publlic bbooleean ggetFoocus()/判判断棋子是是否被选中中的方法retturn focuus;publlic vvoid setFFocuss(boooleann foccus)/设置棋棋子选中状状态的方法法thiis.foocus
限制150内