版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、廣西科技大學(xué)鹿山學(xué)院面向?qū)ο蟪绦蛟O(shè)計(jì)實(shí)訓(xùn)報(bào)告題 目網(wǎng)絡(luò)中國(guó)象棋系 另電氣與計(jì)算機(jī)工程系專業(yè)班級(jí): 計(jì)軟141班姓 名:鄧康言學(xué) 號(hào):20141409成績(jī)?cè)u(píng)定:指導(dǎo)教師簽字:2016 年 1 月 10 日目錄目錄1、需求分析 21.1 開發(fā)的背景 21.2 算法 21.3 要求 32、總體分析與設(shè)計(jì) 32.1 總體設(shè)計(jì)方案 32.2 功能描述 42.2.1服務(wù)器端 42.2.2客戶端 42.3 算法設(shè)計(jì)- 42.5 系統(tǒng)流程圖- 53、數(shù)據(jù)結(jié)構(gòu)設(shè)計(jì) 53.1 功能模塊的設(shè)計(jì) 53.1.1 服務(wù)器端框架類設(shè)計(jì) 53.1.2服務(wù)器線程設(shè)計(jì) 93.1.3服務(wù)器代理線程設(shè)計(jì) 93.1.4棋子的開發(fā)類設(shè)計(jì)
2、 133.1.5客戶端的框架類設(shè)計(jì) 153.1.6客戶端的框架類設(shè)計(jì) 173.1.7棋子的規(guī)則類設(shè)計(jì) 203.1.8棋盤的規(guī)則類設(shè)計(jì) 234、系統(tǒng)實(shí)現(xiàn) 54.1服務(wù)器端界面 264.2客戶端界面 274.3未啟動(dòng)服務(wù)器,客戶端連接失敗 274.4服務(wù)器啟動(dòng) 284.5服務(wù)器啟動(dòng)客戶端成功連接 294.6顯示在線用戶 294.7 不允許重名 304.8發(fā)起挑戰(zhàn) 304.9拒絕挑戰(zhàn) 314.10接受挑戰(zhàn) 314.11 對(duì)戰(zhàn)走棋 324.12 不能向正在下棋的用戶發(fā)起挑戰(zhàn) 324.13 贏棋 334.14 認(rèn)輸 334.15服務(wù)器關(guān)閉 34總結(jié) 34參考文獻(xiàn) 351、需求分析1.1 開發(fā)的背景中國(guó)象
3、棋有著悠久的歷史,象棋愛好者更是不計(jì)其數(shù),但是由于人們的工作地點(diǎn)從、時(shí)間 的限制,原始的那種面對(duì)面的下棋方式已經(jīng)不再適應(yīng)人們的生活,人們已經(jīng)開始走向網(wǎng)絡(luò) 象棋博弈網(wǎng)絡(luò)象棋有著很多的優(yōu)點(diǎn),通過網(wǎng)絡(luò)象棋,對(duì)弈的雙方是網(wǎng)絡(luò)上任意的兩個(gè)象 棋愛好者,甚至是不認(rèn)識(shí)。網(wǎng)絡(luò)讓對(duì)弈的范圍更加的廣泛,讓象棋愛好者可以 與更多的象棋愛好者切磋棋藝。1.2 算法指定服務(wù)器端口號(hào)支持多人同時(shí)在線顯示在線用戶信息顯示當(dāng)前在線所有用戶從在線用戶列表中選擇玩家進(jìn)行挑戰(zhàn)接受或拒絕挑戰(zhàn)1.3 要求用Java語言實(shí)現(xiàn)系統(tǒng),源程序要有適當(dāng)?shù)淖⑨?,使程序容易閱讀 函數(shù)功能要?jiǎng)澐趾茫ńY(jié)構(gòu)化程序設(shè)計(jì))可以增加新功能模塊2、總體分析與設(shè)計(jì)
4、2.1總體設(shè)計(jì)方案-系統(tǒng)功能模塊圖:2.2 功能描述2.2.1服務(wù)器端可以指定服務(wù)器端口號(hào)。可以支持多人同時(shí)在線。可以顯示在線用戶信息。不允許玩家同名2.2.2客戶端能夠通過主機(jī)IP號(hào)及端口號(hào)登陸到服務(wù)器??梢燥@示當(dāng)前在線所有用戶??梢詮脑诰€用戶列表中選擇玩家進(jìn)行挑戰(zhàn)??梢越邮芑蚓芙^挑戰(zhàn)。如果對(duì)方在和其他玩家對(duì)弈中,則應(yīng)該給與相應(yīng)的提示信息。 象棋規(guī)則一定要嚴(yán)密。棋子樣式采用最普通的橡膠式象棋。棋子為黑色,字為紅色和白色2.3算法設(shè)計(jì)-本程序功能模塊根據(jù)程序設(shè)計(jì)的需要。綜合程序的實(shí)用性、智能化的考慮。將程序劃分 為8個(gè)模塊來寫。(1) 服務(wù)器端的框架設(shè)計(jì)類(2) 服務(wù)器線程類(3) 服務(wù)器代理
5、線程類(4) 棋子類的開發(fā)類(5) 客戶端的框架設(shè)計(jì)類(6) 客戶端線程類(7) 棋子的規(guī)則類(8) 棋盤的設(shè)計(jì)類2.5系統(tǒng)流程圖-3、數(shù)據(jù)結(jié)構(gòu)設(shè)計(jì)3.1功能模塊的設(shè)計(jì)3.1.1服務(wù)器端框架類設(shè)計(jì)import java.util.*;import java.awt.*;/ 界面包import java.awt.event.*;/事件處理包import javax.swing.*;/圖形化界面包import javax.swing.event.*:/圖形化界面包事件進(jìn)行處理import .*;/ 網(wǎng)絡(luò)包import java.io.*;/IO流public class Server extend
6、s JFrame implements ActionListenerJLabel jlPort= new JLabel( 端 口 號(hào));/創(chuàng)建提示輸入端口號(hào)標(biāo)簽JTextField jtfPort=new JTextField(9457);用于輸入端口號(hào)的文本框JButton jbStart=new JButton(”啟動(dòng));/ 創(chuàng)建啟動(dòng)按鈕JButton jbStop= new JButton(” 關(guān)閉);/ 創(chuàng)建關(guān)閉按鈕JPanel jps= new JPanel();/ 創(chuàng)建一個(gè) JPanel 對(duì)象JList ilUserOnline=new JList();/創(chuàng)建用于顯示當(dāng)前用戶的JL
7、istJScrollPane jspx=JSplitPane jspz= 對(duì)象放在 JScrollPane 中創(chuàng)建 JSplitPanenew JScrollPane(jlUserOnline);/ new JSplitPane(JSplitPane.將顯示當(dāng)前用戶的JListHORIZONTAL_SPLIT,jspx,jps);引用引用創(chuàng)建存放當(dāng)前在線用戶的Vector對(duì)象ServerSocket ss;/ ServerThread st;/ Vector onlineList= public Server()聲明 ServerSocket 聲明 ServerThread new Vecto
8、r();/this .initialComponent();初始化控件this .addListener();/為相應(yīng)的控件注冊(cè)事件監(jiān)聽器this .initialFrame();初始化窗體this .setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); - public void initialComponent()jps.setLayout( null );/ 設(shè)為空布局jlPort.setBounds(20,20,50,20);jps.add(jlPort);/添加用于提示輸入端口號(hào)的標(biāo)簽this .jtfPort.setBounds(85,20
9、,60,20);jps.add(this .jtfPort);/添加用于輸入端口號(hào)的文本框this .jbStart.setBounds(18,50,60,20);jps.add(this .jbStart);/添加開始按鈕this .jbStop.setBounds(85,50,60,20);jps.add( this .jbStop);/ 添加關(guān)閉按鈕this .jbStop.setEnabled( false );/ 將關(guān)閉按鈕設(shè)為不可用public void addListener()this .jbStart.addActionListener(this );/ 為開始按鈕注冊(cè)事件監(jiān)
10、聽器this .jbStop.addActionListener(this );/ 為關(guān)閉按鈕注冊(cè)事件監(jiān)聽器 public void initialFrame()this .setTitle(” 象棋-服務(wù)器端);/設(shè)置窗體標(biāo)題Image image= new ImageIcon(ico.gif).getImage();this .setlconlmage(image);this .add(jspz);/ 將 JSplitPane 添加到窗體中jspz.setDividerLocation(250);jspz.setDividerSize(4);設(shè)置分割線的位置和寬度this .setBoun
11、ds(20,20,420,320);this .setVisible( true );/ 設(shè)置可見性this .addWindowListener(為窗體關(guān)閉事件注冊(cè)監(jiān)聽器new WindowAdapter()public void windowClosing(WindowEvent e)if (st= null )/當(dāng)服務(wù)器線程為空時(shí)直接退出System. exit (0);/ 退出return ;tryVector v=onlineList;int for size=v.size();(int i=0;i); tempSat.flag= false ;/終止服務(wù)器代理線程關(guān)閉 Server
12、Socket將在線用戶列表清空刷新列表st.flag= false ;/終止服務(wù)器線程 st= null ; ss.close();/ v.clear();/ refreshList();/catch (Exception ee)ee.printStackTrace();System. exit (0);/ 退出); publicvoidactionPerformed(ActionEvent e)(e.getSource()= this .jbStart)/當(dāng)單擊啟動(dòng)按鈕時(shí)this .jbStart_event(); -else if (e.getSource()= this .jbStop)
13、 /if單擊”關(guān)閉”按鈕后this .jbStop_event(); public/ int try void jbStart_event()單擊”啟動(dòng)”按鈕的業(yè)務(wù)處理代碼 port=0;parseInt (this .jtfPort.getText().trim();catch (Exception ee)/端口號(hào)不是整數(shù),JOptionPane.給岀提示信息showMessageDialogJOptionPane.(this ,端口號(hào)只能是整數(shù),”錯(cuò)誤,ERROR_MESSAGE/獲得用戶輸入的端口號(hào),并轉(zhuǎn)化為整型 port=Integer.if (port65535|port0)/ret
14、urn斷口號(hào)不合法,給岀提示信息(this ,端口號(hào)只能是0-65535的整數(shù),錯(cuò)誤,ERROR_MESSAGEJOptionPane. showMessageDialog JOptionPane.return trythisthisthis.jbStart.setEnabled( .jtfPort.setEnabled( .jbStop.setEnabled(false false true將開始按鈕設(shè)為不可用將用于輸入端口號(hào)的文本框設(shè)為不可用ss= new ServerSocket(port);/ st= new ServerThread( this );/ st.start();/啟動(dòng)服
15、務(wù)器線程);/);/);/將停止按鈕設(shè)為可用創(chuàng)建ServerSocket 對(duì)象創(chuàng)建服務(wù)器線程/給岀服務(wù)器啟動(dòng)成功的提示信息JOptionPane. showMessageDialogJOptionPane.(this ,服務(wù)器啟動(dòng)成功,”提示,INFORMATION_MESSAGEcatch (Exception ee)this.jbStart.setEnabled(true);/將開始按鈕設(shè)為可用this.jtfPort.setEnabled(true);/將用于輸入端口號(hào)的文本框設(shè)為可用this.jbStop.setEnabled(false);/將停止按鈕設(shè)為不可用(this ,服務(wù)器啟
16、動(dòng)失敗,”錯(cuò)誤,ERROR_MESSAGE/給岀服務(wù)器啟動(dòng)失敗的提示信息JOptionPane. showMessageDialogJOptionPane.void jbStop_event() public / try單擊”關(guān)閉”按鈕的業(yè)務(wù)處理代碼intfor/st.flag= false ;/關(guān)閉服務(wù)器線程 st= null ;ss.close();/v.clear();/ refreshList();/this .jbStart.setEnabled( .jtfPort.setEnabled( this .jbStop.setEnabled(catch (Exception ee)thi
17、s關(guān)閉 ServerSocket將在線用戶列表清空刷新列表true );/將開始按鈕設(shè)為可用true );/將用于輸入端口號(hào)的文本框設(shè)為可用false );/將停止按鈕設(shè)為不可用ee.printStackTrace(); publicvoid refreshList()更新在線用戶列表的業(yè)務(wù)處理代碼new Vector();size= this .onlineList.size();(int i=0;isize;i+)遍歷在線列表ServerAgentThread tempSat=(ServerAgentThread)String temps=tempSat.sc.getlnetAddress
18、().toString();/Vector v=intforthis .onlineList.get(i);Vector v=onlineList;size=v.size();(int i=0;i); tempSat.flag= false ;/關(guān)閉服務(wù)器代理線程temps=temps+|+tempSat.getName();獲得所需信息v.add(temps);/添加至H Vector 中更新列表數(shù)據(jù)this .jIUserOnline.set ListData(v);/public static void main(String args)new Server();說明:此服務(wù)器端類既為服
19、務(wù)器的運(yùn)行類,用戶通過該類進(jìn)入服務(wù)器的主界面。進(jìn)行相應(yīng)的操作。3.1.2服務(wù)器線程設(shè)計(jì)/*服務(wù)器線程*/import java.util.*;import java.awt.*;import java.awt.event.*;import javax.swing.*;import javax.swing.event.*;import .*;import java.io.*;public class ServerThread extends ThreadServer father; / 聲明 Server 的引用ServerSocket ss;聲明 ServerSocket 的引用boolean
20、 flag= true ;/ 線程存在為 truepublic ServerThread(Server father)/構(gòu)造器this .father=father;ss=father.ss;和服務(wù)器端關(guān)聯(lián)public void run()while (flag)/定義一個(gè)死循環(huán)。為 false時(shí)跳出trySocket sc=ss.accept(); 等待客戶端連接ServerAge ntThread sat=new ServerAge ntThread(father,sc);sat.start();/創(chuàng)建并啟動(dòng)服務(wù)器代理線程catch (Exception e)/try catch捕獲異常e
21、.pri ntStackTrace();打印異常,可有可無類功能說明:服務(wù)器線程類在服務(wù)器啟動(dòng)后創(chuàng)建并啟動(dòng)的第一個(gè)線程,該線程主要用于接收客戶端的連接,并為每一個(gè)連接分配一個(gè)服 務(wù)器代理線程。3.1.3服務(wù)器代理線程設(shè)計(jì)【部分代碼(過長(zhǎng)不適復(fù)制完)】:/*服務(wù)器代理線程*/先想到需要用什么函數(shù)import java.util.*;import java.awt.*;/界面包import java.awt.eve nt.*;事件處理包import javax.swi ng.*;/圖形化界面包import javax.swi ng.eve nt.*;圖形化界面包事件進(jìn)行處理import java.
22、 net.*;/網(wǎng)絡(luò)包import java.io.*;/IO流public class ServerAge ntThread exte nds Thread /同服務(wù)器類一樣Server father;/ 聲明 Server 的引用Socket sc;/ 聲明Socket的引用。用他來與客戶端對(duì)應(yīng)。分配給它資源Data In putStream di n;聲明數(shù)據(jù)輸入流與輸出流的引用DataOutputStream dout;boolean flag=true;/控制線程的標(biāo)志位public ServerAge ntThread(Server father,Socket sc)this.fa
23、ther=father;this.sc=sc;trydin=new DataI nputStream(sc.getl nputStream();創(chuàng)建數(shù)據(jù)輸入流dout=new DataOutputStream(sc.getOutputStream();創(chuàng)建數(shù)據(jù)輸出流catch(Excepti on e)e.pri ntStackTrace();public void run()while(flag)/線程在存活期。就是死循環(huán)。tryStri ng msg=di n.readUTF().trim();接收客戶端傳來的信息if(msg.startsWith()收到新用戶的信息this. nick_
24、 name(msg);收到用戶離開的信息else if(msg.startsWith()this.clie nt_leave(msg);else if(msg.startsWith() this.tiao_zha n( msg);else if(msg.startsWith() this.t on g_yi(msg);else if(msg.startsWith() this.but on g_yi(msg);收到用戶發(fā)出的挑戰(zhàn)信息收到接受挑戰(zhàn)的信息收到拒絕挑戰(zhàn)的信息else if(msg.startsWith() this.busy(msg);else if(msg.startsWith()
25、 this.move(msg);else if(msg.startsWith()收到被挑戰(zhàn)者忙的信息收到走棋的信息收到某用戶認(rèn)輸?shù)男畔his.re nshu(msg);catch(Excepti on e)e.pri ntStackTrace();public void n ick_ name(Stri ng msg)tryStri ng name=msg.substri ng(13);獲得用戶的昵稱this.setName( name);/用該昵稱給該線程取名Vector v=father.o nli neList;/獲得在線用戶列表boolea n isCh ongMin g=false
26、;int size=v.size();獲得用戶列表的大小for(i nt i=0;isize;i+)/遍歷列表,查看是否已經(jīng)有該用戶名ServerAge ntThread tempSat=(ServerAge ntThread)v.get(i);if(tempSat.getName().equals( name)isCho ngMi ng=true;有重名,將標(biāo)志位設(shè)為truebreak;if(isCho ngMi ng=true)如果重名dout.writeUTF(); 將重名信息發(fā)送給客戶端din .close(); dout.close(); sc.close();/ flag=fals
27、e;/else/如果不重名v.add(this);/關(guān)閉數(shù)據(jù)輸入流關(guān)閉數(shù)據(jù)輸出流關(guān)閉Socket終止該服務(wù)器代理線程將該線程添加到在線列表father.refreshList();/刷新服務(wù)器在線信息列表Stri ng n ickListMsg=;size=v.size();/獲得在線列表大小for(i nt i=0;isize;i+)ServerAge ntThread tempSat=(ServerAge ntThread)v.get(i);n ickListMsg=nickListMsg+|+tempSat.getName();/將在線列表內(nèi)容住組織成字符串n ickListMsg=+n
28、ickListMsg;Vector tempv=father.o nli neList;size=tempv.size();for(i nt i=0;isize;i+)/遍歷在線列表ServerAge ntThread satTemp=(ServerAge ntThread)tempv.get(i); satTemp.dout.writeUTF( ni ckListMsg);/將最新的列表信息發(fā)送到各個(gè)客戶端if(satTemp!=this)/給其他客戶端發(fā)送新用戶上線的信息satTemp.dout.writeUTF(+this.getName()+ 上線了 .);catch(IOExcept
29、i on e)e.pri ntStackTrace();服務(wù)器代理線程類功能及實(shí)現(xiàn):服務(wù)器代理線程主要是用于接收客戶端傳來的信息,并將該信息轉(zhuǎn)發(fā)給相對(duì)應(yīng)的另一個(gè)客戶端。服務(wù)器為所有客戶端都分配了一個(gè)該類線程,單獨(dú)為特定客戶端進(jìn)行服務(wù)。同時(shí)每一個(gè)服務(wù)器代理線程都有能位移 標(biāo)示其的名稱3.1.4棋子的開發(fā)類設(shè)計(jì)import java.util.*;import java.awt.*;import javax.swi ng.*;public class QiZi/定義棋子的屬性private Stri ng n ame;棋子的名字,即是什么棋private int x;所在的x方向位置將用二維數(shù)組實(shí)
30、現(xiàn)private int y;所在的y方向位置 將用二維數(shù)組實(shí)現(xiàn)private boolea n focus=false;是否被選中,以至于只能選一子走public QiZi()無參函數(shù)public QiZi(Color color,Stri ng name,i nt x,i nt y)/顏色,名字,坐標(biāo)/構(gòu)造器this.color=color;this .n ame=n ame;this.x=x;this.y=y;this.focus=false;為未選中狀態(tài)public Color getColor()獲得棋子顏色的方法retur n this.color;public void setC
31、olor(Color color)/設(shè)置棋子顏色的方法this.color=color;public Stri ng getName()獲得棋子名字的方法return this. name;public void setName(Stri ng name)/設(shè)置棋子名字的方法this .n ame=n ame;public int getX()獲得棋子x方向位置的方法return this. x;public void setX(int x)/設(shè)置棋子 x方向位置的方法this.x=x;public int getY()/ 獲得棋子y方向位置的方法return this.y;public vo
32、id setY(int y)/設(shè)置棋子y方向位置的方法this.y=y;public boolean getFocus() 判斷棋子是否被選中的方法retur n focus;public void setFocus(boolean focus)/設(shè)置棋子選中狀態(tài)的方法this.focus=focus;棋子類功能實(shí)現(xiàn):該類主要包含有棋子的屬性及一些關(guān)于屬性的小方法3.1.5客戶端的框架類設(shè)計(jì)部分代碼:import import import import import import import public public調(diào)色public色。RGB調(diào)色public static 顏色。RGB調(diào)
33、色public static調(diào)色public staticJLabel jlHost=JLabel jlPort=java.awt.*; java.awt.eve nt.*; javax.swi ng.*; javax.swing.event.*; java.util.*; java.io.*;java .n et.*;class XiangQi extendsJFrame impleme nts Actio nListe ner/設(shè)置控件staticstaticfinalfinalfinalfinalJLabel jlNickName= JTextField jtfHost= 認(rèn)值是127.
34、0.0.1JTextField jtfPort=9999JTextField jtfNickName= 認(rèn)值是Play1JButt on jbC onn ect=JButt on jbDisc onn ect=JButton jbFail=ColorColorColorColorbgColor =new Color(245,250,160);focusbg =new Color(242,242,242);focuschar =n ew Color(96,95,91);color1 =new Color(249,183,173);棋盤的背景色。RGB棋子選中后的背景棋子選中后的字符紅方的顏色。R
35、GBcolor2 =Color. white ;/ 白方的顏色 主機(jī)IP);/創(chuàng)建提示輸入主機(jī)名的標(biāo)簽端口號(hào));/ 創(chuàng)建提示輸入端口號(hào)標(biāo)簽 昵finalnew JLabel(new JLabel( new JLabel(昵 稱);/new JTextField(127.0.0.1);Color直接定義創(chuàng)建提示輸入昵稱的標(biāo)簽創(chuàng)建輸入主機(jī)名的文本框,默new JTextField(9457);創(chuàng)建輸入端口號(hào)的文本框,默認(rèn)值是new JTextField(康言先森);/創(chuàng)建輸入昵稱的文本框,默JButton jbChalle nge= JComboBox jcbNickList= JButton j
36、bYChalle nge= JButton jbNChalle nge=new JButton(”連 接);/ 創(chuàng)建”連接”按鈕new JButton(”斷 開);/ 創(chuàng)建”斷開”按鈕new JButton(”認(rèn)輸”);/創(chuàng)建”認(rèn)輸按鈕new JButton(”挑 戰(zhàn));/ 創(chuàng)建”挑戰(zhàn)”按鈕new JComboBox();/創(chuàng)建存放當(dāng)前用戶的下拉列表框new JButton(” 接受挑戰(zhàn));/ 創(chuàng)建”接受挑戰(zhàn)”按鈕 new JButton(” 拒絕挑戰(zhàn));/ 創(chuàng)建”拒絕挑戰(zhàn)”按鈕int width=60;/ 設(shè)置棋盤兩線之間的距離 QiZi qiZi= new QiZi910; QiPa n
37、jpz= new QiPa n(qiZi,width, /JPa nel jpz=new JPa nel(); JPa nel jpy=new JPa nel();創(chuàng)建棋子數(shù)組this );/ 創(chuàng)建棋盤創(chuàng)建一個(gè)JPanel ,暫時(shí)代替棋盤創(chuàng)建一個(gè)JPanelJSplitPa ne jsp= 一個(gè) JSplitPa nenew JSplitPa ne(JSplitPa ne.HORIZONTAL_SPLIT,jpz,jpy);創(chuàng)建boolean caiPan= false ;/ 可否走棋的標(biāo)志位int color=0;/0 代表紅棋,1代表白棋Socket sc;/ 聲明 Socket 弓 I
38、用Clie ntAge ntThread cat;/聲明客戶端代理線程的引用publicXiangQi()構(gòu)造 XiangQi 方法this.in itialComp onen t();/初始化控件this.addListe ner();為相應(yīng)控件注冊(cè)事件監(jiān)聽器this.in itialState();初始化狀態(tài)this.in itialQiZi();初始化棋子this.in itialFrame();初始化窗體public void initialComponent() jpy.setLayout( null );/ 設(shè)為空布局 this .jIHost.setBou nds(10,10,5
39、0,20);jpy.add( this .jlHost);/ 添加主機(jī) IP標(biāo)簽this .jtfHost.setBou nds(70,10,80,20);jpy.add( this .jtfHost);/添加用于輸入主機(jī)名的文本框this .jlPort.setBou nds(10,40,50,20);jpy.add( this .jlPort);/ 添加端口號(hào)”標(biāo)簽this .jtfPort.setBou nds(70,40,80,20);jpy.add( this .jtfPort);/添加用于輸入端口號(hào)的文本框this .jINickName.setBou nds(10,70,50,2
40、0);jpy.add( this .jlNickName);/ 添加玩家昵稱”標(biāo)簽 this .jtfNickName.setBou nds(70,70,80,20);jpy.add( this .jtfNickName);/添加用于輸入昵稱的文本框this .jbCo nn ect.setBou nds(10,100,80,20);jpy.add( this .jbConnect);/添加連接”按鈕this .jbDisco nn ect.setBou nds(100,100,80,20);jpy.add( this .jbDisconnect);/添加斷開”按鈕this .jcbNickL
41、ist.setBou nds(20,130,130,20);jpy.add(this .jcbNickList);/添加用于顯示當(dāng)前用戶的下拉列表框this .jbChalle nge.setBou nds(10,160,80,20);jpy.add(this .jbChallenge);添加挑戰(zhàn)”按鈕this .jbFail.setBou nds(100,160,80,20);jpy.add( this .jbFail);/ 添加認(rèn)輸”按鈕this .jbYChalle nge.setBou nds(5,190,86,20);jpy.add(this .jbYChallenge);添加接受挑
42、戰(zhàn)”按鈕this .jbNChalle nge.setBou nds(100,190,86,20);jpy.add(this .jbNChallenge);添加拒絕挑戰(zhàn)”按鈕jpz.setLayout(null );/ 將棋盤設(shè)為空布局jpz.setBou nds(0,0,700,700);設(shè)置大小public void addListener()this .jbC onn ect.addAct ion Liste ner( this .jbDisc onn ect.addActi on Liste ner( this .jbChalle nge.addAct ion Liste ner(th
43、is );/為連接按鈕注冊(cè)事件監(jiān)聽器this );/為斷開”按鈕注冊(cè)事件監(jiān)聽器 this );/為”挑戰(zhàn)”按鈕注冊(cè)事件監(jiān)聽器this .jbFail.addAct ion Liste ner(this .jbYChalle nge.addAct ion Liste ner(this );/為認(rèn)輸按鈕注冊(cè)事件監(jiān)聽器this );/為同意挑戰(zhàn)”按鈕注冊(cè)事件監(jiān)聽器聽器this.jbNChalle nge.addAct ion Liste ner(this );/為拒絕挑戰(zhàn)”按鈕注冊(cè)事件監(jiān)void initialState() publicthis this this this this.jbDisc
44、 onn ect.setE nabled( .jbChalle nge.setE nabled( .jbYChalle nge.setE nabled( .jbNChalle nge.setE nabled( .jbFail.setE nabled(false);falsefalse );/false );/false );/將斷開”按鈕設(shè)為不可用將挑戰(zhàn)按鈕設(shè)為不可用將接受挑戰(zhàn)”按鈕設(shè)為不可用 將拒絕挑戰(zhàn)”按鈕設(shè)為不可用);/將認(rèn)輸按鈕設(shè)為不可用客戶端主類框架的功能及實(shí)現(xiàn):客戶端主類為客戶端的運(yùn)行類,用戶通過 運(yùn)行該類連接服務(wù)器,也是通過在該類的 窗體中與其他玩家進(jìn)行對(duì)弈。其與服務(wù)器 端主類的
45、開發(fā)類似。3.1.6客戶端的框架類設(shè)計(jì)部分代碼:/*客戶端線程類*/import java.awt.*;import java.awt.eve nt.*;import javax.swi ng.*;import javax.swi ng.eve nt.*;import java.util.*;import java.io.*;import java .n et.*;public class Clie ntAge ntThread exte nds ThreadXiangQi father;/ 聲明 XiangQi 的引用boolean flag=true;/控制線程的標(biāo)志位Data In pu
46、tStream din;/聲明數(shù)據(jù)輸入輸出流的引用DataOutputStream dout;Stri ng tiaoZha nZhe=null;/用于記錄正在挑戰(zhàn)的對(duì)手public Clie ntAge ntThread(Xia ngQi father)this.father=father;trydin=newDataInputStream(father.sc.getlnputStream();創(chuàng)建數(shù)據(jù)輸入輸出流dout=newDataOutputStream(father.sc.getOutputStream();String n ame=father.jtfNickName.getTex
47、t().trim();獲得昵稱dout.writeUTF(+name);/發(fā)送昵稱到服務(wù)器catch(Excepti on e)e.pri ntStackTrace();public void run()while(flag)tryStri ng msg=di n.readUTF().trim();獲得服務(wù)器發(fā)來的信息if(msg.startsWith()收到重名的信息this .n ame_ch ongmin g();else if(msg.startsWith()收到昵稱列表this. nick_list(msg);elseif(msg.startsWith()當(dāng)收到服務(wù)器離開的信息thi
48、s.server_dow n();else if(msg.startsWith()當(dāng)收到挑戰(zhàn)的信息this.tiao_zha n( msg);else if(msg.startsWith()this.to ng_yi();當(dāng)該用戶收到對(duì)方接受挑戰(zhàn)的信息時(shí)else if(msg.startsWith()this.buto ng_yi();當(dāng)該用戶收到對(duì)方拒絕挑戰(zhàn)的信息時(shí)else if(msg.startsWith()當(dāng)收到對(duì)方忙的信息時(shí)this.busy();else if(msg.startsWith()當(dāng)收到走棋的信息時(shí)this.move(msg);else if(msg.startsWit
49、h()當(dāng)收到認(rèn)輸?shù)男畔r(shí)this.re nshu();catch(Exception e)e.printStackTrace();public void n ame_ch on gmi ng()tryJOptio nPan e.showMessageDialog(this.father,稱已經(jīng)被占用,請(qǐng)重新填寫!,該玩家名錯(cuò)誤 ”,JOptionPane.ERROR_MESSAGE); 給出重名的提示信息di n.close();關(guān)閉數(shù)據(jù)輸入流dout.close();關(guān)閉數(shù)據(jù)輸出流this.father.jtfHost.setEnabled(!false);將用于輸入主機(jī)名的文本框設(shè)為可用this.father.jtfPort.setEnabled(!false);將用于輸入端口號(hào)的文本框設(shè)為可用this.father.jtfNickName.setE nabled(!false
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 【正版授權(quán)】 ISO 14880-2:2024 EN Optics and photonics - Microlens arrays - Part 2: Test methods for wavefront aberrations
- DB12T 578-2015 液化氣體汽車罐車用緊急切斷閥檢驗(yàn)方法與評(píng)定要求
- 新學(xué)期學(xué)習(xí)計(jì)劃范文匯編6篇
- 智能運(yùn)輸系統(tǒng) 體系結(jié)構(gòu) 服務(wù) 編制說明
- 全國(guó)連鎖洗衣店分布簡(jiǎn)報(bào) 2024 -洗衣行業(yè)如何搶占商機(jī) 來看這份連鎖洗衣店選址布局
- 春節(jié)期間通信保障方案
- 雪房子課件教學(xué)課件
- 部編版歷史九年級(jí)上冊(cè)第六單元 第17課《君主立憲制的英國(guó)》說課稿
- 高壓電工作業(yè)題庫
- 寶安區(qū)重點(diǎn)中學(xué)七年級(jí)上學(xué)期語文期中考試試卷
- 犟龜-完整版獲獎(jiǎng)?wù)n件
- 工業(yè)產(chǎn)品CAD技能三級(jí)試題及其評(píng)分標(biāo)準(zhǔn)
- 多元統(tǒng)計(jì)分析習(xí)題及解答
- 漢語詞性專題練習(xí)(附答案)
- 勞動(dòng)合同-高管補(bǔ)充協(xié)議20110520
- 浙江省溫州市地圖矢量PPT模板(圖文)
- 上海市建設(shè)工程項(xiàng)目管理機(jī)構(gòu)管理人員情況表
- 北師大版二年級(jí)數(shù)學(xué)上冊(cè)第九單元《除法》知識(shí)點(diǎn)梳理復(fù)習(xí)ppt
- 空氣能室外機(jī)保養(yǎng)維護(hù)記錄表
- DB37∕T 5162-2020 裝配式混凝土結(jié)構(gòu)鋼筋套筒灌漿連接應(yīng)用技術(shù)規(guī)程
- 9-2 《第三方過程評(píng)估淋蓄水檢查內(nèi)容》(指引)
評(píng)論
0/150
提交評(píng)論