基于TCP局域網聊天程序設計_第1頁
基于TCP局域網聊天程序設計_第2頁
基于TCP局域網聊天程序設計_第3頁
基于TCP局域網聊天程序設計_第4頁
基于TCP局域網聊天程序設計_第5頁
已閱讀5頁,還剩19頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、第一章 系統(tǒng)分析11 系統(tǒng)設計要求:12312 系統(tǒng)原理框圖本次課程設計的原理框圖如圖1.1所示:圖1.1系統(tǒng)原理框圖13 系統(tǒng)設計原理局域網聊天程序的實現主要為局域網內的計算機提供交流的平臺。完成一個基于服務器和客戶端的局域網通訊軟件,類似于聊天室,可進行注冊、登錄、系統(tǒng)信息記錄、聊天等功能。用戶容易使用,便于管理。第二章 系統(tǒng)設計理論基礎2.1 TCP/IP協議TCP/IP協議的核心部分是傳輸層協議(TCP、UDP),網絡層協議(IP)和物理接口層,這三層通常是在操作系統(tǒng)內核中設計。因此用戶一般不涉及。TCP是面向連接的,通信雙方保持一條通路,好比目前的電話線,使用telnet登陸B(tài)BS,

2、用的就是TCP協議;UDP是無連接的,通信雙方都不保持對方的狀態(tài),瀏覽器訪問Internet時使用的HTTP協議就是基于UDP協議的。編程時,編程界面有兩種形式:一、是由內核心直接提供的系統(tǒng)調用;二、使用以庫函數方式提供的各種函數。前者為核內設計,后者為核外設計。用戶服務要通過核外的應用程序才能設計,所以要使用套接字(socket)來設計。2.2 客戶機/服務器模式C/S結構(Client/Server結構)是大家熟知的客戶機和服務器結構。它是軟件系統(tǒng)體系結構,通過它可以充分利用兩端硬件環(huán)境的優(yōu)勢,將任務合理分配到Client端和Server端來實現,降低了系統(tǒng)的通訊開銷。目前大多數應用軟件系

3、統(tǒng)都是Client/Server形式的兩層結構,由于現在的軟件應用系統(tǒng)正在向分布式的Web應用發(fā)展,Web和Client/Server 應用都可以進行同樣的業(yè)務處理,應用不同的模塊共享邏輯組件;因此,內部的和外部的用戶都可以訪問新的和現有的應用系統(tǒng),通過現有應用系統(tǒng)中的邏輯可以擴展出新的應用系統(tǒng)。這也就是目前應用系統(tǒng)的發(fā)展方向。首先服務器方要啟動,并根據請求提供相應服務: (1)打開一通信通道并告知本地主機,它在某一公認地址端口上(如http為80)接受客戶請求。 (2)等待客戶請求到達該端口。 (3)接收到重復服務請求,處理該請求并發(fā)送應答信號。接收并發(fā)服務請求,要激活一新進程來處理這個客戶

4、請求。新進程處理此客戶請求,并不需要對其他請求做出應答。服務完成后,關閉此新進程與客戶的通信鏈路,并終止。 (4)返回第二步,等待另外的客戶請求 (5)關閉服務器。 客戶方: (1)打開一通信通道,并連接到服務器所在主機的特定端口。 (2)向服務器發(fā)出服務請求報文,等待并接收應答;繼續(xù)提出請求。 (3)請求結束后關閉通信通道并終止。 從上面的描述過程可知: (1)客戶與服務器進程的作用是非對稱的。因此編碼不同。 (2)服務進程一般是先于客戶請求啟動的。只要系統(tǒng)運行,該進程一直存在,直到 正常終止或者強迫終止。在TCP/IP網絡中兩個進程間的相互作用的主機模式是客戶機/服務器模式(Client/

5、Server model)。該模式的建立基于以下兩點:1、非對等作用;2、通信完全是異步的。2.3 Socketsocket之間的連接可以分為三種類型:客戶端連接,監(jiān)聽連接以及服務器端連接。 客戶端連接是指由客戶端的socket提出連接請求,要連接的目標是服務器端的socket。為此,客戶端的socket必須首先描述它要連接的服務器端socket(主要是指服務器 端socket的地址和端口號),然后再定位所要連接的服務器端socket,找到以后,就向服務器端 socket請求連接。當然,服務器端的socket此時未必正好處于準備好狀態(tài),不過,服務器端的 socket會自動維護客戶請求連接的隊列

