序文:
Pythonクラスは、複数人のチャットルームを実装する必要がある実験を完了する必要があります。追加の要件は、チャットがローカルエリアネットワークに限定されず、パブリックネットワークに接続してチャットできるかどうかです。これには、クラウドサーバーでサーバー側のPythonコードを実行する必要があります。
また、これまでこのコンテンツに触れたことがないため、プロセスで多くの問題が発生しました。また、クラウドサーバーの展開と使用を完了するために一晩を費やしました。実際、私は多くのクラウドサーバーの使用法のチュートリアルもチェックしましたが、それらのほとんどは複雑であり(多くはWebプロジェクトの展開用です)、それらのどれも私の現在のニーズにあまり適していません。したがって、この初心者向けチュートリアル。
文章:
1. Alibaba Cloudの「FeitianAccelerationProgram」に参加して、2.5か月のECSクラウドサーバーを無料で受け取ります
1.プログラムに参加して資格を取得します
先生がAlibabaCloudFeitian Acceleration Planについて最初に誤って言及したのですが、後で、ルームメイトがAlibaba Cloudにアクセスしたときにこのプランを発見しました。まだわからない場合は、対応するリンクをご覧ください。一見:
https://developer.aliyun.com/plan/studentAliyun「FlyingAccelerationPlan」
プログラムに参加した後、ウェブサイトの指示に従い、登録、学生認定を完了し、実験(約15分程度)とテスト(非常に簡単で、すべての基本的な知識)を完了し、おそらく4番目のステップに進みます。 、2週間の無料ECSクラウドサーバーを入手できます。
2.クラウドサーバーの構成
この時点で、ようやくサーバーを入手できることがわかりましたが、奇妙な構成がたくさん出てきました。幸い、Alibaba Cloudはすでにほとんどの構成を選択するのに役立ちました。選択できるのは、クラウドサーバーにインストールされているオペレーティングシステムです。 。この時点で、初心者にはWindowsオペレーティングシステムを搭載したクラウドサーバーを選択することをお勧めします。このようにして得られたサーバーの最終的なインターフェースは、基本的にwin10のインターフェースと同じであり、私たちもそれに精通しており、簡単に始めることができます。
間違ったものを選択しても問題ありません。オペレーティングシステムの後でいつでも変更できます。もちろん、私たちの先生の意見は、Windowsシステムよりも高速なLinuxシステムをインストールすることです。
WindowsServer2019データセンターバージョン64ビット中国語バージョンを選択しました
2.クラウドサーバーの接続と準備
1.クラウドサーバー接続(2つの接続方法)
受信後、サーバーに接続できます。言うまでもなく、上の画像に移動してください。
ステップ1:最初にAlibaba Cloudホームページを開いてログインし、コンソールを開いて、クラウドサーバーのECSインターフェイスに入ります(ここの画像が違法である理由はわかりません。見やすいはずです)
ステップ2:インスタンスインターフェイスに入る
ステップ3:インスタンスをクリックします[インスタンスインターフェイスが空白の場合は、上記のリージョン選択を調整できます]
ステップ4:パスワードをリセットした後、リモートで接続します。ここでのパスワードは、コンピューターの電源投入時パスワード、つまりユーザーログインパスワードと同等です。その後、VNCを使用してリモート接続します
ステップ5:リモートで接続し、VNCパスワードを入力(またはリセット)してから、コンピューターの電源を入れてログインパスワードを入力します。
非常に行き詰まっていると感じる小さなパートナーがいる場合は、Windowsに付属しているリモートデスクトップ接続を使用してサーバーに接続することもできます。この接続方法もお勧めします。!!
特定の接続手順:Windowsの検索ボックスに「リモートデスクトップ接続」と入力するか、Win + Rキーを指定してmstscコマンドを実行し、リモートデスクトップ接続を開きます。
2番目の接続方法は次のとおりです。
ログインパスワードを入力すると、接続できます!
2.クラウドサーバーの準備(新しいブラウザーをダウンロードし、Python構成環境をダウンロードします)
クラウドサーバーは私たちのコンピューターと同じですが、本当に貧弱で白く、ごみ箱のアイコンしかなく、ブラウザーはIEブラウザーしか使用できません。まずはより良いブラウザーを使用しましょう。
デスクトップの下部バーにあるIEブラウザを開き、最初にダウンロードスイッチをオンにします。そうしないと、ダウンロードできなくなります。
次に、BaiduのURLを入力し、Chromeブラウザーを検索してインストールします。また、他のブラウザーをインストールすることもできます〜
その後、Python環境の通常の構成があります。ここでは紹介しません。この領域には多くのチュートリアルがあります。また、元のコンピューターのコンテンツをクラウドサーバーにすばやくアップロードしたい場合、たとえば、Pythonの公式ウェブサイトではインストールパッケージをダウンロードするには遅すぎると思い、ダウンロードしたい場合はどうすればよいですか?最初に私のコンピューターをサーバーにアップロードします。
3.エアドロップWebサイトの使用方法を学ぶ(オプション)
2台のコンピューター間でファイルを転送する場合、最初に頭に浮かぶのは次のQQかもしれませんが、これは遅すぎてリソースを浪費します。今日はエアドロップWebサイトの使用方法を学びます。以下は対応するリンクです。
実際、このマシンに必要なファイルをアップロードし、抽出コードを取得してから、ダウンロードする必要のあるコンピューターでWebサイトを再度開き、抽出コードを入力してダウンロードします。これは、コンピュータールームに行くときに以前に入力したコードを入力する必要がある場合にも使用できます。他のサードパーティソフトウェアをダウンロードせずに、AirdropWebサイトからコンピュータールームのコンピューターに独自のコードファイルをダウンロードできます。
ついに!クラウドサーバーの初期接続と準備が完了しました!!!
3.クラウドサーバーを使用した最初の経験(例として私のPythonマルチパーソンチャットルームプロジェクトを取り上げます)
困っている友達は、私の他のブログにアクセスして、この複数人のチャットルームの詳細なPythonコード分析を確認できます。
Pythonは、マルチスレッドのマルチパーソンチャットルームシステムを作成します(ソケットプログラミング、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:
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()
クラウドサーバーのプライベート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 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()
注:サーバー側のコードはクラウドサーバーで実行する必要があり、クライアント側のコードは自分のコンピューターで実行する必要があります。!
次に、対応するポート番号を開く必要があります
これがAlibabaCloudの公式チュートリアルですhttps://developer.aliyun.com/article/791425。このプロジェクトではポート30000を使用しているため、このポートを開くだけで済みます。開いた場合の最終的な効果は次のとおりです。
その後は、サーバーコードをクラウドサーバーにハングアップさせて、常に実行する必要があります。
クラウドサーバーの実行効果のスクリーンショットは次のとおりです。
最後に、クライアントのコードをパッケージ化してexeファイルを生成することもできます。これにより、このexeファイルを他の場所に住んでいる友人に送信して使用できるようになります。!!
この時点で、すべての作業が終了しました。!!!