java程序設(shè)計(jì)教學(xué)教案課件_第1頁
java程序設(shè)計(jì)教學(xué)教案課件_第2頁
java程序設(shè)計(jì)教學(xué)教案課件_第3頁
java程序設(shè)計(jì)教學(xué)教案課件_第4頁
java程序設(shè)計(jì)教學(xué)教案課件_第5頁
已閱讀5頁,還剩28頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

Java游戲開發(fā)

學(xué)習(xí)情境7:網(wǎng)絡(luò)對弈程序08游戲3-2Java游戲開發(fā)

學(xué)習(xí)情境7:網(wǎng)絡(luò)對弈程序08游戲3-2目標(biāo)與任務(wù)目標(biāo):為游戲添加網(wǎng)絡(luò)通信功能和游戲邏輯,利用Socket進(jìn)行網(wǎng)絡(luò)通信,C/S架構(gòu)服務(wù)器端和客戶端編寫,B/S架構(gòu)實(shí)現(xiàn)。任務(wù):開發(fā)網(wǎng)絡(luò)對弈程序目標(biāo)與任務(wù)目標(biāo):目標(biāo)程序完成項(xiàng)目開發(fā):程序運(yùn)行時(shí),有兩個客戶端通過網(wǎng)絡(luò)進(jìn)行對奕。目標(biāo)程序完成項(xiàng)目開發(fā):程序運(yùn)行時(shí),有兩個客戶端通過網(wǎng)絡(luò)進(jìn)行對學(xué)習(xí)過程步驟一:先完成簡單的C/S架構(gòu)步驟二:再完成第二個例,實(shí)現(xiàn)一個服務(wù)器與多個客戶端通信步驟三:再為服務(wù)器端創(chuàng)建線程,實(shí)現(xiàn)多線程服務(wù)器步驟四:最后加入分析兩客戶端通信的信息,實(shí)現(xiàn)游戲規(guī)則的代碼學(xué)習(xí)過程步驟一:先完成簡單的C/S架構(gòu)網(wǎng)絡(luò)通信基礎(chǔ)網(wǎng)絡(luò)通信就是通過某種方法讓一臺計(jì)算機(jī)與其它計(jì)算機(jī)交換數(shù)據(jù)。通信就是給其它計(jì)算機(jī)傳數(shù)據(jù),或者接收其它計(jì)算機(jī)發(fā)來的數(shù)據(jù)。對網(wǎng)絡(luò)的任何形式的訪問最后都?xì)w結(jié)為從網(wǎng)卡接收數(shù)據(jù)或向網(wǎng)卡傳送數(shù)據(jù)。網(wǎng)絡(luò)通信解決兩個問題:(1)如何識別不同的計(jì)算機(jī)。(2)如何傳送數(shù)據(jù)。網(wǎng)絡(luò)通信基礎(chǔ)網(wǎng)絡(luò)通信就是通過某種方法讓一臺計(jì)算機(jī)與其它計(jì)算機(jī)網(wǎng)絡(luò)通信問題網(wǎng)絡(luò)中的兩臺計(jì)算機(jī)靠協(xié)議進(jìn)行通信網(wǎng)絡(luò)中用IP標(biāo)識不同的通信實(shí)體IP:10IP:08httpftpmail網(wǎng)絡(luò)通信問題網(wǎng)絡(luò)中的兩臺計(jì)算機(jī)靠協(xié)議進(jìn)行通信IP:219.1網(wǎng)絡(luò)協(xié)議在兩臺電腦間傳送數(shù)據(jù)時(shí),傳送或接收數(shù)據(jù)的先后順序,數(shù)據(jù)的格式等內(nèi)容的約定構(gòu)成通信的協(xié)議。Internet網(wǎng)的數(shù)據(jù)傳送有很多協(xié)議,如TCP/IP,UDP,F(xiàn)TP等,協(xié)議不同,具體到網(wǎng)絡(luò)通信程序,接收和發(fā)送數(shù)據(jù)部分的代碼會有不同。本次的例子都是采用TCP/IP協(xié)議。網(wǎng)絡(luò)協(xié)議在兩臺電腦間傳送數(shù)據(jù)時(shí),傳送或接收數(shù)據(jù)的先后順序,數(shù)用IP識別網(wǎng)絡(luò)中的計(jì)算機(jī)網(wǎng)絡(luò)上不同的計(jì)算機(jī)用IP來標(biāo)識。實(shí)際上一個IP對應(yīng)一張網(wǎng)卡。如果一臺電腦上有多張網(wǎng)卡,那么就需要多個IP來標(biāo)識每一張網(wǎng)卡。每個網(wǎng)卡有多個端口,供應(yīng)用程序采用不同的通信協(xié)議傳輸數(shù)據(jù)。每種協(xié)議都采用不同的端口號,端口號可以設(shè)置,如設(shè)置某網(wǎng)卡用8080號端口進(jìn)行TCP/IP協(xié)議方式的數(shù)據(jù)傳輸。用IP識別網(wǎng)絡(luò)中的計(jì)算機(jī)網(wǎng)絡(luò)上不同的計(jì)算機(jī)用IP來標(biāo)識。網(wǎng)絡(luò)程序的架構(gòu)一般網(wǎng)絡(luò)上程序都是一個服務(wù)器,一個客戶端,這種程序的總體結(jié)構(gòu)叫架構(gòu),如上圖所示這種總體結(jié)構(gòu)叫C/S架構(gòu)(即客戶/服務(wù)器)架構(gòu)。C/S架構(gòu)中,提出數(shù)據(jù)訪問要求的程序叫客戶端,被提出數(shù)據(jù)訪問要求的程序叫服務(wù)器端。一個客戶端可能是一臺配置很高的電腦,一個服務(wù)器端可能只是一臺普通電腦??蛻舳撕头?wù)器端可以是同一臺電腦。CSCSCS網(wǎng)絡(luò)程序的架構(gòu)一般網(wǎng)絡(luò)上程序都是一個服務(wù)器,一個客戶端,這種網(wǎng)絡(luò)編程工具網(wǎng)絡(luò)很普遍,所以,幾乎所有的編程語言都提供網(wǎng)絡(luò)編程的組件。Java提供Socket組件供網(wǎng)絡(luò)編程使用。Socket是一個類。在用Java進(jìn)行網(wǎng)絡(luò)編程時(shí),只需使用Socket的有關(guān)方法,按照一定步驟編寫出接收數(shù)據(jù),處理數(shù)據(jù),或處理數(shù)據(jù),發(fā)送數(shù)據(jù)的代碼即可。網(wǎng)絡(luò)編程工具網(wǎng)絡(luò)很普遍,所以,幾乎所有的編程語言都提供網(wǎng)絡(luò)編JavaSocket編程事實(shí)上網(wǎng)絡(luò)編程簡單的理解就是兩臺計(jì)算機(jī)相互通訊數(shù)據(jù)而已,對于程序員而言,去掌握一種編程接口并使用一種編程模型相對就會顯得簡單的多了,JavaSDK提供一些相對簡單的API來完成這些工作。Socket就是其中之一,對于Java而言,這些API存在于

