socket通訊基本使用

2022-09-12 20:33:13 字數 3583 閱讀 2299

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客戶端

import

socket

#建立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...