(整理)冒險(xiǎn)者小游戲模式分析_第1頁(yè)
(整理)冒險(xiǎn)者小游戲模式分析_第2頁(yè)
(整理)冒險(xiǎn)者小游戲模式分析_第3頁(yè)
(整理)冒險(xiǎn)者小游戲模式分析_第4頁(yè)
(整理)冒險(xiǎn)者小游戲模式分析_第5頁(yè)
免費(fèi)預(yù)覽已結(jié)束,剩余14頁(yè)可下載查看

下載本文檔

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

文檔簡(jiǎn)介

1、蘇州科技學(xué)院電子與信息工程學(xué)院課程實(shí)驗(yàn)報(bào)告書課程名稱:計(jì)算機(jī)網(wǎng)絡(luò)實(shí)驗(yàn)班級(jí):計(jì)算機(jī) 0911 班學(xué) 號(hào):0920107124姓名:徐鎮(zhèn)韜教師:陶 滔二一一年十二月實(shí)驗(yàn)四 TCP/IP 網(wǎng)絡(luò)編程實(shí)驗(yàn)一、實(shí)驗(yàn)?zāi)康?. 掌握 TCP/IP 協(xié)議的基本知識(shí), TCP/IP 協(xié)議的基本工作原理。2. 理解 Socket 的基本概念和工作原理,掌握 Socket 建立、監(jiān)聽、連接、數(shù)據(jù)發(fā)送 和接收的方法。3. 進(jìn)一步掌握客戶 /服務(wù)器應(yīng)用程序的設(shè)計(jì)方法,利用底層的Windows Sockets API函數(shù)實(shí)現(xiàn)簡(jiǎn)單的 Winsock 網(wǎng)絡(luò)應(yīng)用程序設(shè)計(jì), 提高 Windows 平臺(tái)上的 Socket 編程能力。

2、二、實(shí)驗(yàn)內(nèi)容1. 設(shè)計(jì)一程序,利用 UDP 實(shí)現(xiàn)點(diǎn)對(duì)點(diǎn)聊天。2. 設(shè)計(jì)一程序,實(shí)現(xiàn) Web 服務(wù)器的基本功能。三、相關(guān)知識(shí)Windows Sockets 規(guī)范以 U.C. Berkeley 大學(xué) BSD UNIX 中流行的 Socket 接口為范例 定義了一套 Micosoft Windows 下網(wǎng)絡(luò)編程接口。它不僅包含了人們所熟悉的 Berkeley Socket 風(fēng)格的庫(kù)函數(shù), 也包含了一組針對(duì) Windows 的擴(kuò)展庫(kù)函數(shù), 以使程序員能充分地 利用 Windows 消息驅(qū)動(dòng)機(jī)制進(jìn)行編程。目前的 Windows Sockets 2 是一套開放的、支持 多種協(xié)議的 Windows 下的網(wǎng)絡(luò)

3、編程接口。 Winsock 已經(jīng)基本上實(shí)現(xiàn)了與協(xié)議無關(guān),使用 Winsock 來調(diào)用多種協(xié)議的功能,但較常使用的是 TCP/IP 協(xié)議。根據(jù)網(wǎng)絡(luò)通信的特性,套接字可分為兩類:面向連接協(xié)議(TCP )的流套接字(SOCK_STREAM )和面向無連接協(xié)議( UDP )的數(shù)據(jù)報(bào)套接字( SOCK_DGRAM )。 對(duì)于要求精確傳輸數(shù)據(jù)的 Windows Sockets 網(wǎng)絡(luò)通信程序,一般采用流式套接字。流式 套接字提供了一個(gè)面向連接的、可靠的、數(shù)據(jù)無錯(cuò)的、無重復(fù)發(fā)送的及按發(fā)送順序接收 數(shù)據(jù)的服務(wù)。其內(nèi)設(shè)流量控制,避免數(shù)據(jù)流超限,同時(shí),數(shù)據(jù)被看作是字節(jié)流,無長(zhǎng)度 限制。套接字可以處于阻塞模式和非阻塞

