TCP/IP通訊簡述與Matlab實現
1.TCP/IP通訊概述
1.1什麼是協議?
-
其實協議相當於兩個需要通訊的雙方預設的一種約定,它對資料的傳輸格式、傳輸速率、傳輸步驟,報文的交換方式做了統一的規定,通訊雙方必須同時遵守才能夠完成資料交換。而我們常說的TCP/IP協議其實是一個協議集合,是一個協議族的統稱,裡面包括了 IP 協議、ICMP 協議、TCP 協議、以及 http、ftp、pop3、https 協議等。網路中的計算機都採用這套協議族進行互聯。
-
TCP/IP協議按照層次分為以下幾層:
引自Matlab對TCP/IP的介紹: 傳輸控制協議(TCP)是位於Internet協議(IP)之上的傳輸協議,並且是最常用的網路協議之一。 MATLAB®TCP / IP客戶端支援使用原始套接字通訊,並允許您從MATLAB連線到遠端主機以讀取和寫入資料。 例如,您可以連線到遠端氣象站,獲取資料並繪製資料。
原文: Transmission Control Protocol (TCP) is a transport protocol layered on top of the Internet Protocol (IP) and is one of the most used networking protocols. The MATLAB® TCP/IP client support uses raw socket communication and lets you connect to remote hosts from MATLAB for reading and writing data. For example, you can connect to a remote weather station, acquire data, and plot the data.
Raw Socket : 即原始套接字,可以接收本機網絡卡上的資料幀或者資料包.
- TCP / IP具有一端傳輸到連線的另一端的長資料流,而另一長資料流則沿相反的方向流動。 一端的TCP / IP堆疊負責將資料流分解為資料包併發送那些資料包,而另一端的堆疊則負責使用資料包頭中的資訊將資料包重組為資料流。
- TCP / IP傳送的資料包包含唯一的序列號。 在通訊開始時,將起始序列號傳送到另一端。 接收方確認每個資料包,並且確認包含序列號,以便傳送方知道已確認哪個資料包。 由於傳送方會收到每個收到的資料包的確認,因此傳送方會知道資料包何時未到達並可以重新發送它們。 同樣,接收者可以按正確的順序將亂序到達的資料包重新組合。
2.Matlab實現TCP/IP通訊
有了上面簡單瞭解,趕緊看看如何實現,例如有兩臺電腦,連線到了同一個區域網,它們的Ip地址分別為:192.168.1.103和192.168.1.108,則可以通過TCP/IP實現兩臺電腦的通訊,將下面兩端程式分別在兩臺電腦上執行,就可以通訊了。
注意,先要執行服務端的程式碼,最起碼要執行到fopen()那一行,然後程式會一直執行等著,知道再執行客戶端程式fopen()時,兩邊才會建立起通訊來。
%客戶端(傳送端)
%要執行客戶端的電腦IP地址為192.168.1.103,要與192.168.1.108連線,則有下面:
tcpip_client = tcpip('192.168.1.108',2999,'NetworkRole','client');%與IP地址為192.168.1.108建立連線,埠號為2999(可自己設定,隨便填都行,只要不佔用,但注意埠號範圍),本機作為客戶機連線。
tcpip_client.OutputBuffersize=100000;%這個是設定的緩衝區大小,matlab預設的緩衝區大小僅僅512bit,而一個double型別的資料就要佔據8位元組大小的空間,所以超出範圍後就寫不進去緩衝區,發出去的只有那一部分,所以有必要擴大緩衝區。所以弄大一點。
fopen(tcpip_client);%與一個伺服器建立連線,直到建立完成返回,否則報錯。
data=[32213,213,8645,34,3,6,56,5676,2343];;%傳送的資料。
fopen(tcpip_client);
fwrite(tcpip_client,data,'double');%寫入(傳送)資料
fclose(tcpip_client);
%服務端(接收端)
%要執行服務端的電腦IP地址為192.168.1.108,要與客戶端連線建立通訊,可以按照下面連線:
tcpip_server = tcpip('192.168.1.103',2999,'NetworkRole','server');%192.168.1.103是客戶端的地址,與此建立連線,埠號為2999(服務端和客戶端兩者要一樣),本機作為服務端。
%其實也可以按照下面的IP地址建立一個服務端,0.0.0.0地址可以監聽所有的請求的IP地址,所以就不用再寫客戶端的IP了
%tcpip_server= tcpip('0.0.0.0',2999,'NetworkRole','server');
tcpip_server.InputBuffersize=100000;%同理,接收端也要設定個緩衝區才能存下發過來的資料。
fopen(tcpip_server); %開啟伺服器,直到建立一個TCP連線才返回;
tcpip_server.BytesAvailable%如果收到了發過來的資料,這個就是可以讀取出的資料數量,比如上面的9個數值資料,每個資料佔用8個位元組,則總共會有72個位元組,那麼此時這個數就是72。如果沒有讀到,返回0
data= fread(tcpip_server,tcpip_server.BytesAvailable/8,'double') %讀取資料。 引數’tcpip_server.BytesAvailable/8‘代表著讀取幾個資料,由上文知道共有72位元組的資料,那麼就有72/8個數據了,全部都讀取。
fclose(tcpip_server);
上文中只是演示了用fread()和fwrite()函式傳送整形類的數值資料,要是想傳送字串等文字型別的資料的話,可以用fprintf()和fscanf()函式
上面也只是簡單的說明了一下如何實現TCP/IP通訊,此時除了用上面的方法之外,還可以只在一臺電腦上測試,只要開啟兩個Matlab分別執行這兩段程式就好(注意IP),或者下載個網路除錯助手,讓網路除錯助手當作客戶端/服務端,matlab中執行服務端/客戶端實現通訊。
此外,兩臺電腦之間的TCP/IP通訊也可以僅僅用一根網線來實現,只要用一根網線連線兩臺電腦的網口(此時不用聯網,連到同一區域網下),然後找到相對應的IP地址就可以用上面的辦法實現通訊了。