這個包里面,因此只要導(dǎo)入這個包就可以準(zhǔn)備網(wǎng)絡(luò)編程了。JavaSocket編程事實(shí)上網(wǎng)絡(luò)編程簡單的理解就是兩臺計(jì)Socket編程步驟Java提供了對TCP套接字的良好的支持,有兩種套接字類:

.Socket;

.ServerSocket;當(dāng)編寫連接到已有服務(wù)的客戶端軟件的時(shí)候使用Socket類。當(dāng)編寫綁定到本地端口以提供服務(wù)的服務(wù)器軟件的時(shí)候使用ServerSocket類。這是與DatagramSocket的UDP工作方式不同的地方--在TCP中,連接服務(wù)器地和從客戶端接收數(shù)據(jù)的函數(shù)被分為兩個獨(dú)立的類。Socket編程步驟Java提供了對TCP套接字的良好的支持Socket編程步驟Java中Socket可以理解為客戶端或者服務(wù)器端的一個特殊的對象,這個對象有兩個關(guān)鍵的方法,一個是getInputStream方法,另一個是getOutputStream方法。getInputStream方法可以得到一個輸入流,客戶端的Socket對象上的getInputStream方法得到的輸入流其實(shí)就是從服務(wù)器端發(fā)回的數(shù)據(jù)流。GetOutputStream方法得到一個輸出流,客戶端Socket對象上的getOutputStream方法返回的輸出流就是將要發(fā)送到服務(wù)器端的數(shù)據(jù)流,(其實(shí)是一個緩沖區(qū),暫時(shí)存儲將要發(fā)送過去的數(shù)據(jù))。Socket編程步驟Java中Socket可以理解為客戶端或Socket編程步驟要完成這個工作,需要完成三個部分的工作,以下依次說明:

1、建立服務(wù)器類

2、建立客戶端代碼

3、建立用戶界面Socket編程步驟要完成這個工作,需要完成三個部分的工作,1、建立服務(wù)器類創(chuàng)建服務(wù)器對象:ServerSocketserver=newServerSocket(9998)建立一個Socket連接:Socketincoming=server.accept()輸入流和輸出流:BufferedReaderin=newBufferedReader(newInputStreamReader(incoming.getInputStream()));

PrintWriterout=newPrintWriter(incoming.getOutputStream(),true);

隨后,就可以使用in.readLine()方法得到客戶端的輸入,也可以使用out.println()方法向客戶端發(fā)送數(shù)據(jù)。關(guān)閉這兩個數(shù)據(jù)流

out.close();in.close();1、建立服務(wù)器類創(chuàng)建服務(wù)器對象:2、建立客戶端代碼創(chuàng)建一個Socket對象:Socketsocket=newSocket("2",9998);數(shù)據(jù)的輸入和輸出in=newBufferedReader(newInputStreamReader(socket.getInputStream()));

out=newPrintWriter(socket.getOutputStream(),true);2、建立客戶端代碼創(chuàng)建一個Socket對象:Socket項(xiàng)目核心:簡單的C/S架構(gòu)客戶機(jī)/服務(wù)器的典型通信過程:

1、服務(wù)器監(jiān)聽相應(yīng)端口的輸入;

2、客戶機(jī)發(fā)出一個請求;

3、服務(wù)器接收到此請求;

4、服務(wù)器處理這個請求,并把結(jié)果返回給客戶機(jī);

5、重復(fù)上述過程,直至完成一次會話過程。項(xiàng)目核心:簡單的C/S架構(gòu)客戶機(jī)/服務(wù)器的典型通信過程:項(xiàng)目核心:簡單的C/S架構(gòu)服務(wù)方:importjava.io.*;import.*;publicclassMyServer{

publicstaticvoidmain(String[]args)throwsIOException{

ServerSocketserver=newServerSocket(5678);

Socketclient=server.accept();

BufferedReaderin=newBufferedReader(newInputStreamReader(client.getInputStream()));

PrintWriterout=newPrintWriter(client.getOutputStream());

while(true){

Stringstr=in.readLine();

System.out.println(str);

out.println("hasreceive....");out.flush();

if(str.equals("end"))

break;

}client.close();

}}項(xiàng)目核心:簡單的C/S架構(gòu)服務(wù)方:項(xiàng)目核心:簡單的C/S架構(gòu)這個程序的主要目的在于服務(wù)器不斷接收客戶機(jī)所寫入的信息只到,客戶機(jī)發(fā)送"End"字符串就退出程序,并且服務(wù)器也會做出"Receive"為回應(yīng),告知客戶機(jī)已接收到消息。項(xiàng)目核心:簡單的C/S架構(gòu)這個程序的主要目的在于服務(wù)器不斷接項(xiàng)目核心:簡單的C/S架構(gòu)客戶機(jī)代碼:import.*;importjava.io.*;publicclassClient{

staticSocketserver;

publicstaticvoidmain(String[]args)throwsException{

server=newSocket(InetAddress.getLocalHost(),5678);

BufferedReaderin=newBufferedReader(newInputStreamReader(server.getInputStream()));

PrintWriterout=newPrintWriter(server.getOutputStream());

BufferedReaderwt=newBufferedReader(newInputStreamReader(System.in));while(true){

Stringstr=wt.readLine();

out.println(str);

out.flush();

if(str.equals("end")){break;

}

System.out.println(in.readLine());

}

server.close();

}}項(xiàng)目核心:簡單的C/S架構(gòu)客戶機(jī)代碼:項(xiàng)目核心:簡單的C/S架構(gòu)客戶機(jī)代碼則是接受客戶鍵盤輸入,并把該信息輸出,然后輸出"End"用來做退出標(biāo)識。