4、模式。調(diào)用一個(gè)阻塞模式的函數(shù),都會(huì)產(chǎn)生相同 的后果耗費(fèi)或長(zhǎng)或短的時(shí)間等待操作完成。而當(dāng)套接字處于非阻塞模式時(shí), API 函 數(shù) 的 調(diào) 用 會(huì) 立 即 返 回 , 大 多 數(shù) 情 況下 這 些調(diào) 用 會(huì) “ 失 敗”, 并 返 回 一 個(gè) WSAWOULDBLOCK 錯(cuò)誤,它表示請(qǐng)求的操作沒有時(shí)間完成。 Winsock 的套接字 I/O 模 型可以幫助應(yīng)用程序判斷一個(gè)套接字何時(shí)可供讀寫。1. Windows Sockets 主要函數(shù)Socket 實(shí)際在計(jì)算機(jī)中提供了一個(gè)通信接口,可以通過這個(gè)接口與任何一個(gè)具有Socket 接口的計(jì)算機(jī)通信。應(yīng)用程序在網(wǎng)絡(luò)上傳輸、接收的信息都通過這個(gè)Socket

5、 接口來實(shí)現(xiàn)。在應(yīng)用開發(fā)中就像使用文件句柄一樣,可以對(duì) Socket 句柄進(jìn)行讀、寫操作。Windows Sockets API 包括很多函數(shù),但其中最常用的主要函數(shù)如下所述:(1) 啟動(dòng) Winsock 服務(wù) WSAStartup()格式 :int WSAStartup( WORD wVersionRequested, LPWSADATA lpWSAData );功能:此函數(shù)是對(duì) Windows Sockets DLL 進(jìn)行初始化,只有此函數(shù)調(diào)用成功后,才 可以再調(diào)用其他 Windows Sockets DLL 的函數(shù)。參數(shù): wVersionRequested 指明程序請(qǐng)求使用的 Sock

6、et 版本, 其中高位字節(jié)指明副版 本、低位字節(jié)指明主版本; lpWSAData 返回請(qǐng)求的 Socket 的版本信息。返回值:成功返回 0。示例:假如一個(gè)程序要使用 2.2 版本的 Socket ,可用如下程序代碼:WORD wVersionRequested;WSADATA wsaData;int err;wVersionRequested = MAKEWORD( 2, 2 );err = WSAStartup( wVersionRequested, &wsaData );(2) 終止 Windows Sockets 服務(wù) WSACleanup()格式: int WSACleanu

7、p (void);功能:當(dāng)應(yīng)用程序不再需要使用 Windows Sockets DLL 時(shí),解除與 Socket 庫(kù)的綁定 并且釋放 Socket 庫(kù)所占用的系統(tǒng)資源。(3) 創(chuàng)建套接字 socket()格式: SOCKET socket(int af,int type,int procotol); 功能:創(chuàng)建一個(gè)能夠進(jìn)行網(wǎng)絡(luò)通信的套接字。參數(shù): af通指定應(yīng)用程序使用的通信協(xié)議的協(xié)議族,對(duì)于 TCP/IP協(xié)議族, 該參數(shù)置PF_INET 。type 要?jiǎng)?chuàng)建的套接字類型,流套接字類型為SOCK_STREAM 、數(shù)據(jù)報(bào)套接字類型為 SOCK_DGRAM 。procotol 指定應(yīng)用程序所使用的通

8、信協(xié)議。 返回值:成功返回新創(chuàng)建的套接字的描述符,失敗返回 INV ALID_SOCKET 。 示例:下面的代碼是一個(gè)創(chuàng)建流套接字的示例:struct protoent *ppt;ppe=getprotobyname("tcp");SOCKET ListenSocket=socket(PF_INET,SOCK_STREAM,ppt->p_proto);(4) 綁定本機(jī)地址 bind()格式: int bind(SOCKET s,const struct sockaddr FAR * name,int namelen); 功能:將本機(jī)地址與所創(chuàng)建的套接字號(hào)聯(lián)系起來。參數(shù)

9、: s 是由 socket()調(diào)用返回的并且未作連接的套接字描述符(套接字號(hào))。name指定一個(gè) sockaddr 結(jié)構(gòu)。 namelen 是 name 的長(zhǎng)度。返回值:成功返回 0,否則返回 SOCKET_ERROR 。 地址結(jié)構(gòu)說明:struct sockaddr_inshort sin_family; u_short sin_port;struct in_addr sin_addr; char sin_zero8;/AF_INET/16 位端口號(hào),網(wǎng)絡(luò)字節(jié)順序 /32 位 IP 地址,網(wǎng)絡(luò)字節(jié)順序/保留sa_family 指定地址族, 對(duì)于 TCP/IP 協(xié)議族的套接字, 給其置 AF_

