socket簡單的訪問流程

2021-05-26 10:06:14 字數 2937 閱讀 8961

最近看了一些關於socket的東西,感覺蠻好用的,現把socket的簡單通訊步驟記起來,以便學習:

1、新建socket        

socket  s = new socket(addressfamily addressfamily,sockettype sockettype,protocoltype protocoltype)。

如:socket s = new soc ket(addressfamily.internetw ork, sockettype.stream, protocoltype.tcp);

//當然還可以是其他協議型別,如udp  

socket s = new socket(addressfamily.internetwork, sockettype.dgram, protocoltype.udp);

注:stream socket是面向連線的,開啟之後的通訊過程必須始終保持連線。資料傳輸是可靠的,假如傳送方傳送「1,2」兩個包,則接收方也會以相同的順序接  接收到兩個包,且保證資料的正確性,它是基於tcp協議傳輸的。dgram socket是非面向連線,如果傳送方傳送乙個包,不需要事先建立連線,傳送方的資料不能保證收到,即使收到了也不能保證以相同的順序收到,但是能保證每個包資料的完整性,就像一封電報,它通過udp協議完成。

2、通過 connect 方法連線到指定的伺服器。

有connect就肯定要有東西讓它去connect啦,這就是ipendpoint。ipendpoint  類包含應用程式連線到主機上的服務所需的主機和埠資訊,通過組合服務的主機 ip 位址和埠號,ipendpoint  類形成連線到服務的連線點。 (在 internet 中,tcp/ip  使用 乙個網路位址和乙個服務埠號來唯一標識裝置)

如:ipendpoint ipe = new ipendpoint(ipaddress address, int port);

如何獲取ipaddress呢?.net有兩種類來處理:

(1)ipaddress 類:ipaddress  類包含計算機在 ip  網路上的位址。其 parse 方法可將 ip位址字串轉換為 ipaddress  例項。下面的語句建立一ipaddress  例項:ipaddress myip = ipaddress.parse("192.168.1.2");

(2)dns 類:向使用 tcp/ip internet  服務的應用程式提供網域名稱服務。其 resolve  方法查詢 dns  伺服器以將使用者友好的網域名稱(如www.csdn.com)對映到數字形式的 internet  位址(61.155.169.116)。resolve 方法 返回乙個 iphostenty  例項,該例項包含所請求名稱的位址和別名的列表。大多數情況下,可以使用 addresslist 陣列中返回的第乙個位址。下面的**獲取乙個  ipaddress  例項,該例項包含伺服器 www.cnblogs.com  的 ip  位址。

如:iphostentry ihe = dns.resolve("www.csdn.com");

ipaddress iar = ihe.addresslist[0];

也可以使用 gethostname 方法得到 iphostentry 例項:

iphosntentry ihe=dns.gethostbyname("www.csdn.com")

知道了上面的知識後,我們很容易就知道怎麼連線伺服器了吧:

ipaddress myip = ipaddress.parse("192.168.1.2");

ipendpoint ipep = new ipendpoint(myip,8888);

trycatch

(socketexception ex)

//如果在執行socket連線時,伺服器的socket偵聽沒有開啟的話,會產生乙個socketexception異常,如果沒有異常發生,那恭喜你,你已經與伺服器連線上了,接下來就可以跟伺服器通訊了。

3、成功連線後我們就可以通訊啦!!通過 send/sendto 方法向遠端伺服器傳送資料,而後可以通過 receive/receivefrom 從服務端接收資料。

send :      public int send(byte buffer);   //直接把要傳送的資料轉換為system.byte 型別的陣列傳送,返回已傳送到連線的socket 的位元組數

public int send(byte buffer, int offset, int size, socketflags socketflags); //offset傳送的開始位置,size: 要傳送的位元組數,socketflags

指定套接字接收和傳送的行為;

receive:     public int receive(byte buffer, int offset, int size, socketflags socketflags);  //buffer儲存所接收資料的位置,所以在receive前要先初始化                         byte, offset:buffer儲存的位置,size:接收的位元組數

......

通常接收方都必須繫結本機的終結點,然後偵聽

ipendpoint ipep = new ipendpoint(ipaddress.any, int.parse("8888")); 指定所有網路介面上的客戶端活動

//建立乙個套接字

socket rec = new socket(addressfamily.internetwork, sockettype.stream, protocoltype.tcp);

//繫結套接字到指定埠

rec.bind(ipep);

rec.listen(10);  //10是掛起連線佇列的最大長度。

while (true)

進入while迴圈,等待新的聯接;如果有新的聯接,那麼建立新的socket來對應這個聯接的會話。值得注意的就是這一句聯接**:rec.accept()。執行這一句的時候,程式就在這個地方等待,直到有新的聯檢請求的時候程式才會執行下一句。這是同步執行,當然也可以非同步執行。

Socket程式設計的流程

socket呼叫的資料型別及其切換函式 htons htols i addr sockaddr in socket呼叫所需函式 wsastartup wsaclearup socket closesocket bind listen accept connect send sendto recv r...

Socket連線的流程

套接字是支援tcp ip協議網路通訊的基本操作單元,可以將套接字看作不同主機間的程序雙向通訊的端點,它構成了單個主機內及整個網路間的程式設計介面。套接字存在於通訊域中,通訊域是為了處理 一般的執行緒通過套接字通訊而引進的一種抽象概念。套接字通常會和同乙個域中的套接字交換資料 資料交換也可能會穿越域的...

socket流程原理

網路由下往上分為 物理層 資料鏈路層 網路層 傳輸層 會話層 表示層和應用層。通過初步的了解,我知道ip協議對應於網路層,tcp協議對應於傳輸層,而http協議對應於應用層,三者從本質上來說沒有可比性,socket則是對tcp ip協議的封裝和應用 程式設計師層面上 也可以說,tpc ip協議是傳輸...