這個程序只是簡單的兩臺計(jì)算機(jī)之間的通訊,如果是多個客戶同時(shí)訪問一個服務(wù)器呢?你可以試著再運(yùn)行一個客戶端,結(jié)果是會拋出異常的。那么多個客戶端如何實(shí)現(xiàn)呢?項(xiàng)目核心:簡單的C/S架構(gòu)客戶機(jī)代碼則是接受客戶鍵盤輸入,并一對一的C/S一個Server一個Client一對多的C/S一個server多個ClientCSCSCSCC一對一的C/S一個Server一對多的C/SCSCSCSCC功能擴(kuò)展:將客戶端改成JavaApplet,即B/S架構(gòu),為客戶端設(shè)計(jì)符合需求的GUI。

網(wǎng)絡(luò)通信模型B/S架構(gòu):如果客戶端是瀏覽器,則通信程序的架構(gòu)叫瀏覽器/服務(wù)器架構(gòu)(即Browser/Server架構(gòu),簡稱B/S架構(gòu))??蛻舳耸峭ㄓ玫臑g覽器,省掉了客戶端升級的麻煩。BSBB功能擴(kuò)展:將客戶端改成JavaApplet,即B/S架構(gòu),功能擴(kuò)展:將服務(wù)器端改進(jìn)為

多線程服務(wù)器一個服務(wù)器為多個客戶端服務(wù)其實(shí),簡單的分析一下,就可以看出客戶和服務(wù)通訊的主要通道就是Socket本身,而服務(wù)器通過accept方法就是同意和客戶建立通訊.這樣當(dāng)客戶建立Socket的同時(shí)。服務(wù)器也會使用這一根連線來先后通訊,那么既然如此只要我們存在多條連線就可以了。那么我們的程序可以變?yōu)槿缦?功能擴(kuò)展:將服務(wù)器端改進(jìn)為

多線程服務(wù)器一個服務(wù)器為多個客戶功能擴(kuò)展:將服務(wù)器端改進(jìn)為

多線程服務(wù)器改進(jìn)為多線程服務(wù)器:

try

{file://建立服務(wù)器

ServerSocketserver=newServerSocket(9998);

inti=1;

for(;;)

{

Socketincoming=server.accept();

newServerThread(incoming,i).start();

i++;

}

}catch(IOExceptionex){ex.printStackTrace();}功能擴(kuò)展:將服務(wù)器端改進(jìn)為

多線程服務(wù)器改進(jìn)為多線程服務(wù)器:功能擴(kuò)展:將服務(wù)器端改進(jìn)為

多線程服務(wù)器這里僅僅只是加了一個外層的While循環(huán),這個循環(huán)的目的就是當(dāng)一個客戶進(jìn)來就為它分配一個Socket直到這個客戶完成一次和服務(wù)器的交互,這里也就是接受到客戶的"End"消息.那么現(xiàn)在就實(shí)現(xiàn)了多客戶之間的交互了。功能擴(kuò)展:將服務(wù)器端改進(jìn)為

多線程服務(wù)器這里僅僅只是加了一個功能擴(kuò)展:將服務(wù)器端改進(jìn)為

多線程服務(wù)器但是.問題又來了,這樣做雖然解決了多客戶,可是是排隊(duì)執(zhí)行的。也就是說當(dāng)一個客戶和服務(wù)器完成一次通訊之后下一個客戶才可以進(jìn)來和服務(wù)器交互,無法做到同時(shí)服務(wù),那么要如何才能同時(shí)達(dá)到既能相互之間交流又能同時(shí)交流呢?很顯然這是一個并行執(zhí)行的問題了。所以線程是最好的解決方案。功能擴(kuò)展:將服務(wù)器端改進(jìn)為

多線程服務(wù)器但是.問題又來了,這功能擴(kuò)展:將服務(wù)器端改進(jìn)為

多線程服務(wù)器那么下面的問題是如何使用線程.首先要做的事情是創(chuàng)建線程并使得其可以和網(wǎng)絡(luò)連線取得聯(lián)系。然后由線程來執(zhí)行剛才的操作,要創(chuàng)建線程要么直接繼承Thread要么實(shí)現(xiàn)Runnable接口,要建立和Socket的聯(lián)系只要傳遞引用就可以了.而要執(zhí)行線程就必須重寫run方法,而run方法所做的事情就是剛才單線程版本main所做的事情,因此我們的程序變成了multi

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論