10、INET 。當(dāng)對(duì) TCP/IP 協(xié)議族的套接字進(jìn)行綁定時(shí),通常使用另一個(gè)地址結(jié)構(gòu):struct sockaddr_in short sin_family; u_short sin_port;struct in_addr sin_addr;char sin_zero8;其中 sin_family 置 AF_INET ,sin_port 指明端口號(hào), in_addr 結(jié)構(gòu)體中只有一個(gè)唯一 的字段 s_addr,表示 IP 地址,該字段是一個(gè)整數(shù),一般用函數(shù)inet_addr() 把字符串形式的 IP 地址轉(zhuǎn)換成 unsigned long 型的整數(shù)值后再賦給 s_addr。有的服務(wù)器是多宿主機(jī),

11、至 少有兩個(gè)網(wǎng)卡,那么運(yùn)行在這樣的服務(wù)器上的服務(wù)程序在為其 Socket 綁定 IP 地址時(shí)可 以把 htonl(INADDR_ANY) 賦給 s_addr,這樣做的好處是不論哪個(gè)網(wǎng)段上的客戶程序都能 與該服務(wù)程序通信; 如果只給運(yùn)行在多宿主機(jī)上的服務(wù)程序的 Socket 綁定一個(gè)固定的 IP 地址,那么就只有與該 IP 地址處于同一個(gè)網(wǎng)段上的客戶程序才能與該服務(wù)程序通信。示例:以下代碼是是一個(gè) bind 函數(shù)調(diào)用的例子:struct sockaddr_in saddr; saddr.sin_family = AF_INET; saddr.sin_port = htons(8888); sad

12、dr.sin_addr.s_addr = htonl(INADDR_ANY);bind(ListenSocket,(struct sockaddr *)&saddr,sizeof(saddr) ;(5) 監(jiān)聽連接 listen()格式: int listen(SOCKET s, int backlog);功能:服務(wù)程序可以調(diào)用 listen 函數(shù)使其流套接字 s 處于監(jiān)聽狀態(tài)。 參數(shù):指定監(jiān)聽狀態(tài)的流套接字s,它將維護(hù)一個(gè)客戶連接請(qǐng)求隊(duì)列,該隊(duì)列最多容納參數(shù) backlog 個(gè)客戶連接請(qǐng)求。返回值:成功返回 0,失敗返回 SOCKET_ERROR 。(6) 建立套接字連接 connec

13、t() 和 accept()格式: int connect(SOCKET s,const struct sockaddr FAR * name,int namelen);SOCKET accept(SOCKET s,struct sockaddr FAR * name,int FAR * addrlen);功能:服務(wù)程序調(diào)用 accept()函數(shù)從處于監(jiān)聽狀態(tài)的流套接字s 的客戶連接請(qǐng)求隊(duì)列 中取出排在最前的一個(gè)客戶請(qǐng)求,并且創(chuàng)建一個(gè)新的套接字來與客戶套接字創(chuàng)建連接通 道。客戶程序調(diào)用 connect() 函數(shù)來使客戶 Socket s 與監(jiān)聽于 name 所指定的計(jì)算機(jī)的特 定端口上的服務(wù)

14、Socket 進(jìn)行連接。參數(shù):同 bind() 。返回值: 對(duì)于 accept()連接成功返回新創(chuàng)建的套接字的描述符, 以后與客戶套接字交 換數(shù)據(jù)的是新創(chuàng)建的套接字,如果失敗返回 INV ALID_SOCKET 。對(duì)于 connect() 連接成功返回 0,如果失敗返回 SOCKET_ERROR 。 示例:以下代碼是一個(gè)調(diào)用 accept()的例子: struct sockaddr_in ServerSocketAddr;int addrlen; addrlen=sizeof(ServerSocketAddr); ServerSocket=accept(ListenSocket,(struct

15、 sockaddr *)&ServerSocketAddr, &addrlen); 以下代碼是調(diào)用 connect() 的例子:struct sockaddr_in daddr; memset(void *)&daddr,0,sizeof(daddr); daddr.sin_family=AF_INET; daddr.sin_port=htons(8888); daddr.sin_addr.s_addr=inet_addr(""); connect(ClientSocket,(struct sockaddr *)&da

16、ddr,sizeof(daddr);(7) 流套接字?jǐn)?shù)據(jù)發(fā)送與接收 send()和 recv() 格式: int send(SOCKET s,const char FAR * buf,int len,int flags);int recv(SOCKET s,const char FAR * buf,int len,int flags);功能:流套接字( TCP )數(shù)據(jù)的發(fā)送與接收。數(shù)據(jù)報(bào)套接字的發(fā)送與接收用sendto()和 recvfrom() 函數(shù)。參數(shù): s 指定發(fā)送 /接收端套接字描述符。buf 指向存有傳輸數(shù)據(jù)的緩沖區(qū)的指針。len 指明實(shí)際要發(fā)送 /接收數(shù)據(jù)的字節(jié)數(shù) flags 一

