1. 程式人生 > 其它 >CS/BS架構。。socket套接字

CS/BS架構。。socket套接字

CS/BS架構

1.基於TCP的socket服務端和客戶端
2.加入連結迴圈
3.加入通訊迴圈

http的預設埠80
https的預設埠443

先從伺服器端說起。
伺服器端先初始化Socket,
然後與埠繫結(bind),
對埠進行監聽(listen),
呼叫accept阻塞,等待客戶端連線。
在這時如果有個客戶端初始化一個Socket,
然後連線伺服器(connect),如果連線成功,
這時客戶端與伺服器端的連線就建立了。
客戶端傳送資料請求,伺服器端接收請求並處理請求,
然後把迴應資料傳送給客戶端,客戶端讀取資料,最後關閉連線,一次互動結束.

TCP服務端  socket --> bind --> listen --> accept -->read -->write -->read -->close
TCP客戶端  socket -->  connect --> write --> read --> close 

# 獲取tcp/ip套接字
tcpSock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

# 獲取udp/ip套接字
udpSock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)

bind 繫結ip或埠
listen 監聽客戶端 
accept 接收
傳遞結束關閉當前工作的客戶端

tcp
# 服務端
# # 服務端
# import socket
# # 第一個socket是模組名,第二個是類名
# # SOCK_STREAM ==> 基於TCP協議寫的
# server = socket.socket(family=socket.AF_INET, type=socket.SOCK_STREAM)
#
# # 不傳就代表tcp協議
# # server = socket.socket()
#
# # 繫結監聽地址  http的預設埠80  https的預設埠443
# server.bind(('127.0.0.1',8080))
#
# # listen監聽,半連線池  ps:不是同時服務5個
# server.listen(5)
#
# # 接收訊息
# print('正在接受客戶端資訊:')
# while True:
#     # sock 當前連線物件  addr 客戶端的地址 ip+埠port
#     sock, addr = server.accept()
#     print(sock)
#     print(addr)
#
#     while True:
#         try:
#              # 1024 bytes 最多接收1024位元組
#             data = sock.recv(1024)
#             if len(data) == 0:
#                 break
#             print(data)
#
#             sock.send(data.upper())
#         except Exception as e:
#             print(e)
#             break
#     sock.close()
#
# server.close()


# 客戶端
# import socket
# 
# client = socket.socket()
# 
# client.connect(('1027.0.0.1',8080))
# while True:
#     input_data = input('請輸入要傳輸的資料:(q to quit)').strip()
# 
#     if not input_data:continue
# 
#     if input_data == 'q':
#         break
# 
#     client.send(input_data.encode('utf-8'))
# 
#     data = client.recv(1024)
#     print(data)
# 
# client.close()

udp
服務端
import  socket

# SOCK_DGRAM =》  udp服務端
# SOCK_STREAM =》 tcp服務端
server = socket.socket(type=socket.SOCK_DGRAM)

server.bind(('127.0.0.1', 8080))

while True:
# client_addr: 客戶端地址
    data, client_addr = server.recvfrom(1024)

    print(data)
    print(client_addr)

    server.sendto(data.upper(), client_addr)

server.close()


客戶端
import socket

client = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)  # 資料報協議-》UDP

while True:
    msg = input('>>: ').strip()  # msg=''
    client.sendto(msg.encode('utf-8'), ('127.0.0.1', 8080))

    # 接收服務端返回的資料
    data, server_addr = client.recvfrom(1024)
    print(data)

client.close()

程序

程序的概念

    程序是系統進行資源分配和排程的基本單位

    程式和程序:
        程式是靜態的,沒有生命週期
        程序是動態的,是有生命週期的

    協程
    程序是作業系統分配資源的基本單位,執行緒是作業系統執行的最小單位
    程序不是實際幹活的人,真正幹活的是執行緒

    一個程式中必須要有一個程序
    一個程序必須要有一個執行緒

    程序的三種狀態:
        就緒態:
        執行態
        阻塞態

程序排程:(瞭解)
    先來先服務 
    短作業優先
    時間片輪轉法
    
i/o密集型

io阻塞
input
output

計算密集型 沒有IO消耗