1. 程式人生 > >Python教程12

Python教程12

Python教程12

  1.udp傳送資料:

import socket


def main():
    # 建立一個udp套接字
    udp_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)  # 第一個引數是ipv4協議,第二個引數是udp
    # 使用套接字傳送資料,第一個引數是傳送資料,第二個引數是一個元祖
    # udp_socket.sendto(b"jnjhhjdik111jj5555", ("192.168.1.7", 8080))  # 使用b表示傳送資料流是bit
    while True:
        
# 從鍵盤獲取資料 send_data = input("請輸入要傳送的資料:") if send_data == "exit": break udp_socket.sendto(send_data.encode("utf-8"), ("192.168.1.7", 8080)) # 多采用.encode("utf-8")設定資料流的編碼 # 關閉套接字 udp_socket.close() if __name__ == "__main__": main()

  2.udp接收資料

import
socket def main(): # 1.建立套接字 udp_socket2 = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) # 2.繫結本地資訊,如果一個網路程式不繫結,則系統會隨機分配 localaddr = ("", 7788) # ip地址和埠號,IP一般不用謝,表示本機的任何一個IP udp_socket2.bind(localaddr) while True: # 3.接收資料,1024表示接收的最大位元組數 recv_date = udp_socket2.recvfrom(1024)
# 4.列印接收的資料 print(recv_date) # 接收到的元組資料(b'http://www.cmsoft.cn', ('192.168.1.7', 8080))前面是資料資訊,後面傳送方的IP和埠 recv_msg = recv_date[0] # 接收到的資料 send_addr= recv_date[1] # 傳送方的資訊,是個元組 print("傳送方資訊:%s 傳送的資料:%s" % (str(send_addr), recv_msg.decode("gbk"))) # 傳送的英文不用解,Windows預設傳送的gbk解碼,Ubuntu是utf-8 # 5.關閉套接字 udp_socket2.close() if __name__ == '__main__': main()

  3.udp聊天工具

import socket


def send_msg(udp_socket):
    """傳送資訊"""
    # 定義傳送的需要的資訊
    dest_ip = input("請輸入對方的IP:")
    dest_port = int(input("請輸入對方埠號:"))
    send_data = input("請輸入需要傳送的資訊: ")
    udp_socket.sendto(send_data.encode("utf-8"), (dest_ip, dest_port))


def recv_msg(udp_socket):
    """接收資料"""
    recv_data = udp_socket.recvfrom(1024)
    print("傳送方的IP%s ,傳送的資訊%s" % (str(recv_data[1]), recv_data[0].decode("gbk")))


def main():
    # 建立套接字
    udp_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
    # 繫結資訊
    loacladdr = ("", 7788)
    udp_socket.bind(loacladdr)
    # 迴圈處理髮送接收資料
    while True:
        print("--------------XXX聊天工具-------------")
        print("1 .傳送資訊")
        print("2 .接收資訊")
        print("3 .退出系統")
        op = input("請輸入功能:")
        # 傳送資料
        if op == "1":
            send_msg(udp_socket)
        # 接收資料
        elif op == "2":
            recv_msg(udp_socket)
        elif op == "0":
            break
        else:
            print("輸入有誤,請重新輸入......")
    # 關閉套接字


if __name__ == '__main__':
    main()

   4.tcp_client傳送資訊

import socket


def main():
    # 1.建立套接字
    tcp_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    # 2.連線伺服器
    # tcp_socket.connect(("192.168.1.7", 7890))
    server_ip = input("請輸入伺服器IP:")
    server_port = int(input("請輸入伺服器的埠:"))
    server_addr = (server_ip, server_port)
    tcp_socket.connect(server_addr)
    # 3.傳送接收資料
    send_data = input("請輸入要傳送的資料:")
    tcp_socket.send(send_data.encode("gbk"))
    # 4.關閉套接字
    tcp_socket.close()


if __name__ == "__main__":
    main()

  5.tcp_server接收、傳送資料

import socket


def main():
    # 1.建立套接字
    tcp_server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    # 2.繫結資訊
    tcp_server_socket.bind(("", 7890))
    # 3.設定套接字為監聽狀態,預設都寫128
    tcp_server_socket.listen(128)
    while True:
        print("等待一個客戶端來連線........")
        # 4.客戶端連線
        new_client_socket, client_addr = tcp_server_socket.accept()
        print("列印連線的客戶端資訊:%s" % str(client_addr))
        # 迴圈接收、傳送資訊
        while True:
            # 5.接收/傳送客戶端資訊
            recv_data = new_client_socket.recv(1024)
            print("列印接收到客戶端的資訊:%s" % recv_data.decode("gbk"))
            # 注意客戶端未傳送資料,表示客戶端close,(客戶端是不能傳送為空值得),有資料則需要伺服器處理
            if recv_data:
                new_client_socket.send("伺服器接收成功......ok ....".encode("gbk"))  # Windows用gbk,Linux用utf-8
            else:
                break
        # 6.關閉套接字
        new_client_socket.close()
        print("已經服務完畢......")
    tcp_server_socket.close()


if __name__ == '__main__':
    main()

  6.檔案下載client

import socket


def main():
    # 1.建立套接字
    tcp_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    # 2.獲取伺服器的IP和埠
    dest_ip = input("請輸入伺服器IP:")
    dest_port = int(input("請輸入埠:"))
    # 3.連線伺服器
    tcp_socket.connect((dest_ip, dest_port))
    # 4.獲取下載的檔名
    download_file_name = input("請輸入需要下載的檔名:")
    # 5.將檔名傳送給伺服器
    tcp_socket.send(download_file_name.encode("gbk"))
    # 6.接收檔案中的資料
    recv_data = tcp_socket.recv(1024)
    # 如果有讀取到資料,則下載,沒有讀取到則伺服器不傳送資料,接收到為空
    if recv_data:
        # 7.儲存資料到檔案,新建檔案多用with open
        with open("[新]" + download_file_name, "wb") as f:
            f.write(recv_data)
    # 8.關閉套接字
    tcp_socket.close()


if __name__ == '__main__':
    main()

  7.檔案下載server

import socket


def send_file_2_client(new_client_socket, client_addr):
    file_name = new_client_socket.recv(1024).decode("gbk")
    print("客戶端s%需要下載的檔案:s%" % (str(client_addr), file_name))
    print("開始傳送資料給客戶端.....")
    file_content = None
    # 開啟檔案
    try:
        f = open(file_name, "rb")
        file_content = f.read()
        f.close()
    except Exception as ret:
        print("沒有下載的檔案。。。。")
    # 傳送檔案
    if file_content:
        new_client_socket.send(file_content)


def main():
    tcp_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    tcp_socket.bind(("", 7890))
    tcp_socket.listen(128)
    while True:
        new_client_socket, client_addr = tcp_socket.accept()
        # 呼叫下載方法
        send_file_2_client(new_client_socket, client_addr)
        new_client_socket.close()
    tcp_socket.close()


if __name__ == '__main__':
    main()