17、般置 0。返回值:成功返回實(shí)際發(fā)送 /接收的字節(jié)數(shù),否則返回 SOCKET_ERROR 。如果 send在等待協(xié)議傳送數(shù)據(jù)時(shí)網(wǎng)絡(luò)斷開的話,那么send函數(shù)也返回 SOCKET_ERROR 。(8) 數(shù)據(jù)報(bào)數(shù)據(jù)的發(fā)送與接收 sendto() 和 recvfrom()格式: int sendto (SOCKET s,const char FAR * buf,int len,int flags, const struct sockaddr FAR * to,int tolen);int recvfrom (SOCKET s,const char FAR * buf,int len,int flags

18、, struct sockaddr FAR* from, int FAR* fromlen);功能:數(shù)據(jù)報(bào)套接字( UDP )數(shù)據(jù)的發(fā)送與接收。流套接字的發(fā)送與接收用 send() 和 recv() 函數(shù)。參數(shù): s 指定發(fā)送 /接收端套接字描述符。buf 指向存有傳輸數(shù)據(jù)的緩沖區(qū)的指針。To 指向 struct sockaddr 結(jié)構(gòu)指針,帶有接收端套接字的目標(biāo)主機(jī)信息。 from 指向 struct sockaddr 結(jié)構(gòu)指針,帶有發(fā)送端套接字的主機(jī)地址信息。 tolen 指明實(shí)際要發(fā)送的數(shù)據(jù)的字節(jié)數(shù)。fromlen 指向帶有地址結(jié)構(gòu)的長(zhǎng)度的指針。flags 一般置 0。返回值:成功返回實(shí)

19、際發(fā)送 /接收的字節(jié)數(shù),否則返回 SOCKET_ERROR 。(9) 關(guān)閉套接字 closesocket()格式: int closesocket(SOCKET s);功能:關(guān)閉套接字 s。返回值:成功就返回 0,否則返回 SOCKET_ERROR 。(10) 選擇系統(tǒng)所要處理的 Socket 事件 WSAAsyncSelect()格式: int WSAAsyncSelect( SOCKET s, HWND hWnd,unsigned int wMsg, long lEvent );說明:此函數(shù)用來請(qǐng)求 Windows Sockets DLL 為窗口句柄發(fā)送一條消息,是 WINSOCK API

20、 中最為重要的一個(gè)函數(shù)。本函數(shù)自動(dòng)將套接字設(shè)置為非阻塞模式。參數(shù): s 是 Socket 對(duì)象。HWnd 是接收消息的窗口句柄。WMsg 是傳給窗口的消息。LEvent 是被注冊(cè)的網(wǎng)絡(luò)事件,也即是 Windows Sockets DLL 可以檢測(cè)到的向 應(yīng)用程序窗口發(fā)送消息的網(wǎng)絡(luò)事件。返回值:成功就返回 0,否則返回 SOCKET_ERROR 。 lEvent 參數(shù)由下表中列出的值組成。值 意 義FD_READ期望在套接字上收到數(shù)據(jù)(即讀準(zhǔn)備好)時(shí)接到通知FD_WRITE期望在套接字上可發(fā)送數(shù)據(jù)(即寫準(zhǔn)備好)時(shí)接到通知FD_ACCEPT 期望在套接字上有外來連接時(shí)接到通知FD_CONNECTF