6、,然后在它認為合適的時候向客戶端socket發(fā)出允許連接 (accept)的信號,這時客戶端socket與服務器端socket的連接就建立了。監(jiān)聽連接,服務器端 socket并不定位具體的客戶端socket,而是處于等待連接的狀態(tài)。當服務器端socket監(jiān)聽到或者說 接收到客戶端socket的連接請求,它就響應客戶端socket的請求建立一個新的socket句柄并與客戶 端連接,而服務器端socket繼續(xù)處于監(jiān)聽狀態(tài),還可以接收其它客戶端socket的連接請求。服務器端連接,是指當服務器端socket接收到客戶端socket的連接請求后,就把服務器端socket的描述發(fā)給客戶端,一旦客戶端確認

7、了此描述,連接就建立了。在本文中的聊天程序用的就是監(jiān)聽連接,即服務器設置連接個數后進行監(jiān)聽,客戶端進行對服務器端的連接,這樣就可以進行相互通信了。第三章 系統(tǒng)設計3.1 系統(tǒng)設計目標局域網聊天程序的設計目標為一個高性能的,易于使用的,面向局域網的即時信息軟件。最終的程序應具有如下功能:(1)客戶端使用簡便,服務器端運行穩(wěn)定??蛻舳伺c服務器端可運行在多種系統(tǒng)平臺,具有良好的兼容性能。(2)客戶端與服務器端功能獨立,可獨立運行在不同的計算機上或運行在同一臺計算機上,具有最大的靈活性。(3)能夠進行注冊,設置自己的用戶名和密碼,自動更新其他用戶的名單。(4)選擇特定用戶并與其交談,還可以向在所有在線

8、的用戶發(fā)送消息。3.2客戶端設計 客戶端設計界面圖為: 圖3.1 聊天客戶端界面圖 從聊天客戶端界面圖知道設計步驟為: 添加一個客戶端socket控件(ClientSocket)到form中使之成為一個TCP/IP客戶??蛻魋ockets允許你指定你想連接的服務器socket和你希望服務器提供的服務。一但你描述你想得到的連接,你可以使用客戶socket控件去完成連接服務。 每個客戶socket控件使用獨立的客戶windows socket對象(TClientWinSocket)去應答連接中的客戶終端。使用客戶sockets去: A.指定想得到的服務 客戶socket控件有一個數字propert

9、ies,允許你指定想連接的服務器系統(tǒng)和端口??梢酝ㄟ^主機名來指定服務器系統(tǒng),使用Host property。 如果不知道主機名,或者關心找到服務器的速度,你可以指定服務器系統(tǒng)的IP地址,通過使用Address property。你必須指定IP地址和主機名中的一個。 如果兩個都指定,客戶socket控件將使用主機名。除服務器系統(tǒng)外,必須指定客戶socket將連接的在服務器系統(tǒng)上的端口。能夠直接使用Port property來指定服務端口號?;蛘咧苯釉赟ervice property使用想得到的服務的名字。如果指定端口號和服務名,客戶socket控件將使用服務名。 B.建立連接 一旦在客戶sock

10、et控件中完成了設置所連接的服務器的屬性,就可以進行連接,通過調用Open方法。如果想要啟動時自動建立連接,在設計時設置Active property為true,通過使用Object Inspector來設置。C.取得關于連接的信息 完成連接到服務器socket后,可以使用客戶socket控件和相關的客戶windows socket object去取得關于連接的信息。使用Socket property去訪問client windows socket object。windows socket object 有一個properties,它能讓你確定在連接的兩端客戶和服務器使用的地址和端口號。 當

