Tutorial gráfico súper detallado Servidor en la nube ECS para estudiantes gratuito de Aliyun para recibir y usar todo el proceso (implemente el programa de sala de chat de múltiples personas de Python)

Prefacio:

La clase de Python debe completar un experimento que necesita implementar una sala de chat para varias personas. Un requisito adicional es si el chat no se limita a la red de área local, sino que se puede conectar a la red pública para chatear. Esto requiere que ejecutemos el código Python del lado del servidor en el servidor de la nube.

Y como nunca antes había tocado este contenido, realmente encontré muchos problemas en el proceso, y también pasé una noche para completar la implementación y el uso de servidores en la nube. De hecho, también revisé muchos tutoriales de uso de servidores en la nube, pero la mayoría de ellos son complicados (muchos son para la implementación de proyectos web) y ninguno de ellos es muy adecuado para mis necesidades actuales. De ahí este tutorial para principiantes.

texto:

1. Participe en el "Programa de aceleración de Feitian" de Alibaba Cloud para recibir 2,5 meses de servidores en la nube de ECS de forma gratuita

1. Participar en el programa para obtener calificaciones 

El plan de aceleración Feitian de Alibaba Cloud fue mencionado por mi maestro sin darse cuenta en clase al principio. Más tarde, mi compañero de cuarto descubrió este plan cuando visitó Alibaba Cloud. Si aún no lo sabe, aquí está el enlace correspondiente, puede ir a una mirada:

https://developer.aliyun.com/plan/student Aliyun "Plan de aceleración de vuelo"


 

 Después de participar en el programa, siga las instrucciones en el sitio web, complete el registro, la certificación del estudiante, complete un experimento (alrededor de 15 minutos) y una prueba (muy simple, todos los conocimientos básicos), y probablemente continúe con el cuarto paso . , puede obtener 2 semanas de servidor en la nube ECS gratis .

2. Configuración del servidor en la nube

En este punto, descubrimos que finalmente podíamos obtener el servidor, pero surgieron un montón de configuraciones extrañas. Afortunadamente, Alibaba Cloud ya nos ayudó a elegir la mayoría de las configuraciones. Lo que podemos elegir es el sistema operativo instalado en el servidor de la nube. . En este punto, recomiendo elegir un servidor en la nube con el sistema operativo Windows para los novatos. La interfaz final del servidor obtenida de esta manera es básicamente la misma que la interfaz de win10 , también estaremos familiarizados con ella y es fácil de comenzar.

No importa si elige el incorrecto, puede cambiarlo en cualquier momento después del sistema operativo. Por supuesto, la opinión de nuestro profesor es instalar el sistema Linux, que es más rápido que el sistema Windows.

 Elegí Windows Server 2019 versión del centro de datos versión china de 64 bits

2. Conexión y preparación del servidor en la nube

1. Conexión del servidor en la nube (dos métodos de conexión)

Después de recibirlo, puede conectarse al servidor. No hay mucho que decir, solo vaya a la imagen de arriba

Paso 1: Primero abra la página de inicio de Alibaba Cloud e inicie sesión, abra la consola e ingrese a la interfaz ECS del servidor en la nube (no sé por qué la imagen aquí es ilegal, debería ser fácil de ver)

 Paso 2: ingrese a la interfaz de la instancia 

  Paso 3: haga clic en la instancia, [si la interfaz de la instancia está en blanco, puede ajustar la selección de región arriba]

 Paso 4: Después de restablecer la contraseña, conéctese de forma remota. La contraseña aquí es equivalente a la contraseña de encendido de la computadora, es decir, la contraseña de inicio de sesión del usuario. Después de eso, use VNC para conectarse de forma remota

Paso 5: conéctese de forma remota, ingrese (o restablezca) la contraseña de VNC, luego encienda la computadora e ingrese la contraseña de inicio de sesión.

 

 Si hay socios pequeños que se sienten muy atascados, también pueden usar la conexión de escritorio remoto que viene con Windows para conectarse al servidor. ¡También recomiendo este método de conexión! ! !

Pasos de conexión específicos: Ingrese "Conexión a escritorio remoto" en el cuadro de búsqueda de Windows, o ejecute el comando mstsc con la tecla Win+R para abrir la Conexión a escritorio remoto