21、D_CLOSEFD_OOB期望在套接字連接建立完成時(shí)接到通知期望在套接字關(guān)閉時(shí)接到通知期望在套接字上有帶外數(shù)據(jù)到達(dá)時(shí)接到通知成功調(diào)用該函數(shù)后,每發(fā)生一個(gè) lEvent 參數(shù)事件就會(huì)產(chǎn)生一個(gè)由 wMsg 定義的指定的消息(如 WM_SOCKET )傳給窗口,消息結(jié)構(gòu)中的 lParam 則為以上各種網(wǎng)絡(luò)事件名Socket 的不同事件:稱。因此可以在窗口處理自定義消息函數(shù)中使用以下結(jié)構(gòu)來響應(yīng)switch(lParam)case FD_READ:break;case FD_WRITE break;當(dāng) Socket 收到設(shè)定的網(wǎng)絡(luò)事件中的一個(gè)時(shí),會(huì)給程序窗口一個(gè)消息,這個(gè)消息里會(huì) 指定 產(chǎn)生網(wǎng)絡(luò)事件 的

22、 Socket ,發(fā)生的事 件類型和錯(cuò) 誤碼。當(dāng)異步 數(shù)據(jù)傳輸機(jī)制 WSAAsyncSelect() 設(shè)定了 Socket 上需響應(yīng)的通信事件后,每發(fā)生一個(gè)這樣的事件就會(huì)產(chǎn) 生一個(gè) WM_SOCKET 消息傳給窗口。而在窗口的回調(diào)函數(shù)中就應(yīng)該添加相應(yīng)的數(shù)據(jù)傳 輸處理代碼。例如:要在套接字讀準(zhǔn)備好或?qū)憸?zhǔn)備好時(shí)接到通知,語(yǔ)句如下: rc=WSAAsyncSelect(s,hWnd,wMsg,FD_READ|FD_WRITE);如果需要注銷對(duì)套接字網(wǎng)絡(luò)事件的消息發(fā)送,只要將 lEvent 設(shè)置為 0 。2. Windows Sockets API 編程模型(1) 無連接協(xié)議套接字客戶 /服務(wù)器應(yīng)用程

23、序流程圖,如圖 6-1 所示。服務(wù)器調(diào)用 sockt() 建立套接,返回套接字 s調(diào)用 sockt()建立套接,返回套接字 s調(diào)用 bind(),使套接字 s 與本地址綁定調(diào)用 bind(),使套接字 s 與本地址綁定調(diào)用 recv()/send(), 在套接字 s 上讀寫調(diào)用 recv()/send(),在套接字 s 上讀寫數(shù)據(jù),直到完成交換數(shù)據(jù),直到數(shù)據(jù)交換完成調(diào)用 closesocket(),關(guān)閉套接字 s調(diào)用 closesocket(),關(guān)閉套接字 s,結(jié) 束會(huì)話圖 6-1 無連接的應(yīng)用程序流程圖(2) 面向連接的客戶 /服務(wù)器應(yīng)用程序流程圖,如圖6-2 所示。圖 6-2 面向連接的應(yīng)

24、用程序流程圖3 HTTP 協(xié)議工作原理WWW 是以 Internet 作為傳輸媒介的一個(gè)應(yīng)用系統(tǒng), WWW 網(wǎng)上最基本的傳輸單位 是 Web 網(wǎng)頁(yè)。 WWW 的工作基于客戶機(jī) /服務(wù)器模式,由 Web 瀏覽器 (客戶機(jī) )和 Web 服 務(wù)器(服務(wù)器 )構(gòu)成,兩者之間采用超文本傳送協(xié)議(HTTP )進(jìn)行通信。 HTTP 協(xié)議是基于 TCP/IP 協(xié)議之上的協(xié)議, 是 Web 瀏覽器和 Web 服務(wù)器之間的應(yīng)用層協(xié)議, 是通用的、 無狀態(tài)的、面向?qū)ο蟮膮f(xié)議。 HTTP 協(xié)議的工作原理包括四個(gè)步驟:(1) 客戶機(jī)與服務(wù)器建立連接。 Web瀏覽器與 Web 服務(wù)器建立連接,打開一個(gè)套接 字 sock

25、et。(2) 客戶向服務(wù)器提出請(qǐng)求。 Web瀏覽器通過 socket向 Web服務(wù)器提交請(qǐng)求, HTTP 的請(qǐng)求一般是 GET或POST命令。 GET 命令的格式為:GET 路徑 /文件名 HTTP/1.0文件名指出所訪問的文件, HTTP/1.0 指出 Web 瀏覽器使用的 HTTP 版本。(3) 服務(wù)器對(duì)請(qǐng)求作出應(yīng)答。 Web 瀏覽器提交請(qǐng)求后,通過 HTTP 協(xié)議傳送給 Web 服務(wù)器。 Web 服務(wù)器接收到請(qǐng)求后,進(jìn)行事務(wù)處理,處理結(jié)果又通過 HTTP 傳回給 Web 瀏覽器,從而在 Web 瀏覽器上顯示出所請(qǐng)求的頁(yè)面。(4) 關(guān)閉客戶與服務(wù)器之間的連接。當(dāng)響應(yīng)結(jié)束后, Web 瀏覽器

