socket通訊基於tcp和udp
tcp和udp的區別:
1.tcp是面向連線的,udp是無連線的,tcp提供可靠的服務,也就是說,通過tcp連線傳輸的資料不會丟失,沒有重複,並且按順序到達,udp沒有可靠性。
2、tcp是面向位元組流的,實際上是tcp把資料看成一連串無結構的位元組流;udp是面向報文的。tcp是全雙工的可靠通道,udp是不可靠通道。
基於tcp的socket服務端
#1.首先引用socket庫 2.建立socket套位元組物件 3.繫結ip和埠 4.監聽來自客戶端的連線,可設定連最大連線數 5.接收來自客戶端連線 6.接收訊息及回覆(傳送)訊息
import
socket
#socket.af_inet 基於網路 ,socket.sock_stream 以位元組流的方式
s =socket.socket(socket.af_inet, socket.sock_stream)
#重用位址
s.setsockopt(socket.sol_socket, socket.so_reuseaddr, 1)
#繫結ip和埠
s.bind(('
127.0.0.1
', 8000))
#監聽連線
s.listen(5)
print("
服務端啟動...")
#接收連線,返回元組
conn, addr =s.accept()
#主動發訊息給客戶端,呼叫send()方法,將字串轉成位元組流傳送給客戶端
conn.send("
來自服務端的問候
".encode('
utf-8'))
print("
conn: %s addr: %s
" %(conn, addr))
try:
while
true:
#呼叫recv的方法接收客戶端的訊息,每次1024位元組的接收
msg = conn.recv(1024)
ifmsg:
#接收到的訊息是位元組流,需要解碼成字串物件
print("
收到來自客戶端的訊息: %s
" % msg.decode('
utf-8'))
#input 使用者輸入
to_msg = input("
請輸入要傳送給客戶端的訊息: ")
ifto_msg:
# 回覆
conn.send(to_msg.encode(
'utf-8'))
else
:
pass
except
exception:
print("
error")
finally
:
#關閉客戶端連線
conn.close()
#關閉服務端
s.close()
基於tcp的socket客戶端
importsocket
#建立socket物件
c =socket.socket(socket.af_inet, socket.sock_stream)
#c.connect(('127.0.0.1', 8000))
#與服務端建立連線, 引數位址,埠,傳入乙個元組
c.connect(('127.0.0.1
', 8888))
print("
客戶端啟動...")
while
true:
#使用者輸入
msg = input("
請輸入要傳送給服務端的訊息: >>>")
ifmsg:
#發訊息給客戶端
c.send(msg.encode('
utf-8'))
else
:
print("
抱歉您未輸入任何資訊!")
msg = input("
請輸入要傳送給服務端的資訊: >>>")
rec_msg = c.recv(1024)
ifrec_msg:
print("
收到來自服務端的訊息: %s
" % rec_msg.decode('
utf-8'))
else
:
break
#關閉連線
c.close()
socket是單執行緒,socket服務端接收乙個客戶端請求,其他客戶端請求進入等待。listen()限制最大接收的請求數量。
收發訊息時: 硬碟->以位元組流的方式讀入記憶體緩衝區->通過網路拷貝到接收方的記憶體緩衝區->寫入接收方硬碟->清空記憶體緩衝區
基於udp的socket服務端
#udp服務端 無連線
from socket import *ip_port = ('
127.0.0.1
', 8000)
rec_size = 1024
#建立乙個udp套位元組物件, af_inet基於網路,sock_dgram 資料報的方式
s_udp =socket(af_inet, sock_dgram)
#繫結ip和埠
s_udp.bind(ip_port)
print("
服務端開始服務中....")
while
true:
#接收客戶端的訊息和位址
data, address =s_udp.recvfrom(rec_size)
print("
收到來自客戶端< %s,%s >的訊息
" % address, data.decode('
utf-8'))
#傳送給客戶端訊息
s_udp.sendto(data.upper(), address)
基於udp的socket客戶端
#udp 客戶端
from socket import *rec_size = 1024ip_port = ('
127.0.0.1
', 8000)
#建立udp套位元組物件
c_udp =socket(af_inet, sock_dgram)
while
true:
try:
msg = input("
傳送給服務端的訊息: >>>
").strip()
ifnot msg: continue
#給服務端傳送訊息
c_udp.sendto(msg.encode('
utf-8
'), ip_port)
#接收服務端的訊息
data, address =c_udp.recvfrom(rec_size)
print("
收到來自服務端的訊息:
", data.decode('
utf-8'))
except
exception:
continue
Socket 通訊 基本函式
int socket int domain,int type,int protocol socket 用於建立乙個socket描述符 socket descriptor 它唯一標識乙個socket int bind int sockfd,const struct sockaddr addr,sock...
基本Socket通訊流程
1.初始化socket 用於監聽 1 初始化 socket s s socket 2 繫結 bind s,3 監聽 listen s,2.建立連線 1 檢查狀態 int ret select if ret 0 新連線 2 建立新連線 如果有客戶端請求連線 temp accept 注意,此時並不使用原...
socket通訊的基本流程
寫在前面 本部落格內容主要為socket通訊的c語言實現,與tcp ip分類下的文章為對應互補內容。由於理論知識已在對應內容中有所介紹,因此本部落格中主要是 實現 include pragma comment lib,wsock32.lib int main int argc,char argv c...