最近看了一些關於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協議是傳輸...