11、使用一個windows socket API調用時,可以使用SocketHandle property區(qū)獲得socket連接使用的handle??梢允褂肏andle property去訪問windows,以便接收來自socket連接的信息。AsyncStyles property決定哪種信息類型是windows handle要接收的。D.關閉連接 當完成通訊想關閉socket 連接時,能夠通過調用Close方法來關閉連接。連接可能要由服務器端來關閉。如果是這種情況,將收到一個OnDisconnect 事件的通知。 聊天客戶端程序代碼如下:procedure TForm1.Button1Clic

12、k(Sender: TObject);begin clientsocket1.Address:=edit3.Text;/ edit3.Clear; clientsocket1.Active:=true; button1.Enabled:=false; button3.Enabled:=true; button2.Enabled:=true;button7.Enabled:=true;end;procedure TForm1.ClientSocket1Connecting(Sender: TObject; Socket: TCustomWinSocket);begin statusbar1.Si

13、mpleText:=正在連接. + clientsocket1.Address;end;procedure TForm1.ClientSocket1Connect(Sender: TObject; Socket: TCustomWinSocket);begin statusbar1.SimpleText:=連接到 + clientsocket1.Address;end;procedure TForm1.Button4Click(Sender: TObject);begin close;end;procedure TForm1.Button3Click(Sender: TObject);begi

14、n if clientsocket1.Active then begin clientsocket1.Socket.SendText(usename+*&%#); clientsocket1.Active:=false; end; statusbar1.SimpleText:=斷開連接; edit1.Enabled:=true; edit2.Enabled:=true; button1.Enabled:=true; button6.Enabled:=true; memo1.Clear; listbox1.Clear;end;procedure TForm1.Edit4KeyPress(Send

15、er: TObject; var Key: Char);begin if key=#13 then if button6.Enabled then button6.Click;end;procedure TForm1.Button6Click(Sender: TObject);var chatname : string; i : integer;begin if edit4.Text= then begin showmessage(發(fā)送消息不能為空!); exit; end;if radiobutton2.Checked=true then begin for i:=0 to listbox1

16、.items.count do begin if listbox1.selectedi then begin chatname:= listbox1.items.stringsi; memo1.lines.add(你對+chatname+悄悄說:+edit4.Text); /edit4.Clear; break; end end; clientsocket1.Socket.SendText(edit4.Text+&+chatname+$+usename+%&%&%&); edit4.Clear; end else begin clientsocket1.Socket.SendText(edit

17、1.Text+對大家說:+edit4.Text); edit4.Clear; end;end;procedure TForm1.Button2Click(Sender: TObject);begin if edit1.Text= then begin showmessage(請輸入用戶名!); edit1.SetFocus; exit; end; if edit2.Text= then begin showmessage(請輸入密碼!); edit2.SetFocus; exit; end; clientsocket1.Socket.SendText(edit1.Text+$%$%$%); u

18、sename:=edit1.Text; password:=edit2.Text;end;procedure TForm1.ClientSocket1Read(Sender: TObject; Socket: TCustomWinSocket);var temptext : string; /chatname: string; mssge : string;begin temptext:=clientsocket1.Socket.ReceiveText; if pos(#$%&,temptext)0 then /回送密碼 begin temptext:=copy(temptext,1,leng

19、th(temptext)-6); if temptext=password then begin Memo1.Lines.Add(登陸成功,歡迎進入本聊天室!); listbox1.Items.Add(usename); button6.Enabled:=true; button2.Enabled:=false; edit1.Enabled:=false; edit2.Enabled:=false; button7.Enabled:=true; end else begin showmessage(密碼錯誤,登陸失敗,請檢查后重新登陸!); clientsocket1.Socket.SendT

