Python線程式“對講機”:socket網絡編程、線程

Python線程式“對講機”:socket網絡編程、線程

先看一下程序的運行效果:
在這裏插入圖片描述

一、什麼是socket?

socket是用於在兩個基於TCP/IP協議的應用程序之間相互復通信。我們平時用的QQ,微信,等社交軟件,基本都與socket編程有關。
在這裏插入圖片描述
上圖是我們平時訪問瀏覽器時的流程圖,但引入本文的,就是服務器客戶端之間的愛情瓜葛,而socket編程這個月老就是實現這倆人的交流。

1、在看這倆人甜蜜時,我們要學習幾個概念

本段摘自:【socket筆記】TCP、UDP通信總結

  • IP地址(InternetProtocolAddress):是指互聯網協議地址,又譯爲 網際協議地址。IP地址被用來給Internet上的電腦一個編號。我們可以把“個人電腦”比作“一臺電話”,那麼“IP地址”就相當於“電話號碼”。若計算機1知道計算機2的IP地址,則計算機1就能訪問計算機2。
  • 端口:端口使用16bit進行編號,即其範圍爲: 0-65536。但 0-1024 的端口一般由系統分配給計算機特定的服務接口。
  • 協議(Protocol):是通信雙方進行數據交互的一種約定。
  • 協議族:是多個協議的統稱。比如我們的TCP/IP協議族,其不僅僅是TCP協議、IP協議,而是多個協議的集合,其包含IP、TCP、UDP、FTP、SMTP等協議。

2、TCP協議
TCP(Transmission Control Protocol 傳輸控制協議):是一種面向連接的、可靠的、基於字節流的傳輸層通信協議,數據可以準確發送,數據丟失會重發。

  • TCP通信的特點:TCP的三次與四次對話

連接:

客戶端:服務器!我來造作了
服務器:客戶端!我給你開門
客戶端:服務器!謝謝

斷開:

客戶端:服務器!我要走了
服務器:客戶端!我去給你開門
服務器:客戶端!門開好了,可以滾了
客戶端:服務器!誒,好嘞,你等的

再他們互相叫名的過程中,其實就是一個互相確定傳輸的過程:
在連接時TCP有如下過程:
在這裏插入圖片描述
在斷開時有如下過程:
在這裏插入圖片描述
3、UDP協議
UDP(User Datagram Protocol, 用戶數據報協議):是一種無連接的傳輸層協議,提供面向事務的簡單不可靠信息傳送服務,可以保證通訊效率,傳輸延時小。例如視頻聊天應用中用的就是UDP協議,這樣可以保證及時丟失少量數據,視頻的顯示也不受很大影響。

二、socket編程

1、服務器端

  • 將接受功能單獨放入一個線程,讓此線程單獨運作,不讓他阻塞發送。
  • 代碼:
import socket
import threading
import sys

def server_lunch():
    HostPort = ('127.0.0.1', 9999)#設定主機名,端口
    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)#參數
    s.bind(HostPort)#綁定IP接口
    s.listen(20)#開始監聽
    conn, addr = s.accept()#開始握手
    print('Connecting by : ', addr)#顯示鏈接的administered
    welcome = "···weclome  to -LEAGUES OF SOPHON-···"
    conn.send(welcome.encode('utf8'))#至上歡迎辭
    return conn

def receive(conn):#接收函數
    while True:
        msg = conn.recv(1024).decode('utf8')#接收信息流,並轉化編碼
        print("clience says:",msg)
        if msg == "exit":
            sys.exit()#退出程序

if __name__ == '__main__':
    conn = server_lunch()#啓動服務端
    server_trd = threading.Thread(target=receive , args=(conn,))#開啓線程
    server_trd.start()
    while True:#循環輸入
        root = input(">>>").strip()
        conn.send(root.encode('utf8'))
        if root == "exit":
            s.close()

2、同理的客服端

import socket
import threading
import sys

def receive(s):#接收函數
    while True:
        msg = s.recv(1024).decode('utf8')
        if msg == "exit":
            sys.exit()
        print ("server says:", msg)

if __name__ == '__main__':
    hostport = ('127.0.0.1', 9999)
    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    s.connect(hostport)#連接接口
    print(s.recv(1024).decode())

    clience_trd = threading.Thread(target=receive,args=(s,))#啓動接收線程
    clience_trd.start()

    while True:
        user_input = input('>>> ').strip()
        s.send(user_input.encode('utf-8'))
        if user_input == 'quit':
            sys.exit()

運行結果:
在這裏插入圖片描述
在這裏插入圖片描述
實在是有趣。

推薦大家閱讀一下這兩篇文章。Python 網絡編程入門——用 Socket 做一個風花雪月服務器Python 進階必備:線程模塊 threading

往後可能去開發一個原始版的QQ,以作爲網絡編程學習的大作業,親情期待。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章