前言:

Python课需要完成一个需要实现多人聊天室的实验,有个附加要求就是能否不局限在局域网中进行聊天,而是能实现连接公网就可以聊天。这就需要我们将服务端的Python代码放在云服务器上运行。

而本人由于在此之前从来没接触过这方面的内容,真的在这个过程中遇到了很多的问题,也是摸索了一个晚上才完成了云服务器的部署与使用。实际上我也查了很多的云服务器的使用教程,但是大多数都很复杂(很多都是针对web项目的部署),并且都不是很符合我目前的需求。所以就有了这篇新手教程。

正文:

一、参与阿里云“飞天加速计划”免费领取2.5个月ECS云服务器

1、参加计划获取资格

阿里云飞天加速计划其实是一开始我的老师在上课的时候无意间提到的,后来室友在访问阿里云时发现了这个计划,如果你还不知道,下面是对应的链接,可以去看一看:

https://developer.aliyun.com/plan/student 阿里云“飞天加速计划”

参加计划后,根据网站中的指示进行,完成注册、学生认证、完成一个实验(大概15分钟左右就ok了)和一个测试(很简单,都是基础知识),大概进行到第四步就可以了,此时你就可以领取到2周的免费ECS云服务器

2、有关云服务器的配置

此时我们发现终于可以领取服务器了,但是一下上来一堆奇怪的配置,不过还好阿里云已经帮我们选择好了大部分配置,我们能进行抉择的就是云服务器上安装的操作系统。此时新手我建议选择windows操作系统的云服务器。这样领到的服务器最后的界面其实和win10的界面基本上一样,咱们也会很熟悉,很容易上手。

选错了也没有关系,操作系统之后都可以随时更改的。当然我们老师的意见是安装Linux系统,相较于windows系统更快一点。

 我选择的是windows server 2019 数据中心版 64位中文版

二、云服务器的连接与准备工作

1、云服务器连接(两种连接方式)

领取后就可以进行服务器连接了,不多说,直接上图

Step1:首先打开阿里云首页并登录,打开控制台,进入云服务器ECS界面(这里图片不知道为啥违规了,应该很容易就看见)

Step2:进入实例界面 

Step3:点击实例,【如果实例界面空白可以调整一下上面的地域选择】

Step4:重置密码后远程连接,这里的密码就相当于电脑的开机密码,即用户登录密码 。之后使用VNC进行远程连接

Step5: 远程连接,输入(或重置)VNC密码,之后打开电脑,输入登陆密码即可

如果有小伙伴觉得很卡也可以使用windows自带的远程桌面连接进行服务器的连接,我也更推荐这种连接方式!!!

具体连接步骤:windows搜索框输入“远程桌面连接”,或者Win+R键运行mstsc命令,打开远程桌面连接

第二种连接方式如下

之后输入登录的密码就可以连接上啦!

2、云服务器准备(下载新的浏览器、下载Python配置环境)

云服务器中虽然和我们的电脑一样,但是真的是一穷二白,只有个回收站的图标,浏览器也只能用IE浏览器,我们先下个好点的浏览器吧!

打开桌面底栏的IE浏览器,首先打开它的下载开关,否则无法下载东西

然后就可以输入百度网址,搜索Chrome浏览器进行安装啦,你也可以安装自己喜欢的其他的浏览器~

之后就是常规的配置Python环境,在这里我就不多介绍啦,这方面的教程有很多。此外,如果我想把我原来电脑中的东西快速上传到云服务器上该怎么办呢,比如我嫌Python官方网站下载安装包太慢,想先在自己电脑里下好后传到服务器里。

3、学会使用空投网站(选学)

如果说在两台电脑之间传输文件,可能第一时间想到的是下个QQ,不过这样实在太慢而且浪费资源,今天我们来学习使用空投网站,下面是对应的链接

airportal.cn 空投网站

实际上就是在本机这里上传需要的文件,获得提取码,然后再在需要下载的电脑上再次打开这个网站输入提取码后即可下载。这个也可以用于去机房的时候需要自己以前打的代码,就可以把自己的代码文件通过空投网站下载到机房的电脑中,而不需要下载其他第三方软件。

终于!我们完成了云服务器的初步连接与准备!!!

三、云服务器的使用初体验(以我的Python多人聊天室项目为例子)

有需要的小伙伴可以去我的另一个博客里去看看这个多人聊天室的详细的Python代码解析:

Python编写多线程多人聊天室系统(Socket编程、tkinter组件使用)

这里为了快捷,就放上服务端和客户端的云服务器版本的代码啦!

服务器端代码,需要修改IP地址为服务器私有地址(重要)

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:breakelse: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 = 1while True:if nickname+str(i) in user_list:i = i + 1else:nickname = nickname + str(i)breakuser_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,nicknamethreading.Thread(target=socket_target, args=(conn,nickname,)).start()

不知道云服务器私有IP地址的小伙伴可以在云服务器上跑一下cmd(按键Win+R后运行cmd指令),输入ipconfig命令得到的IPv4地址就是我们需要的云服务器私有地址啦

客户端代码,需要修改IP地址为云服务器公网地址(重要):

from tkinter import *
from datetime import *
from socket import *
import threading
import sys
import tkinter
import tkinter.messagebox
from tkinter.scrolledtext import ScrolledTextISOTIMEFORMAT = '%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()

注意:云服务器上需要运行的是服务端的代码,我们自己的电脑要运行的是客户端的代码!!

之后我们需要开放相应的端口号

这里贴一篇阿里云的官方教程https://developer.aliyun.com/article/791425,我们这个项目使用的是30000端口,所以只要开放这个端口就可以了,最后开放的效果如下:

