Python簡單的網絡編程

  • 計算機網絡:是多臺獨立自主的計算機形成的一個系統。
    連接起來的目的是計算機之間共享資源。
    使用TCP(能做到數據不傳丟、流量控制、擁塞控制)/ICP連接起來的叫互聯網。
#  創建一個無功能的服務器
from socket import socket, AF_INET, SOCK_STREAM
# SOCK_STREAM使用tcp,SOCK_DGRAM使用udp


def main():
    # 創建一個基於TCP協議的套接字對象
    # 因爲我們做的是應用級的服務/產品,所以可以利用現有的傳輸服務來實現數據傳輸
    server = socket()  # AF_INET, SOCK_STREAM IPv4聯網,只能這麼寫
    # 綁定IP地址(網絡上主機的身份標識)和端口(用來區分不同服務的IP 地址的擴展,一個端口對應一個服務)(端口不是一個設備)
    server.bind(('10.7.189.75', 6543))  # ip寫成localhost表示本地,6543表示端口號
    # 開始監聽客戶端的連接
    server.listen(512)  # 512表示隊列大小
    print('服務器已經啓動正在監聽...')
    while True:
        # 通過accept方法接收客戶端的連接
        # accept方法是一個阻塞式的方法,如果沒有客戶端連上來
        # 那麼accept方法就會讓代碼阻塞,知道有客戶端連接成功才返回
        # accept方法返回一個元組,元組中的第一個值代表客戶端的對象
        # 元組中的第二個值又是一個元組,其中有客戶端的IP地址和客戶端的端口
        # client = server.accept()
        # print(client)
        client, addr = server.accept()
        print(addr, '連接成功.')
        client.send('hello789'.encode('utf-8'))
        client.close()


if __name__ == '__main__':
    main()

模擬一個聊天服務器

from socket import socket
from threading import Thread

# TCP - Transfer Control Protocol
# UDP - User Datagram Protocol


def main():
    class ClientHandler(Thread):

        def __init__(self, client):
            super().__init__()
            self._client = client

        def run(self):
            while True:
                try:
                    data = self._client.recv(1024)  # 返回的是二進制數據
                    for client in clients:
                        # if client != self._client  不給自己轉發消息
                        client.send(data)  # 轉發消息
                    if data.decode('utf-8') == 'byebye':
                        clients.remove(self._client)
                        self._client.close()  # 與說‘byebye’的客戶端斷開連接
                        break
                except Exception as e:  # 獲取異常消息
                    print(e)  # 打印異常消息
                    clients.remove(self._client)  # 移除異常客戶端
                    break

    server = socket()
    # 這裏可以使用Python命令行參數 - sys.argv
    server.bind(('10.7.189.75', 54321))  # 端口號不要跟敏感號重複,建議取1025-65536區間
    # 開始監聽
    server.listen(512)
    clients = []
    while True:
        # 接收用戶請求
        client, addr = server.accept()
        clients.append(client)
        ClientHandler(client).start()


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