Python—網絡通訊編程之tcp通訊編程

服務端代碼

import socket

# 1.建立流式套接字實例
# server = socket.socket()            
server = socket.socket(socket.AF_INET, socket.SOCK_STREAM, 0)

# 2.使用bind方法綁定端口號。服務端綁定的ip和port(參數是元組)
server.bind(("127.0.0.1", 8832))

# 3.調用listen方法監聽,並指定最大的鏈接數量。設置監聽套接字,建立監聽隊列
server.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)   # 設置端口重用
server.listen(5)

# 4.等待客戶端連接
while True:
    print("正在等待客戶端連接...")
    conn, addr = server.accept()
    print("client connent...{0}:{1}".format(addr[0], addr[1]))
    # python3.x以上,網絡數據的發送接收都是byte類型,若是發送的數據是str類型的則須要進行編碼.
    conn.send(("鏈接成功,服務端端口:%s,客戶端端口:%s" % (8832, addr[1])).encode())

    # 5.收發消息
    while True:
        data = conn.recv(1024)      # 接收客戶端發來的消息
        # if not data or data.decode("utf-8") == "exit":
        if not data or data == b"exit":
            break
        print(data.decode())
        conn.send(("服務端返回信息:%s" % data.decode()).encode())             # 處理客戶端數據
    conn.close()                    # 主動關閉鏈接
	
# 6.關閉套接字
server.close()

知識點1:設置端口重用:server.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)。python

知識點2:conn, addr = server.accept()的返回值是一個元組:返回的conn表明一個新的套接字用來和客戶端通訊。返回的addr是鏈接的客戶端的地址(也是元組,包含ip與端口)。python3.x

知識點3:發送send()函數,與接收recv()函數,操做的都是字節串。recv()函數是阻塞函數。服務器

知識點4:Socket()函數的參數有三個:網絡

  • 參數一:這個參數含義說明定義的socket實例默認是經過ipv4進行鏈接的。
  1. socket.AF_INET:  默認IPv4。使用ipv4進行鏈接通訊。
  2. socket.AF_INET6:用於IPv6。使用ipv6進行鏈接通訊。
  3. socket.AF_UNIX:只可以用於單一的Unix系統進程間通訊。
  • 參數二:前面兩個用的多,後面三個用的少。
  1. socket.SOCK_STREAM:流式套接字,傳輸層基於tcp協議進行通訊。
  2. socket.SOCK_DGRAM:數據報套接字,傳輸層基於udp協議進行通訊。
  3. socket.SOCK_RAW:     原始套接字,訪問底層協議的套接字。
  4. socket.SOCK_RDM:     可靠UDP形式。
  5. socket.SOCK_SEQPACKET:可靠的連續數據包服務。
  • 參數三:協議號。
  1. 0:默認,能夠省略。
  2. CAN_RAW或CAN_BCM:地址族爲AF_CAN時。

客戶端代碼

import socket

# 1.socket實例初始化
# client = socket.socket()         
client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

# 2.發起鏈接:根據服務端綁定的ip和端口,進行鏈接訪問服務端
client.connect(("127.0.0.1", 8832))

# 3.與服務端交互,接收發送信息
while True:      
    data = client.recv(1024)  # 接收主機信息
    print(data.decode())      # 打印接收的數據,此處的byte類型數據特指python3.x以上
    msg = input("請輸入要發送的信息...")
    client.send(msg.encode())
    if not msg or msg == "exit":
        break
	
# 4.關閉套接字
client.close()

1.服務端與客戶端能夠一直通訊,收發消息。直到客戶端輸入"exit",客戶端退出,服務端等待下一個客戶端鏈接。socket

2.當第一個客戶端與服務端一直連着的時候,第二個客戶端沒法與服務器鏈接。直到第一個客戶端退出與服務器的鏈接,第二個客戶端才能與服務器鏈接。tcp

3.當第一個客戶端退出時,服務器會立馬鏈接第二個客戶端。第二個客戶端以前發的信息,服務器就會收到,並返回信息。可能第二個發送端發的信息都在發送緩衝區裏。函數

參考:https://www.liaoxuefeng.com/wiki/1016959663602400/1017788916649408編碼

相關文章
相關標籤/搜索