網絡編程 之 有用的 socket

socket

1.什麼是socket?

Socket又稱"套接字",應用程序通常通過"套接字"向網絡發出請求或者應答網絡請求,使主機間或者一臺計算機上的進程間可以通訊。

2.socket()函數

用 socket()函數來創建套接字,語法格式如下:
socket.socket([family[, type[, proto]]])
參數

  • family: 套接字家族可以使AF_UNIX或者AF_INET type:
  • 套接字類型可以根據是面向連接的還是非連接分爲SOCK_STREAM或SOCK_DGRAM
  • protocol: 一般不填默認爲0

3.基於UDP協議的Socket使用

udp是無鏈接的,啓動服務之後可以直接接受消息,不需要提前建立鏈接。
服務端
我們使用 socket 模塊的 socket 函數來創建一個 socket 對象。socket 對象可以通過調用其他函數來設置一個 socket 服務。
完整代碼如下:

#服務端
import socket
#1.創建一個服務端
server = socket.socket(type=socket.SOCK_DGRAM)
#2.綁定套接字
ip_port=("127.0.0.1",8000)
server.bind(ip_port)

while True:
    #3. 接收客戶端的消息
    msg,addr=server.recvfrom(1024)
    msg=msg.decode("utf-8")
    print("客戶端{}發給的消息是:{}".format(addr,msg))
    #4. 回覆客戶端
    content=input("我回復的消息是:")
    content=content.encode("utf-8")
    server.sendto(content,addr)
#關閉
server.close()

客戶端
完整代碼如下:

#客戶端
import socket
while True:
    #1. 創建一個服務器soket對象
    client=socket.socket(type=socket.SOCK_DGRAM)
    #2. 給服務器發消息
    #服務器地址和端口
    ip_port=("127.0.0.1",8000)
    content = input("請輸入你的聊天內容:")
    #以UTF-8編碼對content進行編碼,獲取二進制bytes類型對象,encode函數進行編碼
    content=content.encode("utf-8")


    #向服務器發一條消息,client。sendto 發送udp數據,將數據發送到套接字,address 形式是(ip地址 ,port)的元組
    client.sendto(content,ip_port)
    #3. 接收服務器信息
    #接收的是從服務器返回的消息。client。recvfrom() 接收udp數據,但返回的是(data,address)
    msg,addr=client.recvfrom(1024)
    msg=msg.decode("utf-8")
    #4. 打印消息
    print("服務器{}發的消息是:{}".format(addr,msg))
#5. 關閉套接字
client.close()

運行結果如下:
服務端
在這裏插入圖片描述
客戶端
在這裏插入圖片描述

4.基於TCP協議的Socket使用

Socket是基於tcp協議的,tcp是基於鏈接的,因此在通訊開始之前,一定要先建立相關的 鏈接,才能發送數據。必須先啓動服務端,然後再啓動客戶端去鏈接服務端。
服務端
完整代碼如下:

import socket

#1.創建服務器套接字
tcp_server = socket.socket(type=socket.SOCK_STREAM)
#2.綁定端口
ip_port=("127.0.0.1",9000)
tcp_server.bind(ip_port)

while True:
    # 3.將socket創建的套接字變成被動類型,等待客戶鏈接請求
    tcp_server.listen(5)
    # 4.讓服務器阻塞,等待客戶端的鏈接
    client_socket, client_addr = tcp_server.accept()

    #5. 接收客戶端發來的消息
    recv_msg=client_socket.recv(1024)
    recv_msg =recv_msg.decode("utf-8")

    #打印客戶端消息
    print("客戶端{}的消息是:{}".format(client_addr,recv_msg))

    #6. 給客戶端發消息
    msg=input("給客戶端發的消息是:")
    msg=msg.encode("utf-8")
    client_socket.send(msg)

client_socket.close()
tcp_server.close()

客戶端
完整代碼如下:

import socket

while True:
    #1. 創建客戶端的套接字
    tcp_client =socket.socket(type=socket.SOCK_STREAM)

    #2. 連接服務器端口
    ip_port=("127.0.0.1",9000)#服務器的ip端口
    tcp_client.connect(ip_port)

    #3. 給服務器發消息
    msg=input("給服務器發消息:")
    msg=msg.encode("utf-8")
    tcp_client.send(msg)

    #4. 接受服務器的消息
    recv_msg =tcp_client.recv(1024)
    recv_msg=recv_msg.decode("utf-8")
    print("服務器的消息是:{}".format(recv_msg))

#5. 關閉套接字
tcp_client.close()

運行結果如下:
服務端
在這裏插入圖片描述
客戶端

在這裏插入圖片描述

5.python裏的編碼

  • ASCII碼

    ASCII碼 表示127個英文字符

  • Unicode碼

    Unicode 用來把所有語言都統一到一套編碼裏,這樣就不會再有亂 碼問題了。Unicode 通常用兩個字節編碼(有的也用四個字節),而 ASCII碼通常用一個字節字節。ASCII碼轉換成Unicode在前面一個字節 補0

  • UTF-8碼

    UTF-8編碼把一個Unicode字符根據不同的數字大小編碼成1-6個字 節,常用的英文字母被編碼成1個字節,漢字通常是3個字節,只有很生 僻的字符纔會被編碼成4-6個字節。如果你要傳輸的文本包含大量英文 字符,用UTF-8編碼就能節省空間。 UTF-8的一個好處在於,原有的ASCII的編碼可以在UTF-8下繼續工 作。

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