利用Delphi編寫Socket通訊程式

2022-06-30 04:00:09 字數 2110 閱讀 6653

一、delphi與socket

計算機網路是由一系列網路通訊協議組成的,其中的核心協議是傳輸層的tcp/ip和udp協議。tcp是面向連線的,通訊雙方保持一條通路,好比目前的**線,使用telnet登陸bbs,用的就是tcp協議;udp是無連線的,通訊雙方都不保持對方的狀態,瀏覽器訪問internet時使用的http協議就是基於udp協議的。tcp和udp協議都非常複雜,尤其是tcp協議,為了保證網路傳輸的正確性和有效性,必須進行一系列複雜的糾錯和排序等處理。

socket是建立在傳輸層協議(主要是tcp和udp)上的一種套接字規範,最初是由美國加州berkley大學提出,它定義兩台計算機間進行通訊的規範(也是一種程式設計規範),如果說兩台計算機是利用乙個「通道「進行通訊,那麼這個「通道「的兩端就是兩個套接字。套接字遮蔽了底層通訊軟體和具體作業系統的差異,使得任何兩台安裝了tcp協議軟體和實現了套接字規範的計算機之間的通訊成為可能。

微軟的windows socket規範(簡稱winsock)對berkley的套接字規範進行了擴充套件,利用標準的socket的方法,可以同任何平台上的socket進行通訊;利用其擴充套件,可以更有效地實現在windows平台上計算機間的通訊。在delphi中,其底層的socket也應該是windows的socket。socket減輕了編寫計算機間通訊軟體的難度,但總的說來還是相當複雜的(這一點在後面具體會講到);inprise在delphi中對windows socket進行了有效的封裝,使得使用者可以很方便地編寫網路通訊程式。

三、標準socket與delphi中的socket。

標準的socket的應用程式框架如下:server方:socket()[新建乙個socket]--bind()[同伺服器位址邦定]--listen()--accept()--block wait--read()[接受訊息,在windows平台中,方法為send(tcp),或者是sendto(udp)]--處理服務請求--write()[傳送訊息,在windows平台中,方法為send(tcp),或者為sendto(udp)。

client方相對簡單:socket()--connect()[通過一定的port連線特定的伺服器,這是與伺服器建立連線]--write()--read()。

socket可以是基於tcp的,也可以是基於udp,同時socket甚至建立在其他的協議,比如ipx/spx,decnet等。在新建乙個socket時,可以指定新建何類socket。bind()用來同伺服器的位址邦定,如果乙個主機只有乙個ip位址,實際上邦定的作用就相對多餘了。listen()開始監聽網路,accept()用於接受連線,其返回值是保持同客戶機聯絡的socket。

在delphi中,對於windows中的socket進行了有效的封裝。在delphi中,按其繼承關係,可以分層兩類:

一、tcomponent--tabstractsocket--tcustomsocket--tcustomserversocket--tserversockettcomponent--tabstractsocket--tcustomsocket--tclientsocket

二、直接從tobject繼承過來: tobject--tcustomwinsocket--tserverwinsocket tobject--tcustomwinsocket--tclientwinsocket tobject--tcustomwinsocket--tserverclientwinsocket可以看出第一類建立在tcustomsocket基礎上,第二類建立在tcustomwinsocket的基礎上。第一類建立在tcomponet的基礎上,第二類直接構建在tobject基礎上。因此如果使用者非常熟悉socket並且想要編寫控制台程式時,可以使用tcustomwinscoket類。

同uses中可以看出,它們都在scktcomp.pas中實現,而在schtcomp.pas中,則包含了winsock.pas檔案,如果繼續深入winsock檔案,在其中可以發現所有的windows socket的基本方法。

實際上,如果你了解了標準socket的應用程式框架,對於使用delphi編寫socket應用程式也就得心應手了;這不是說你必須了解複雜的socket中的標準函式,也沒有必要,因為delphi已經為你做了很好的封裝了,這也正是delphi的強勢所在,你只要了解那麼一點點的基本框架。

這是我對delphi中的socket應用的理解,不足之處希望大家指正。同時也樂於為大家解答delphi中有關socket的問題。

Delphi 編寫系統服務

新建乙個類,例如名字叫做tnoticethread,繼承自tthread,並重寫protected過程execute。在noticeservice的類定義中新增乙個noticethread物件。找到屬性的events選項卡,分別新增onstart,onpause,oncontinue,onstop事...

Delphi編寫Windows NT中服務程式

windows nt服務程式不同於一般的執行程式,它不需要nt登入進去,只需要開機進入nt系統便可以執行,一般用於系統服務方面的應用,學會編寫nt服務程式對網路管理人員而言是非常重要的,delphi作為一種高效 快速 強大的開發語言,為開發nt服務程式提供了非常便捷的方法,加上其視覺化介面以及與資料...

利用DEBUG API編寫Loader Path

loader並不是什麼很神秘的技術,微軟提供了一組debug api來方便第三方監視程式.這裡我用debug api製作了乙個簡單的loader程式.這個loader要幹的事有 1.啟動目標程式.2.讀取 修改目標程式的記憶體 或 暫存器 用到的debug api有 createprocess 用於...