在这之后就只需把服务端代码一直挂在云服务器上运行就ok啦

云服务器端运行效果截图如下:

最后,你还可以将客户端的代码进行打包,生成exe文件,这样就可以将这个exe文件发给身居他乡的小伙伴们使用啦!!!

至此,所有工作告一段落!!!!

超详细图文教程·阿里云免费学生ECS云服务器领取并使用全过程(部署Python多人聊天室程序)相关推荐

  1. 如何自己开传奇单机架设超详细图文教程

    如何自己成为传奇,如何自己搭建传奇非官服,首先下载传奇服务器后,会有两个压缩包,一个用于服务器,一个用于游戏补丁文件 传奇单机设置-GOM引擎的超详细图文教程 版本文件包含.exe,以上文件都不起作用 ...

  2. 阿里云ECS服务器安装docker教程(超详细图文教程)

    文章预览: 阿里云ECS服务器安装docker教程(超详细图文教程) 一.查看服务器信息 二.安装docker 三.卸载docker 四.阿里云镜像加速器 五.篇外 阿里云ECS服务器安装docker ...

  3. CENTOS 7 踢用户_从零学ELK系列(三):Centos安装Docker(超详细图文教程)

    CSDN博客地址(关注,点赞) 人工智能推荐 GitHub(Star,Fork,Watch) [前言] 为了更加真实的模拟生产部署环境,不仅需要Linux环境支持,而且ELK需要在不同的机器上部署:再 ...

  4. 剪映导出SRT字幕超详细图文教程

    剪映导出SRT字幕超详细图文教程 视频的字幕是制作视频的过程当中一个很麻烦的事情. 不仅要使得字幕和人声出现的时间匹配,还要校对错别字,删减字幕,增加字幕等繁琐的操作.在以往为视频添加字幕的操作中,有 ...

  5. IntelliJ IDEA 下载安装及配置使用超详细图文教程

    title: IntelliJ IDEA 下载安装及配置超详细图文教程 date: 2021-03-18 18:20:48 tags: Java IDEA categories: 开发工具及环境 co ...

  6. Windows + Ubuntu 双系统(超详细图文教程)

    传统的MBR模式和新式UEFI模式,这将对安装双系统的方法产生直接影响. 本文只适用于,Legacy模式(MBR,boot); UEFI模式(GPT) 参考:https://blog.csdn.net ...

  7. 从零学ELK系列(十一):SpringBoot项目接入ELK超级版(超详细图文教程)

    前言 之前在<从零学ELK系列(十):SpringBoot项目接入ELK升级版(超详细图文教程)>中演示了SpringBoot项目接入ELK请求记录及优化,本次针对于未知异常通过拦截进行记 ...

  8. 从零学ELK系列(三):Centos安装Docker(超详细图文教程)

    [前言] 为了更加真实的模拟生产部署环境,不仅需要Linux环境支持,而且ELK需要在不同的机器上部署:再重新装几台虚拟机?本地资源不支持,于是乎想到了Docker:今天在上次的Linux系统(< ...

  9. 从零学ELK系列(四):Docker安装Elasticsearch(超详细图文教程)

    [前言] 为了更加真实的模拟生产部署环境,在上次的Docker环境中(<Centos安装Docker(超详细图文教程)>)中安装了Elasticsearch把步骤记录下来,一是方便自己以后 ...

  10. 从零学ELK系列(六):Docker安装Logstash(超详细图文教程)

    [前言] 为了更加真实的模拟生产部署环境,在上次的Docker环境中(<Docker安装kibana(超详细图文教程)>)中安装了kibana,本次我们将安装日志清洗组件---logsta ...

最新文章

  1. 3.commonjs模块
  2. 修改上传附件大小限制方法
  3. asp.net mvc自动完成
  4. 支持 Drupal 的 虚拟空间
  5. Hadoop配置文件参数详解
  6. Eigen入门之密集矩阵 3 - Array操作
  7. 撰写论文时word使用技巧(转)
  8. 复制release文件到另一台电脑.exe文件无法运行_电脑技巧:电脑版微信双开(或微信多开)?用start指令可以解决...
  9. 小知识—PRINCE2的七大原则之剪裁
  10. 【186天】黑马程序员27天视频学习笔记【Day15-上】
  11. 被美列入投资黑名单后 商汤重启公开招股发行规模定价没变
  12. 二值化区分前景和背景
  13. AT:配置/禁用PSM模式和设置T3324/T3412
  14. 解决微信调整字体大小导致Html5页面混乱
  15. 阿里云轻量级服务器上JDK及tomcat部署配置
  16. 从0到1搭建RPC框架
  17. Fiddler环境配置、抓包、手机代理
  18. A002-186-2619-林斌锐
  19. 跟陌生人说话QQ小技巧
  20. MISC:压缩包取证(zip爆破、明文攻击、伪加密、CRC32碰撞)

热门文章

  1. 大厂智力题讲解,学它!!!!(一)
  2. 纯小白Python爬取东方财富网研报内容并通过机器学习的SVM模型进行文本分析(四)
  3. vue+element 下载or批量下载.mp3文件
  4. 什么是实体关系图(ERD)?
  5. 超启发式算法(hyper heuristic)
  6. Scala学习笔记01
  7. ASCII码为0x01,0x02作为分隔符(这两个字符是键盘无法输入的)
  8. 公开处刑,专家博主开发游戏的老王专栏抄袭事件始末
  9. 加强财务知识细节:营业利润,利润总额,净利润
  10. Tushare财经数据调取方法(行情数据)