26、與 Web 服務(wù)器必須 斷開,以保證其它 Web 瀏覽器能夠與 Web 服務(wù)器建立連接。四、實(shí)驗(yàn)示例五、實(shí)驗(yàn)代碼1.ChatServer.csusing System;using System.Collections.Generic;using System.Text;using System.Net;using System.Net.Sockets;namespace ChatServerclass Programstatic void Main(string args)Socket client;IPAddress hostIPAddress = IPAddress.Parse("

27、;");string serverPort = "6666"/本地主機(jī)終結(jié)點(diǎn)IPEndPoint ServerIPEndPoint = new IPEndPoint(hostIPAddress, Int32.Parse(serverPort);/ 創(chuàng)建 SocketSocket serverSocket = new Socket(AddressFamily.InterNetwork,SocketType.Stream, ProtocolType.Tcp);/ 使 Socket 與一個(gè)本地終結(jié)點(diǎn)相關(guān)聯(lián) serverSocket.Bind(Serve

28、rIPEndPoint);/進(jìn)入監(jiān)聽狀態(tài)serverSocket.Listen(5);byte buffer=new byte1024;string msg="Server:"while (true)/等待客戶端的連接client = serverSocket.Accept();while (true)/接收數(shù)據(jù)int ret=client.Receive(buffer);string recvMsg=Encoding.Unicode.GetString(buffer, 0, ret);string msg1=msg+recvMsg;/編碼格式轉(zhuǎn)換System.Consol

29、e.WriteLine(msg1);buffer = Encoding.Unicode.GetBytes(msg1);/發(fā)送數(shù)據(jù)client.Send(buffer);if(recvMsg="end.")break;client.Close();2.ChatClient.csusing System;using System.Collections.Generic;using System.Text;using System.Net;using System.Net.Sockets;using System.IO;namespace ChatClientclass Prog