El segundo método de conexión es el siguiente

 ¡Después de ingresar la contraseña de inicio de sesión, puede conectarse!

2. Preparación del servidor en la nube (descargar un nuevo navegador, descargar el entorno de configuración de Python)

Aunque el servidor en la nube es el mismo que nuestra computadora, es realmente pobre y blanco. Solo hay un ícono de una papelera de reciclaje, y el navegador solo puede usar el navegador IE. ¡Usemos un navegador mejor primero!

Abra el navegador IE en la barra inferior del escritorio, primero encienda su interruptor de descarga, de lo contrario no podrá descargar cosas

 

Luego puede ingresar la URL de Baidu, buscar el navegador Chrome para instalarlo y también puede instalar otros navegadores que desee ~ 

 Después de eso, está la configuración regular del entorno de Python, no la presentaré aquí, hay muchos tutoriales en esta área. Además, ¿qué debo hacer si quiero cargar rápidamente el contenido de mi computadora original al servidor en la nube, por ejemplo, creo que el sitio web oficial de Python es demasiado lento para descargar el paquete de instalación y quiero descargarlo en mi computadora primero y luego subirlo al servidor.

3. Aprende a usar el sitio web de airdrop (opcional)

Si desea transferir archivos entre dos computadoras , el próximo QQ puede ser lo primero que se le venga a la mente, pero esto es demasiado lento y desperdicia recursos. Hoy aprenderemos a usar el sitio web de airdrop. El siguiente es el enlace correspondiente

 Airportal.cn Sitio web de Airdrop

De hecho, es cargar los archivos requeridos aquí en esta máquina , obtener el código de extracción y luego abrir el sitio web nuevamente en la computadora que necesita ser descargada e ingresar el código de extracción para descargar. Esto también se puede usar cuando necesita escribir el código que ha escrito antes cuando va a la sala de computadoras, puede descargar su propio archivo de código a la computadora en la sala de computadoras a través del sitio web de airdrop sin descargar otro software de terceros.

¡por fin! ¡Hemos completado la conexión inicial y la preparación del servidor en la nube! ! !

3. Experiencia inicial en el uso de un servidor en la nube (tome como ejemplo mi proyecto de sala de chat para varias personas de Python)

Los amigos que lo necesiten pueden ir a mi otro blog para ver el análisis detallado del código de Python de esta sala de chat de varias personas:

Python escribe un sistema de sala de chat multiproceso para varias personas (programación de socket, uso de componentes tkinter)

En aras de la velocidad, coloque el código de la versión del servidor en la nube del servidor y el cliente aquí .

Código del lado del servidor, debe modificar la dirección IP a la dirección privada del servidor (importante)

from socket import *
from sqlite3 import connect
import threading
from datetime import *

# 时间格式声明,用于后面的记录系统时间
ISOTIMEFORMAT = '%Y-%m-%d %H:%M:%S'                     

# 设置IP地址和端口号,这里注意要将IP地址换成云服务器自己的私有地址!!!
IP = '127.0.0.1'                 
PORT = 30000

# 用户列表和套接字列表,用于后面给每个套接字发送信息
user_list = []
socket_list = []

# 聊天记录存储至当前目录下的serverlog.txt文件中
try:
    with open('serverlog.txt', 'a+') as serverlog:                    
        curtime = datetime.now().strftime(ISOTIMEFORMAT)
        serverlog.write('\n\n-----------服务器打开时间:'+str(curtime)+',开始记录聊天-----------\n')
except:
    print('ERROR!')


# 读取套接字连接
s = socket()
s.bind((IP, PORT))
s.listen()
def read_client(s, nickname):                           
    try:
        return s.recv(2048).decode('utf-8')                     # 获取此套接字(用户)发送的消息
    except:                                                     # 一旦断开连接则记录log以及向其他套接字发送相关信息
        curtime = datetime.now().strftime(ISOTIMEFORMAT)        # 获取当前时间
        print(curtime)
        print(nickname + ' 离开了聊天室!')
        with open('serverlog.txt', 'a+') as serverlog:          # log记录
            serverlog.write(str(curtime) + '  ' + nickname + ' 离开了聊天室!\n')
        socket_list.remove(s)
        user_list.remove(nickname)
        for client in socket_list:                              # 其他套接字通知(即通知其他聊天窗口)
            client.send(('系统消息:'+ nickname + ' 离开了聊天室!').encode('utf-8'))



