【TCP/IP網路程式設計實驗】之【python實現客戶端給伺服器傳送小寫字母,伺服器返回大寫字母(TCP)】

AA8j發表於2020-11-05

1.0

Server

import socket
import time


def create_server(hostAndPort: tuple, data_size: int, data_type: str, connect_max: int):
    """
    建立伺服器

    :param hostAndPort: 本機IP和開放埠
    :param data_size: 最大傳輸位元組
    :param data_type: 編解碼格式
    :param connect_max: 最大連線數
    :return:
    """
    try:
        # 建立伺服器socket 物件,模式為TCP
        server = socket.socket(
            socket.AF_INET, socket.SOCK_STREAM  # TCP
        )
        # 繫結主機IP與埠
        server.bind(hostAndPort)
        # 設定最大連線數
        server.listen(connect_max)

        # 退出標緻
        exit_flag = 0
        while True:
            print('等待連線。。。', end='')
            # 接收套接字物件與地址
            client_socket, add = server.accept()
            print('\r[{}]{}連線成功!'.format(time.asctime(), add))
            while not exit_flag:
                # 接收內容,並解碼
                receiver_data = client_socket.recv(data_size).decode(data_type)
                # 退出標緻
                if receiver_data == 'exit':
                    exit_flag = 1
                    client_socket.send('exit'.encode(data_type))
                    print('[{}]{}已退出'.format(time.asctime(), add))
                else:
                    # 列印接收的內容
                    print('[{}]接收到來自{}的內容:{}'.format(time.asctime(), add, receiver_data))
                    # 將字母全部轉為大寫
                    send_data = receiver_data.upper()
                    # 利用客戶端套接字物件傳送給客戶端
                    client_socket.send(send_data.encode(data_type))
                    # 列印傳送的內容
                    print('已傳送給{}內容:{}'.format(add, send_data))
    except Exception as e:
        raise e


if __name__ == '__main__':
    create_server(('127.0.0.1', 8888), 1024, 'utf-8', 5)

client

import socket
import time


def create_client(server_host_and_port: tuple, data_size: int, data_type: str):
    """
    建立客戶端
    :param server_host_and_port: 伺服器IP及埠
    :param data_size: 傳輸位元組大小
    :param data_type: 編解碼型別
    :return:
    """
    try:
        # 建立客戶端socket物件,模式為TCP
        client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        # 連線伺服器
        client.connect(server_host_and_port)
        # 退出標緻
        exit_flag = 0
        while not exit_flag:
            # 輸入要傳送的內容
            send_data = input('請輸入要傳送的字元:')
            # 編碼併傳送內容
            client.send(send_data.encode(data_type))
            # 接收內容並解碼
            receive_data = client.recv(data_size).decode(data_type)
            if receive_data == 'exit':
                exit_flag = 1
            else:
                # 列印伺服器返回的內容
                print('[{}]接收到來自伺服器的訊息:{}'.format(time.asctime(), receive_data))
    except Exception as e:
        print(e)
        raise e


if __name__ == '__main__':
    create_client(('127.0.0.1', 8888), 1024, 'utf-8')

執行效果截圖:
在這裡插入圖片描述
在這裡插入圖片描述
在這裡插入圖片描述

2.0

解決客戶端強行退出時,伺服器丟擲異常:
在這裡插入圖片描述
只需要修改Server:

import socket
import time


def create_server(hostAndPort: tuple, data_size: int, data_type: str, connect_max: int):
    """
    建立伺服器

    :param hostAndPort: 本機IP和開放埠
    :param data_size: 最大傳輸位元組
    :param data_type: 編解碼格式
    :param connect_max: 最大連線數
    :return:
    """
    try:
        # 建立伺服器socket 物件,模式為TCP
        server = socket.socket(
            socket.AF_INET, socket.SOCK_STREAM  # TCP
        )
        # 繫結主機IP與埠
        server.bind(hostAndPort)
        # 設定最大連線數
        server.listen(connect_max)

        # 退出標緻
        exit_flag = 0
        while True:
            print('等待連線。。。', end='')
            # 接收套接字物件與地址
            client_socket, add = server.accept()
            print('\r[{}]{}連線成功!'.format(time.asctime(), add))
            while not exit_flag:
                # 接收內容,並解碼,若客戶端異常退出,放棄此客戶端
                try:
                    receiver_data = client_socket.recv(data_size).decode(data_type)
                except ConnectionResetError:
                    print('[{}]{}異常退出!'.format(time.asctime(), add))
                    break
                # 退出標緻
                if receiver_data == 'exit':
                    exit_flag = 1
                    client_socket.send('exit'.encode(data_type))
                    print('[{}]{}已退出'.format(time.asctime(), add))
                else:
                    # 列印接收的內容
                    print('[{}]接收到來自{}的內容:{}'.format(time.asctime(), add, receiver_data))
                    # 將字母全部轉為大寫
                    send_data = receiver_data.upper()
                    # 利用客戶端套接字物件傳送給客戶端
                    client_socket.send(send_data.encode(data_type))
                    # 列印傳送的內容
                    print('已傳送給{}內容:{}'.format(add, send_data))
    except Exception as e:
        raise e


if __name__ == '__main__':
    create_server(('127.0.0.1', 8888), 1024, 'utf-8', 5)

強行終端客戶端效果:
在這裡插入圖片描述

相關文章