socket簡介
socket誕生解決了網路上乙個重要的問題,就是完美的保障了通訊的準確性,目前網路上各種各樣的服務大多都是基於socket來完成通訊的,可見socket在通訊中舉足輕重。
什麼是socket
我們目前的生活中網際網路每一秒都傳送著大量的資訊,怎麼才能準確通訊呢?
我們先從標識乙個程序開始吧,在一台電腦裝置上當我們每開啟乙個應用的時候系統就會產生乙個執行著的程序並且給這個程序了乙個唯一標識,但是這個標識只是電腦上區分不同應用的標識,在協議中在網路層可以通過「ip位址」唯一的標識網路中的主機裝置,在傳輸層中可以通過「協議和埠號」唯一標識網路中的程序,這樣一來為了更好準確的標記與程序進行互動這時神奇的socket誕生了,那它到底神奇在**呢?
大多就是利用「ip位址,協議,埠」準確而一部到位的通訊,簡單點說就是程序之間資料完美共享。
socket的udp協議應用
首先我們先通過圖來說明一下流程:
這樣一來我們先用**來解決用udp客戶端給服務端發訊息**如下:
客戶端:
#伺服器的位址和埠
#ip_port=(("10.1.12.51",8000))
while
true
: content =
input
("請輸入你的訊息:"
)if content==
"stop"
:break
#以utf-8編碼對content進行編碼,獲取二進位制bytes型別物件,encode進行編碼
# content=content.encode("utf-8")
#向伺服器發一條訊息,client.sendto 傳送udp資料,將資料傳送到套接字,address形式是(ip位址,pot)元組
client.sendto(content.encode(
"utf-8"),
("10.1.12.51"
,8000))
#3.接收伺服器訊息
#接收的是從伺服器返回的訊息
msg,addr=client.recvfrom(
1024
)# msg=msg.decode("utf-8")
#4.列印訊息
print
("客戶端{}發的訊息是:{}"
.format
(addr,msg.decode(
"utf-8"))
)#5.關閉套接字
client.close(
)
服務端:
#encoding:utf-8
import socket
#1.建立乙個伺服器socket物件
udp_sk=socket.socket(
type
=socket.sock_dgram)
udp_sk.bind(
("10.1.12.51"
,8000))
while
true
: msg,addr=udp_sk.recvfrom(
1024
)print
(msg.decode(
"utf-8"))
info=
input
(">>>server:"
).encode(
"utf-8"
)if info==
"stop"
:break
udp_sk.sendto(info,addr)
print
("客戶端{}發的訊息是:{}"
.format
(addr, msg)
)udp_sk.close(
)
總結:udp是無鏈結的,啟動服務之後可以直接接受訊息,不需要提前建立鏈結,這裡使用套接字,type中寫套接字的型別(流式套接字主要用於tcp協議,資料報套接字主要用於udp協議 ),使用套接字的流程有點像檔案的使用流程,首先建立套接字,然後套接字收/發資料,最後關閉套接字。
socket的tcp協議應用
首先我們先通過圖來說明一下流程:
這樣一來我們先用**來解決用tcp客戶端給服務端發訊息**如下:
客戶端:
#encoding:utf-8
import socket
#建立客戶端的套接字
while
true
: tcp_client=socket.socket(
type
=socket.sock_stream)
#繫結伺服器端口
ip_port=
("10.1.12.51"
,8000
) tcp_client.connect(ip_port)
#給伺服器發訊息
msg=
input
("給伺服器發訊息:"
) msg=msg.encode(
"utf-8"
) tcp_client.send(msg)
#接受伺服器的訊息
recv_msg=tcp_client.recv(
1024
) recv_msg=recv_msg.decode(
"utf-8"
)print
("伺服器的訊息是:{}"
.format
(recv_msg)
)#關閉套接字
tcp_client.close(
)
服務端:
#encoding:utf-8
import socket
#1.建立乙個伺服器socket物件
udp_sk=socket.socket(
type
=socket.sock_dgram)
udp_sk.bind(
("127.0.0.1"
,8000))
while
true
: msg,addr=udp_sk.recvfrom(
1024
)print
(msg.decode(
"utf-8"))
info=
input
(">>>server:"
).encode(
"utf-8"
)if info==
"stop"
:break
udp_sk.sendto(info,addr)
print
("客戶端{}發的訊息是:{}"
.format
(addr, msg)
)udp_sk.close(
)
socket的中的tcp協議與udp協議的不同點
1.面向連線(確認有建立三方連線,連線已建立才能傳輸)
2.有序資料傳輸
3.重發丟失的資料報
4.捨棄重複的資料報
5.無差錯的資料傳輸
6.阻塞/流量控制
神奇的串列埠通訊
我們在使用stm32進行一些測試的時候,會經常使用到串列埠。那麼我們可能就會有個疑問,串列埠到底是個什麼?串列埠也就是序列介面,是用來進行通訊的,通俗來講,我們可以使用串列埠實現兩個控制器之間,或微控制器與pc端的相互傳遞資料,也就是實現了通訊的一種。在stm32mini板上,有三個串列埠,我們經常...
簡易的Socket通訊
非常簡單的socket通訊 上次使用過的,還花了一些時間,保留以適用於偶而需要通訊的情況救急用。以下的四段 完成了使用簡單的tcp udp協議來進行通訊的全部所需!1 include string 2 include stdlib.h 3 include stdio.h 4 include coni...
socket 的通訊過程
1.建立套接字 linux在利用socket 系統呼叫建立新的套接字時,需要傳遞套接字的位址族識別符號 套接字型別以及協議,其函式定義於net socket.c中 asmlinkage long sys socket int family,int type,int protocol 實際上,套接字對...