# 接收Client端消息并发送
def socket_target(s, nickname):                         
    try:
        s.send((','.join(user_list)).encode('utf-8'))               # 将用户列表送给各个套接字,用逗号隔开
        while True:
            content = read_client(s, nickname)                      # 获取用户发送的消息
            if content is None:
                break
            else:
                curtime = datetime.now().strftime(ISOTIMEFORMAT)    # 系统时间打印
                print(curtime)
                print(nickname+'说:'+content)
                with open('serverlog.txt', 'a+') as serverlog:      # log记录
                    serverlog.write(str(curtime) + '  ' + nickname + '说:' + content + '\n')
                for client in socket_list:                          # 其他套接字通知
                    client.send((nickname + '说:'+ content).encode('utf-8'))
    except:
        print('Error!')

while True:                                                     # 不断接受新的套接字进来,实现“多人”
    conn, addr = s.accept()                                     # 获取套接字与此套接字的地址
    socket_list.append(conn)                                    # 套接字列表更新
    nickname = conn.recv(2048).decode('utf-8')                  # 接受昵称

    if nickname in user_list:                                   # 昵称查重,相同则在后面加上数字
        i = 1
        while True:
            if nickname+str(i) in user_list:
                i = i + 1
            else:
                nickname = nickname + str(i)
                break

    user_list.append(nickname)                                  # 用户列表更新,加入新用户(新的套接字)
    curtime = datetime.now().strftime(ISOTIMEFORMAT)
    print(curtime)
    print(nickname + ' 进入了聊天室!')

    with open('serverlog.txt', 'a+') as serverlog:              # log记录
        serverlog.write(str(curtime) + '  ' + nickname + ' 进入了聊天室!\n')

    for client in socket_list[0:len(socket_list)-1]:            # 其他套接字通知
        client.send(('系统消息:'+ nickname + ' 进入了聊天室!').encode('utf-8'))

    # 加入线程中跑,加入函数为socket_target,参数为conn,nickname
    threading.Thread(target=socket_target, args=(conn,nickname,)).start()

Si no conoce la dirección IP privada del servidor en la nube, puede ejecutar cmd en el servidor en la nube (presione Win+R para ejecutar el comando cmd), y la dirección IPv4 obtenida al ingresar el comando ipconfig es la dirección privada de el servidor en la nube que necesitamos.

Código de cliente, debe modificar la dirección IP a la dirección de red pública del servidor en la nube (importante):

from tkinter import *
from datetime import *
from socket import *
import threading
import sys
import tkinter
import tkinter.messagebox
from tkinter.scrolledtext import ScrolledText

ISOTIMEFORMAT = '%Y-%m-%d %H:%M:%S'         # 时间格式声明
IP = '127.0.0.1'                            # IP地址,注意这里填云服务器的公网地址不是私有地址!
Port = 30000                                # 端口号
s = socket()                                # 套接字


# 登录窗口
def Login_gui_run():                                            

    root = Tk()
    root.title("小刘聊天系统·登录")          # 窗口标题
    frm = Frame(root)

    root.geometry('300x150')                # 窗口大小

    nickname = StringVar()                                      # 昵称变量

    def login_in():                                             # 登录函数(检查用户名是否为空,以及长度)
        name = nickname.get()                                   # 长度是考虑用户列表那边能否完整显示
        if not name:
            tkinter.messagebox.showwarning('Warning', message='用户名为空!')
        elif len(name)>10:
            tkinter.messagebox.showwarning('Warning', message='用户名过长!最多为十个字符!')
        else:
            root.destroy()
            s.connect((IP, Port))                     # 建立连接
            s.send(nickname.get().encode('utf-8'))              # 传递用户昵称
            Chat_gui_run()                                      # 打开聊天窗口


    # 登录按钮、输入提示标签、输入框
    Button(root, text = "登录", command = login_in, width = 8, height = 1).place(x=100, y=90, width=100, height=35)
    Label(root, text='请输入昵称', font=('Fangsong',12)).place(x=10, y=20, height=50, width=80)
    Entry(root, textvariable = nickname, font=('Fangsong', 11)).place(x=100, y=30, height=30, width=180)

    root.mainloop()