20、ext(usename+*&%#); end end else if pos()&*%,temptext)0 then / 他人登陸信息 begin temptext:=copy(temptext,1,length(temptext)-9); if temptextedit1.Text then begin memo1.Lines.Add(temptext+ 進入聊天室.); listbox1.Items.add(temptext); end; end else if pos($%#$,temptext)0 then /off line begin temptext:=copy(temptex

21、t,1,length(temptext)-6); memo1.Lines.Add(temptext+ 離開聊天室.);/ showmessage(inttostr(listbox1.Items.IndexOf(temptext); if listbox1.Items.IndexOf(temptext)-1 then listbox1.Items.Delete(listbox1.Items.IndexOf(temptext); end else if pos(#$%&*,temptext)0 then begin mssge:=copy(temptext,1,length(temptext)-8

22、); memo1.Lines.Add(mssge); end else memo1.Lines.Add(temptext);end;procedure TForm1.Button7Click(Sender: TObject);begin form2.ShowModal;end;procedure TForm1.Button5Click(Sender: TObject);begin memo1.Clear;end;procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);begin if clientsocket1

23、.Active then begin clientsocket1.Socket.SendText(usename+*&%#); clientsocket1.Active:=false; end;end;procedure TForm1.Memo1Change(Sender: TObject);beginend;end. 3.3 服務器端設計 服務器端設計界面圖為: 圖3.2 聊天服務器界面圖從聊天服務器端界面圖知道設計步驟為: 添加一個服務端socket控件(ServerSocket)到form中使之成為一個TCP/IP服務器。服務器sockets允許指定想提供的服務或想用來監(jiān)聽客戶請求時使用

24、的端口。也可以使用服務器socket控件去監(jiān)聽和允許客戶連接請求。每個服務器socket控件使用一個單一的服務器windows socket Object(TServerWinSocket)去應答在服務器端監(jiān)聽到的連接。它通常使用一個服務器客戶winodws socket Object(TServerClientWinSocket)應答在服務器端每個活動的,連接著得到允許服務的客戶socket。使用服務器sockets去: A.指定端口 在服務器socket能夠監(jiān)聽客戶請求之前,必須指定一個端口給你的監(jiān)聽服務??梢允褂肞ort property來指定這個端口。如果服務器應用提供一個標準的服務,

25、這個服務使用一個習慣使用的相關聯的端口。能夠使用Service property直接指定端口號。使用Service property是一個好的主意,能夠減少設置端口號時的錯誤。如果既指定了Port property,又指定了Service property,服務socket將使用服務名。B.監(jiān)聽客戶請求 一旦在serversocket控件上設置好了端口號,就能夠通過在運行時通過調用Open方法來監(jiān)聽一個連接。如果希望應用程序能夠在啟動的時候自動監(jiān)聽連接,在設計的時候通過使用Object Inspector設置Active 屬性為true。C.連接到客戶端 當監(jiān)聽服務socket控件接收到一個客

26、戶端連接請求時他們將自動接受這個請求。當沒次收到通知時,OnClientConnetc事件將發(fā)生。 D.取得關于連接的信息 一但服務器socket打開了監(jiān)聽連接,就能夠使用與服務器socket控件相關聯的服務器windows socket object來取得關于連接的信息。使用Socket property去訪問server windows socket object.windows socket object有一個屬性是關于所有活動的客戶socket連接這些客戶socket是通過服務器socket控件允許連接的。使用Handle屬性去存取windows通過socket連接收到的信息。 每個活

27、動的,連接到客戶應用是通過服務、客戶windows socket bject(TServerClientWinSocket)封裝的。你能夠通過server windows socket object的連接屬性來訪問所有的這些。這些server client windows socket object有些屬性能夠決定哪些地址和端口號給連接的兩端-客戶和服務器socket使用。當使用windows socket API調用時,可以使用SocketHandle屬性去獲得socket連接使用的handle。也可以使用Handle屬性去訪問windows從socket連接處得來的信息。AsyncStyl

28、es屬性決定windows handle將接收哪種類型的信息。E.關閉連接 當決定關閉監(jiān)聽連接時,調用Close方法。這將關閉所有打開著的,連接到客戶應用的連接,取消任何尚未同意的連接,接著關閉監(jiān)聽連接以便服務socket控件不在接受任何新的連接。當客戶端關閉他們自己獨立的連接到的server socket的連接時,可以在OnClientDisconnect事件中得到訊息。 聊天服務器端程序代碼如下:procedure TForm1.ServerSocket1Listen(Sender: TObject; Socket: TCustomWinSocket);begin statusbar1.S

29、impleText:=監(jiān)聽狀態(tài).; counter:=0;end;procedure TForm1.ServerSocket1ClientDisconnect(Sender: TObject; Socket: TCustomWinSocket);begin statusbar1.SimpleText:=連接到 + socket.RemoteAddress;end;procedure TForm1.ServerSocket1ClientConnect(Sender: TObject; Socket: TCustomWinSocket);begin statusbar1.SimpleText:=

30、Socket.RemoteAddress + 已連接;end;procedure TForm1.ServerSocket1ClientRead(Sender: TObject; Socket: TCustomWinSocket); var tmptext: string; check :string; i,j: integer; chattext:string; signpos : integer; member : string; usename : string;begin tmptext := socket.ReceiveText; if pos(%&%&%&,tmptext)0 the

31、n / 當有%&%&%&字符串時表示私聊 begin tmptext := copy(tmptext,1,length(tmptext)-6); signpos:= pos(&,tmptext); chattext:= copy(tmptext,1,signpos-1); member:=copy(tmptext, signpos+2,pos($,tmptext)-2-signpos); usename:=copy(tmptext,pos($,tmptext)+2,length(tmptext)-pos($,tmptext)+2); for i:=0 to counter-1 do begin

32、 if member=chatnamei then begin serversocket1.Socket.Connectionsi.SendText(usename+悄悄對你說:+chattext); break; end; end; endelse if pos($%$%$%,tmptext)0 then / 當有$%$%$%表示有登陸信息 begin tmptext := copy(tmptext,1,length(tmptext)-6); chatnamecounter:=tmptext; listbox1.Items.add(tmptext); check :=(table1.look

33、up(usename,tmptext,password); socket.SendText(check+#$%&); if counter0 then begin for i:=0 to counter-1 do begin serversocket1.Socket.Connectionscounter.SendText(chatnamei+()&*%); serverSocket1.Socket.Connectionsi.SendText(tmptext+()&*%); sleep(300); end; end; inc(counter); end else if pos(?*#,tmpte

34、xt)0 then /表示注冊信息 begin signpos:=pos(?*#,tmptext); member:=copy(tmptext,1,signpos-1); chattext:=copy(tmptext,signpos+6,length(tmptext)-6-length(member); with table1 do begin if table1.FindField(usename).AsString=member then socket.SendText(用戶名已經有人用了,請檢查后重新注冊。) else begin insertrecord(member,chattext

35、); memo1.Lines.Add(新用戶:+member+注冊成功!); socket.SendText(注冊成功,請先登陸再進行聊天!); end; end; endelse if pos(*&%#),tmptext)0 then / 有人走了 begin tmptext:=copy(tmptext,1,length(tmptext)-8);/ memo1.Lines.Add(用戶+tmptext+離開聊天室。); for i:=0 to counter-1 do serversocket1.Socket.Connectionsi.SendText(tmptext+$%#$); for

36、i:=listbox1.items.Count downto 1 do if listbox1.Items.Stringsi-1=tmptext then begin listbox1.Items.Delete(i-1); dec(counter); end; endelse / 當無任何標記時表示公聊 begin for i:=0 to counter-1 do serversocket1.Socket.Connectionsi.SendText(tmptext); end;end;procedure TForm1.N1Click(Sender: TObject);begin servers

37、ocket1.Active:=false; serversocket1.Close;end;procedure TForm1.ServerSocket1Accept(Sender: TObject; Socket: TCustomWinSocket);begin clientip:=socket.RemoteAddressend;procedure TForm1.ServerSocket1ClientError(Sender: TObject; Socket: TCustomWinSocket; ErrorEvent: TErrorEvent; var ErrorCode: Integer);

38、begin if errorcode=10054 then errorcode:=0;end;procedure TForm1.FormCreate(Sender: TObject);begin table1.Active:=true;end;procedure TForm1.Button1Click(Sender: TObject);begin if not serversocket1.Active then begin serversocket1.Active:=true; memo1.Lines.Add(服務器連接!+Datetimetostr(now)+); end else show

39、message(已經在監(jiān)聽狀態(tài));end;procedure TForm1.Button2Click(Sender: TObject);begin serversocket1.Active:=false; serversocket1.Close; statusbar1.SimpleText:=服務器已經關閉; memo1.Lines.Add(服務器關閉!+Datetimetostr(now)+); listbox1.Clear;end;procedure TForm1.Button3Click(Sender: TObject);begin Close;end;procedure TForm1.

40、FormShow(Sender: TObject);beginbutton1.Click;end;procedure TForm1.Button4Click(Sender: TObject);begin Form3.ShowModal;end;end.3.3 數據庫設計Delphi中的DataBase Desktop數據庫允許用戶創(chuàng)建、查看、排序、修改及查詢一系列的Paradox、dBASE及SQL格式的數據表格,選用Edit|Paste Link可以用DDE(動態(tài)數據交換Dynamic Data Exchange)與在其它應用程序中的數據建立激活動連接。利用Delphi的客戶/服務器功能,可

41、以在本地數據庫上或遠程數據庫服務器上開發(fā)客戶/服務器模式的應用程序。Delphi 的一個強有力的功能之一是可以將基于本地桌面數據庫系統(tǒng)的應用程序很容易地修改成客戶/服務器模式的應用。一個Delphi 數據庫應用程序訪問的是本地數據庫還是遠程SQL數據庫服務器上的數據庫,這對于最終用戶是完全透明的。在本次課設中要記錄那些注冊了的人的信息,就要使用Delphi中的DataBase Desktop數據庫來保存,要正確運行本次聊天程序,就需要建立chat的數據庫別名指向table目錄,可以使用Database Desktop 建立別名。服務器先運行,自動到監(jiān)聽模式,然后可以運行N個客戶端,這樣就能進行

42、聊天了。第四章 系統(tǒng)測試調試4.1測試調試過程測試調試:1.打開Delphi7,在form里面添聊天程序所需要的控件,對部分控件編程,完成聊天程序總體設計之后,按下F9運行看看是否出錯。2.如果第一步驟出錯,看看錯誤的外部表現,定位錯位位置。3.由第二步驟在來分析有關程序代碼,找出錯誤的內在原因。 4.修改程序代碼,排除這個錯誤。5.重復進行暴露了這個錯誤的原始測試以及某些回歸測試,以確保該錯誤確實被排除且沒有引入新的錯誤。6.如果所作的修正無效,則撤消這次改動,重復上述過程,直到找到一個有效的辦法為止。7.測試調試完所有錯誤之后,點下Run看看設計的界面是否和要求一致,如果不一致就說程序編譯

43、達不到要求,這就要重新修改程序直到達到要求為止。4.2 調試中出現的問題1.在客戶端設計時,不知道怎么保留注冊了的人的信息,經過查找資料,發(fā)現可以使用Delphi中自帶的DataBase Desktop數據庫記錄注冊信息,這樣問題就解決了。2.在服務器端設計時,不知道怎么顯示在線用戶以及他們的個人信息,通過socket打開監(jiān)聽,使它處在監(jiān)聽狀態(tài),這樣就能顯示在線用戶。3.數據庫的設計部分的設計出現了很多的問題,如怎樣記錄信息,怎么樣使聊天程序正常運行,以及怎么使服務器端的監(jiān)聽自動,經查閱有關數據庫方面的書和請教了老師最后這些問題一一解決了。4.局域網聊天時,發(fā)送信息過去在對方那里需10幾秒之后

44、才能顯示出來,這個問題困擾了好幾天,后面就簡化界面,能不用的控件就不用,盡量簡單,果然把這個問題解決了,現在局域網聊天時候,一發(fā)送完信息,在對方那立刻顯示。第五章 結論通過本次專業(yè)課程設計,本人對軟件開發(fā)過程有了更清晰的了解,首先是問題定義、需求分析,然后是功能設計、詳細設計等,并對軟件測試的方法、手段有了較深的理解。在設計過程還認真學習了與系統(tǒng)相關的知識,極大地拓寬了本人的知識面,本人感到收獲不小。 在課程設計的初期,從開始熟悉這些知識到對整體設計有了解,再從概要設計、詳細設計到開始編碼,以及最后的測試,整個過程感覺很充實,雖然遇到了不少困難,但當本人通過自己查資料、或是向指導老師請教以及向

45、同學請教,而設計出解決方案并成功實現時,那種成就感和滿足感足以鼓勵自己加班加點的辛苦。 因為以前沒有設計軟件的經驗,在這次設計的過程中,本人遇到專在面向對象程序開發(fā)知識方面的困難不是非常多,主要困難集中在數據庫、socket等方面的不足上,還有就是操作界面方面的問題。 經過這2個星期的專業(yè)課程設計,確實學到了不少的東西,同時也深感自己知識的欠缺。使本人在以后的學習工作中,一定要繼續(xù)堅持不斷地學習新興的專業(yè)知識及相關的非專業(yè)知識,只有這樣才能緊跟時代的潮流。參考文獻1 Marco Cantu.Delphi7從入門到精通M.北京:電子工業(yè)出版社,20032 劉藝.Delphi面向對象編程M.北京:

46、清華大學出版社,2004 3 黃超. Delphi網絡應用開發(fā)技術與實例M.北京:清華大學出版社,20054 甘志.DELPHI7高級應用開發(fā)篇M.北京:清華大學出版社,20065 王沛.Delphi7編程入門M.北京:機械工業(yè)出版社,2006附錄A:socket事件的應答當使用sockets寫應用程序時,大多數工作發(fā)生在socket控件的handler事件中.當通過socket連接開始讀或寫時,OnRead和OnWrite事件在non-blocking client sockets中發(fā)生從而通知sockets.同樣的,服務器sockets(blocking or non-blocking)收

47、到OnClientRead和OnClientWrite事件. 當服務器結束一個連接時,客戶scokets收到一個OnDisconnect事件.當客戶端結束一個連接時,服務器socket收到一個OnClientDisconnect事件. 另外,客戶端Sockets和服務器端socket從連接中收到一個錯誤信息時,都將產生有個錯誤事件. 錯誤事件:客戶sockets和服務器sockets通常會產生一個OnError事件,當他們從連接中收到一個錯誤信息的時候.你能夠寫一個OnError事件處理去響應這些錯誤信息.這個OnError事件處理提供傳送關于socket試圖做什么的時候這個錯誤發(fā)生的信息,以

48、及錯誤信息提供的錯誤代碼.可以在OnError事件處理中對這個錯誤作出響應,并且把錯誤代碼改為0,以避免socket產生一個例外. 當開始和完成發(fā)生時,socket控件通常會收到一個事件號(number of events).如果應用程序需要改變socket開始操作的處理過程或通過連接開始讀或寫操作時,將寫事件handlers去應答這些client events和server events. client events 當一個客戶socket打開一個連接時,以下事件發(fā)生: 1.一個OnLookup事件最先發(fā)生,它試圖去定位server socket.在這里不能改變Host,Address,Po

49、rt,Service屬性去改變想定位的服務器,但能夠使用Socket屬性去訪問client windows socket object,并且使用它的SocketHandle屬性去調用windows API,以便改變socket的客戶屬性.例如,如果想在客戶應用軟件中設置端口號,必須在server client連接前做這件事. 2.windows socket設置和初始化事件通知. 3.當找到server socket時一個OnConnecting事件發(fā)生.在這事件中,windows Socket object可以利用的是通過socket屬性提供關于連接的另一端的服務socket的一些信息.這是獲得實際使用來連接的端口和IP地址的第一個機會,它可能不同于從監(jiān)聽socket處同意連接時得到的端口或IP地址. 4.服務器同意連接請求,客戶端socket完成連接. 5.當一個連接得到確定后,一個OnConnect事件發(fā)生.如果socket立即開始通過連接讀或寫,就應寫一個OnConnec

溫馨提示

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

評論

0/150

提交評論