30、ramstatic void Main(string args)byte recvMsg = new byte1024;IPAddress hostIPAddress=IPAddress.Parse("");string clientPort = "7666"string serverPort = "6666" IPEndPoint ClientIPEndPoint = new IPEndPoint(hostIPAddress, Int32.Parse(clientPort);/本地主機(jī)終結(jié)點(diǎn) IPEndPoint

31、ServerIPEndPoint = new IPEndPoint(hostIPAddress, Int32.Parse(serverPort);/遠(yuǎn)程服務(wù)器終結(jié)點(diǎn) / 創(chuàng)建 socketSocket clientSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);/ 使 Socket 與一個(gè)本地終結(jié)點(diǎn)相關(guān)聯(lián) clientSocket.Bind(ClientIPEndPoint);try clientSocket.Connect(ServerIPEndPoint); / 嘗試連

32、接遠(yuǎn)程主機(jī) while(true)System.Console.WriteLine(" 請(qǐng)輸入 :");string msg = System.Console.ReadLine();byte msgBuff = Encoding.Unicode.GetBytes(msg); clientSocket.Send(msgBuff);/ 發(fā)送數(shù)據(jù)if (msg = "end.")break;int ret = clientSocket.Receive(recvMsg);/ 接收數(shù)據(jù)System.Console.WriteLine(Encoding.Unicod

33、e.GetString(recvMsg, 0,ret);/ 編碼格式轉(zhuǎn)換 clientSocket.Close();catch (ArgumentNullException ae)/ 處理參數(shù)為空引用異常Console.WriteLine("ArgumentNullException : 0", ae.ToString();catch (SocketException se)/ 處理操作系統(tǒng)異常 Console.WriteLine("SocketException : 0", se.ToString(); catch (Exception e)Conso

34、le.WriteLine("Unexpected exception : 0", e.ToString(); 3. MyWebServer.csusing System;using System.IO;using System.Net;using System.Net.Sockets;using System.Text;using System.Threading ;class MyWebServerprivate TcpListener myListener ;private int port = 8080 ; / 選者任何閑置端口/開始監(jiān)聽端口 /同時(shí)啟動(dòng)一個(gè)監(jiān)聽進(jìn)程

35、public MyWebServer()try/開始監(jiān)聽端口 myListener = new TcpListener(port) ; myListener.Start();Console.WriteLine("Web Server Running. Press C to Stop.");/ 同時(shí)啟動(dòng)一個(gè)監(jiān)聽進(jìn)程 'StartListen'Thread th = new Thread(new ThreadStart(StartListen); th.Start() ; catch(Exception e)Console.WriteLine(" 監(jiān)聽

36、端口時(shí)發(fā)生錯(cuò)誤 :" +e.ToString();public void SendHeader(string sHttpVersion, string sMIMEHeader, int iTotBytes, string sStatusCode, ref Socket mySocket)String sBuffer = ""if (sMIMEHeader.Length = 0 )sMIMEHeader = "text/html" / 默認(rèn) text/htmlsBuffer = sBuffer + sHttpVersion + sStatusCo

37、de + "rn"sBuffer = sBuffer + "Server: cx1193719-brn"sBuffer = sBuffer + "Content-Type: " + sMIMEHeader + "rn"sBuffer = sBuffer + "Accept-Ranges: bytesrn"sBuffer = sBuffer + "Content-Length: " + iTotBytes + "rnrn"Byte bSendData = E

38、ncoding.ASCII.GetBytes(sBuffer);SendToBrowser( bSendData, ref mySocket);Console.WriteLine("Total Bytes : " + iTotBytes.ToString();public void SendToBrowser(String sData, ref Socket mySocket)SendToBrowser (Encoding.ASCII.GetBytes(sData), ref mySocket);public void SendToBrowser(Byte bSendDat

39、a, ref Socket mySocket) int numBytes = 0;tryif (mySocket.Connected)if ( numBytes = mySocket.Send(bSendData, bSendData.Length,0) = -1) Console.WriteLine("Socket Error cannot Send Packet");elseConsole.WriteLine("No. of bytes send 0" , numBytes);elseConsole.WriteLine(" 連接失敗 &qu

40、ot;);catch (Exception e)Console.WriteLine(" 發(fā)生錯(cuò)誤 : 0 ", e );public static void Main()MyWebServer MWS = new MyWebServer();public void StartListen()int iStartPos = 0;String sRequest;String sDirName;String sRequestedFile;String sErrorMessage;String sLocalDir;String sMyWebServerRoot = "E:

41、MyWebServerRoot" / 設(shè)置虛擬目錄String sPhysicalFilePath = ""String sFormattedMessage = ""String sResponse = ""while(true)/接受新連接Socket mySocket = myListener.AcceptSocket() ;Console.WriteLine ("Socket Type " +mySocket.SocketType );if(mySocket.Connected)Console.Wr

42、iteLine("nClientConnected!n=nCLient IP 0n",mySocket.RemoteEndPoint) ;Byte bReceive = new Byte1024 ;int i = mySocket.Receive(bReceive,bReceive.Length,0) ;/轉(zhuǎn)換成字符串類型string sBuffer = Encoding.ASCII.GetString(bReceive);/只處理 "get" 請(qǐng)求類型if (sBuffer.Substring(0,3) != "GET" )Cons

43、ole.WriteLine(" 只處理 get 請(qǐng)求類型 ."); mySocket.Close();return;/ 查找 "HTTP" 的位置iStartPos = sBuffer.IndexOf("HTTP",1);string sHttpVersion = sBuffer.Substring(iStartPos,8);/ 得到請(qǐng)求類型和文件目錄文件名 sRequest = sBuffer.Substring(0,iStartPos - 1); sRequest.Replace("","/"

44、;);/ 如果結(jié)尾不是文件名也不是以 "/" 結(jié)尾則加 "/" if (sRequest.IndexOf(".") <1) && (!sRequest.EndsWith("/")sRequest = sRequest + "/"/得帶請(qǐng)求文件名iStartPos = sRequest.LastIndexOf("/") + 1; sRequestedFile = sRequest.Substring(iStartPos);/得到請(qǐng)求文件目錄sDirName = sRequest.Substring(sRequest.IndexOf("/"), sRequest.LastIndexOf("/")-3);/獲取虛擬目錄物理路徑sLocalDir = sMyWebServerRoot;Conso

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(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ì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論