# 聊天窗口
def Chat_gui_run():                                         
    window = Tk()
    window.maxsize(650, 400)                                # 设置相同的最大最小尺寸,将窗口大小固定
    window.minsize(650, 400)

    var1 = StringVar()
    user_list = []
    user_list = s.recv(2048).decode('utf-8').split(',')     # 从服务器端获取当前用户列表
    user_list.insert(0, '------当前用户列表------')


    nickname = user_list[len(user_list)-1]                  # 获取正式昵称,经过了服务器端的查重修改
    window.title("小刘聊天系统--"+nickname)                  # 设置窗口标题,体现用户专属窗口(不是)
    var1.set(user_list)                                     # 用户列表文本设置
    # var1.set([1,2,3,5])
    listbox1 = Listbox(window, listvariable=var1)           # 用户列表,使用Listbox组件
    listbox1.place(x=510, y=0, width=140, height=300)


    listbox = ScrolledText(window)                          # 聊天信息窗口,使用ScrolledText组件制作
    listbox.place(x=5, y=0, width=500, height=300)


    # 接收服务器发来的消息并显示到聊天信息窗口上,与此同时监控用户列表更新
    def read_server(s):
        while True:
            content = s.recv(2048).decode('utf-8')                      # 接收服务器端发来的消息
            curtime = datetime.now().strftime(ISOTIMEFORMAT)            # 获取当前系统时间
            listbox.insert(tkinter.END, curtime)                        # 聊天信息窗口显示(打印)
            listbox.insert(tkinter.END, '\n'+content+'\n\n')
            listbox.see(tkinter.END)                                    # ScrolledText组件方法,自动定位到结尾,否则只有消息在涨,窗口拖动条不动
            listbox.update()                                            # 更新聊天信息窗口,显示新的信息


            # 贼傻贼原始的用户列表更新方式,判断新的信息是否为系统消息,暂时没有想到更好的解决方案
            if content[0:5]=='系统消息:':
                if content[content.find(' ')+1 : content.find(' ')+3]=='进入':
                    user_list.append(content[5:content.find(' ')])
                    var1.set(user_list)
                if content[content.find(' ')+1 : content.find(' ')+3]=='离开':
                    user_list.remove(content[5:content.find(' ')])
                    var1.set(user_list)

    threading.Thread(target = read_server, args = (s,), daemon=True).start()


    var2 = StringVar()                                      # 聊天输入口
    var2.set('')                                    
    entryInput = Entry(window, width = 140, textvariable=var2)
    entryInput.place(x=5, y=305, width = 490, height = 95)


    # 发送按钮触发的函数,即发送信息
    def sendtext():
        line = var2.get()
        s.send(line.encode('utf-8'))
        var2.set('')                                        # 发送完毕清空聊天输入口

    #发送按钮
    sendButton = Button(window, text = '发 送', font=('Fangsong', 18), bg = 'white', command=sendtext)     
    sendButton.place(x=500, y=305, width = 150, height = 95)

    def on_closing():                                       # 窗口关闭二次确认函数,并确认后自动关闭程序
        if tkinter.messagebox.askokcancel("退出", "你确认要退出聊天室吗?"):
            window.destroy()
            sys.exit(0)

    window.protocol("WM_DELETE_WINDOW", on_closing)
    window.mainloop()
    

Login_gui_run()

Nota: ¡El código del lado del servidor debe ejecutarse en el servidor de la nube y el código del lado del cliente debe ejecutarse en nuestra propia computadora! !

Luego necesitamos abrir el número de puerto correspondiente

Aquí hay un tutorial oficial de Alibaba Cloud https://developer.aliyun.com/article/791425 . Nuestro proyecto usa el puerto 30000, por lo que solo necesitamos abrir este puerto. El efecto final de la apertura es el siguiente:

 

Después de eso, solo necesita colgar el código del servidor en el servidor de la nube y ejecutarlo todo el tiempo.

La captura de pantalla del efecto de ejecución del servidor en la nube es la siguiente:

Finalmente, también puede empaquetar el código del cliente para generar un archivo exe, de modo que pueda enviar este archivo exe a amigos que viven en otros lugares para que lo usen. ! !

¡En este punto, todo el trabajo ha llegado a su fin! ! ! !

Supongo que te gusta

Origin blog.csdn.net/m0_56942491/article/details/124289328
Recomendado
Clasificación