带你读《机器学习即服务 将Python机器学习创意快速转变为 云端Web应用程序》之一:无服务器计算介绍-阿里云开发者社区

开发者社区> 温柔的养猫人> 正文

带你读《机器学习即服务 将Python机器学习创意快速转变为 云端Web应用程序》之一:无服务器计算介绍

简介: 本书涵盖Kubernetes架构、部署、核心资源类型、系统扩缩容、存储卷、网络插件与网络本书由浅入深地介绍了一系列常见的Python数据科学问题。书中介绍的实践项目简单明了,可作为模板快速启动其他类似项目。通过本书,你将学习如何构建一个Web应用程序以进行数值或分类预测,如何理解文本分析,如何创建强大的交互界面,如何对数据访问进行安全控制,以及如何利用Web插件实现信用卡付款和捐赠。
+关注继续查看

智能系统与技术丛书
点击查看第二章
点击查看第三章
机器学习即服务将Python机器学习创意快速转变为云端Web应用程序
Monetizing Machine Learning: Quickly Turn Python ML Ideas into Web Applications on the Serverless Cloud

image.png

曼纽尔·阿米纳特吉(Manuel Amunategui)
迈赫迪·洛佩伊(Mehdi Roopaei)
刘世民 山金孝 史天 肖力 译

第1章

无服务器计算介绍

本章中,我们将创建一个非常简单的Flask Web应用程序(图1-1)。在后面章节中,当我们在亚马逊AWS、谷歌云、微软Azure和PythonAnywhere上探索基于公有云的Web服务时,会不断地用到这个应用程序。

image.png

在开始云端之旅之前,最好先在本地计算机上使用本地版本的网站。
提示:请访问www.apress.com/9781484238721 ,单击“Download source code”按钮,跳转至GitHub网站,下载第1章所需文件。推荐使用Jupyter Notebook打开chapter1.ipynb文件,以配合阅读本章内容。

1.1 一个简单的本地Flask应用程序

本节中的代码非常简单,你可以从头开始编写代码,也可以使用simple-local-flask-application文件夹中的文件。
第1步:基本的“Hello World!”示例
让我们直接从官方的Flask帮助文档创建一个非常简单的Flask脚本(代码清单1-1)。

image.png

就是这样子!尽管这并没有太多内容,但它代表了使Flask网站启动和运行所需的最低要求,实际上这是一个真正的Web应用程序。将脚本保存为本地计算机上的main.py(你可以将其命名为任何名称)。
第2步:启动虚拟环境
使用虚拟环境来隔离开发工作总是一个好主意(这在构建requirements.txt文件时也很方便—请参阅“前言”中的“创建requirements.txt文件”)。让我们启动一个虚拟环境(代码清单1-2)。

image.png

第3步:安装Flask
这里假设你可以运行“pip3”来安装库文件,或者使用你通常用于Python 3.x的任何安装工具或查看官方Flask文档,参见代码清单1-3。

image.png

第4步:运行Web应用程序
打开命令/终端窗口并在Mac或Windows上输入以下命令(代码清单1-4和代码清单1-5)。

image.png

image.png

第5步:在浏览器中查看
你应该在命令窗口中看到以下消息,提供要运行的本地HTTP地址。复制它并将其放入浏览器的地址栏中(代码清单1-6)。

image.png

然后打开浏览器并复制/粘贴(或输入)列出的本地地址(图1-2)。

image.png

第6步:更快一点的方式
这就是由服务器生成网页。通过在main.py脚本的末尾添加以下两行,你就可更轻松地在本地启动Flask应用程序。这仅适用于本地模式,但允许脚本本身运行实例化的Flask应用程序,并允许你跳过设置环境变量的步骤(代码清单1-7)。

image.png

保存添加了新代码的main.py脚本,现在它是代码清单1-8的样子了。

image.png

返回指向修改后脚本的命令/终端窗口,并输入以下简化命令(代码清单1-9)。

image.png

第7步:全部应用程序
要停止Web应用程序提供“Hello World!”页面,请在终端窗口中输入ctrl-c。
我们在脚本的最后一行设置debug标志为true。这会使脚本将任何Flask错误直接打印到浏览器中。这是快速开发和调试脚本的一个很好特征,但请记住在移至云之前将其变为false。
最后,终止你的虚拟环境(代码清单1-10)。

image.png

1.2 在微软Azure上使用无服务器计算

Azure云为Web应用程序提供了易于使用的、支持无服务器计算的、完全托管的平台,以及大量可自定义的选项,涉及从存储到数据库、监控和分析(图1-3)。

image.png

让我们看看如何在微软Azure的无服务器计算Web应用程序上运行基本Flask应用程序。在这里,我们将尽可能简化步骤,因为后续章节中将深入探讨此程序。
提示:请访问www.apress.com/9781484238721 ,单击“Download source code”按钮,请下载第1章所需文件,然后打开serverless-hosting-on-microsoft-azure文件夹。

1.2.1 操作步骤

第1步:获取微软Azure上的账户
你需要一个微软Azure账户。在撰写本书时,微软针对所有服务提供了价值200美元为期30天的试用,并可以在接下来的12个月中免费访问这些服务。有关详细信息,请参阅https://azure.microsoft.com/en-us/free/
第2步:下载源文件
将本章所需文件下载到本地计算机上,然后切换到名为serverless-hosting-on-microsoft-azure的文件夹。你的本地文件夹结构应如下所示(请注意Flask脚本的名称main.py,这是Azure上的默认设置,见代码清单1-11)。

image.png

支持性文件
requirements.txt文件包含Web应用程序所需的Python库名称,并在应用程序部署期间被无服务器计算使用。你可以创建自己的requirements.txt,并将其存放在与Flask脚本main.py相同的文件夹中。在这种情况下,它只包含一个库和一个版本要求(代码清单1-12)。

image.png

web.3.4.config是Web服务器的配置文件。我们将使用Python 3.4版本并使用默认值。如果你决定进一步探索此云提供商,那么一定要打开它并查看其中的内容。
第3步:安装Git
对于此项目,你需要在本地计算机上安装Git(可以在www.git-scm.com/downloads 上找到二进制安装文件)。如前所述,Git是一个源代码版本控制工具,是一个完全就绪的Git包,支持将代码推送到微软Azure上(参见“前言”中关于Git的简介)。在大多数章节中,我们将创建一个虚拟环境来运行以下步骤,但由于这已经是一个大项目,为简单起见我们跳过它。
打开终端/命令行窗口,并将其指向本章的serverless-hosting-on-microsoft-azure文件夹,初始化Git会话(代码清单1-13)。

image.png

接下来,添加serverless-hosting-on-microsoft-azure文件夹中的所有Web应用程序文件并检查其状态(代码清单1-14和图1-4)。

image.png

构建一个本地Git提交并添加一个有意义的注释,以防将来需要重新访问过去的操作(代码清单1-15)。

image.png

所需文件都在本地存储库中。有关Git部署到Azure应用服务的更多信息,请访问https://docs.microsoft.com/en-us/azure/app-service/app-service-deploy-local-git
第4步:打开Azure云Shell
登录微软Azure仪表板,单击“>_”打开Azure云Shell(图1-5)。

image.png

系统将提示你创建Linux或Power Shell窗口,这里选择Linux,因为这些命令将与你在本地终端窗口中使用的命令类似(图1-6)。

image.png

它还会提示你创建存储库,以便托管应用程序(图1-7)。如果这是你第一次操作,可能会在下拉列表中看到“Free Trial”选项。无论哪种方式,请使用它并创建存储库。

image.png

第5步:创建部署用户
你现在应该在Azure云Shell中了。该用户将拥有使用FTP和本地Git的适当权限。这里,将用户名设置为“flaskuser11”,密码设置为“flask123”。创建你自己的用户名并记住它,因为将来会用到它(代码清单1-16)。

image.png

该命令和大多数后续命令的输出都将与下面的屏幕截图类似。仔细查看任何错误或问题并进行针对性修复(代码清单1-17)。

image.png
image.png

你的输出JSON应该是空的。如果你看到“conflict”(冲突),说明你所输入的“user-name”与已有用户名冲突了;如果你看到“bad request”(错误的请求),说明你的密码不符合规范(它最少需包含8个字符,由多个字符、数字和符号组成)。
第6步:创建资源组
这一步需要在靠近你所在位置的某个区域中创建一个资源组—在这里的例子中为“West US”(有关区域,请参阅https://azure.microsoft.com/en-us/regions/或使用命令“az appservice list-location --sku FREE”—参见代码清单1-18)。

image.png

第7步:创建Azure服务计划
创建Azure服务计划,并将其名称设置为“myAppServicePlan”(你可以任意设置,见代码清单1-19)。

image.png

第8步:创建Web应用程序
接下来,创建一个Web应用程序并设置其名称(它必须是唯一的)。这里通过name参数将应用程序名称设置为AmunateguiIntroWebApp,并通过deployment参数设置代码部署方式为通过本地Git部署代码(代码清单1-20)。

image.png

查看“az webapp create”命令返回的长字符串,复制“Local git is configured with url of…”后的链接,或者直接使用“deploymentLocalGitUrl”,因为两者是相同的,你可以任选其一。将Flask文件推送到Azure时,将需要这个链接(代码清单1-21)。

image.png
image.png

提取Azure项目的本地Git配置URL(代码清单1-22和代码清单1-23)。

image.png

image.png

检查你的网站
如果一切正常,现在你应该可以访问网站了。使用你在az webapp create命令中所设置的应用程序名称来替换<>部分,并将其复制到浏览器中(代码清单1-24和图1-8)。

image.png

如果你看到的不是这样子,就需要再次检查每个步骤,确保你没有错过任何一个错误。
第9步:发布Web应用程序
现在我们回到本地计算机上的本地终端/命令窗口,确认它指向正确的目录,以及Git会话已经被初始化了。将我们之前保存的URL与Git存储库的位置附加到“add azure”命令(代码清单1-25)。

image.png

它可能会提示你输入密码,使用你在“az webapp development user”步骤中所创建的密码(这里的例子中是“flask123”,见代码清单1-26)。

image.png

第10步:在浏览器中查看
现在是最后一步了!返回浏览器窗口并点击刷新(或打开新的浏览器窗口并输入http://<>.azurewebsites.net),你将看到“Hello World!”(图1-9)。

image.png

如果没有看到“Hello World!”,你可以直接在命令窗口中查看日志—只需更换网站名称(这里的例子中为amunateguiintroapp)和组(这里的例子中为myResourceGroup),参见代码清单1-27。

image.png

第11步:不要忘记删除你的Web应用程序!
如果你不再使用Web应用程序,请不要忘记删除它。如果不这么做,计费将一直持续。删除所有内容的最简单方法是登录Azure仪表板并在搜索栏中输入“All resources”,然后删除你创建的所有内容(图1-10)。

image.png

1.2.2 结论和附加信息

微软Azure是一个功能强大的云提供商,提供丰富多彩的云产品。它可以运行简单的Flask应用程序并快速部署。如果需要加载更复杂的库,需要Python wheels的支持(https://pythonwheels.com/ )。
有关其他信息,请参阅微软Azure文档上标题为“Create a Python web app in Azure”的优秀帖子,本节参考了此文章:https://docs.microsoft.com/en-us/azure/app-service/app-service- web-get-started-python 。

1.3 在谷歌云上使用无服务器计算

谷歌云是一个用于构建、管理和部署Web应用程序的强大平台。它可以与TensorFlow及其分布式图机制无缝集成(图1-11)。

image.png

我们看看如何在谷歌云的无服务器计算App Engine上运行基本Flask应用程序。这里尽可能简化步骤,因为后续章节中将进行深入探讨。
提示:请访问www.apress.com/9781484238721 ,单击“Download source code”按钮,下载第1章所需文件,然后打开serverless-hosting-on-google-cloud文件夹。

1.3.1 操作步骤

第1步:获取谷歌云账户
在撰写本书时,Google正提供一个为期12个月价值300美元的免费试用配额,以帮助你入门。有关详细信息,请参阅https://console.cloud.google.com/start
你可以选择两种类型的App Engine:标准环境(Standard Environment),它简单但定制性不强;灵活环境(Flexible Environment),可以处理或多或少的任意内容。在本节我们将使用更简单的引擎,即标准环境。
第2步:下载源文件
将本章的文件下载到本地计算机上,然后切换到名为serverless-hosting-on-google-cloud的文件夹(代码清单1-28)。

image.png

app.yaml声明Flask Python应用程序(在本例中为main)与static和templates在相同的文件夹下(代码清单1-29)。

image.png

appengine_config.py指向lib文件夹,以在部署期间保存其他Python库(代码清单1-30)。

image.png

requirements.txt文件包含将被安装和添加到lib文件夹的Python库的名称和版本(代码清单1-31)。

image.png

main.py是控制Flask Python应用的“大脑”,它包含每个HTML页面的所有Python代码和指令(代码清单1-32)。

image.png

第3步:打开谷歌云Shell
登录你的谷歌云实例,然后选择App Engine所在的项目(如果还没有,请参阅创建和管理项目文档:https://cloud.google.com/resource-manager/docs/creating-managing-projects)。单击右上角的按钮来启动云Shell命令行工具,这将在GCP仪表板的下半部分打开一个熟悉的命令行窗口(图1-12)。

image.png

在GCP仪表板终端中,创建一个名为GoogleCloudFlaskIntro的新文件夹(代码清单1-33)。

image.png

第4步:将Flask文件上传到谷歌云
上传有很多方法,可以逐个上传文件,或克隆GitHub存储库,或将它们压缩到一个存档文件中再一次性上传所有文件。我们选择最后一种方法。将app.yaml、appengine_config.py、main.py和requirements.txt这四个文件压缩到一个存档文件中(图1-13)。

image.png

使用Upload file选项上传它(可在Shell窗口的右上角找到三个垂直点,图1-14)。

image.png

它会将文件(这里的例子中为Archive.zip)上传到根目录,因此你需要将其移动到GoogleCloudFlaskIntro文件夹并解压缩(代码清单1-34)。

image.png

运行pip install -t lib命令,以安装在requirements. txt文件中所定义的所有库(代码清单1-35)。这将创建必要的lib文件夹,其中包含任何所需的Python库。(如果不使用sudo,可能会收到一些提示,sudo会给你root权限,但请不要滥用它!)

image.png

此时,若运行“ls”命令,则云中的文件夹目录应如下所示(代码清单1-36)。

image.png

第5步:将Web应用程序部署到谷歌云上
现在我们来部署Hello World站点。在仪表板Shell窗口中的GoogleCloudFlaskIntro文件夹下,运行gcloud app deploy命令。它会要求你进行确认,我们选择“Y”(代码清单1-37)。

image.png

如果一切顺利,你可以方便地运行gcloud app browse命令来获取网站的完整URL(代码清单1-38)。

image.png

点击谷歌云Shell中的链接或将其粘贴到浏览器中(图1-15)。

image.png

第6步:不要忘记删除你的Web应用程序!
如果你不再使用Web应用程序,请不要忘记删除它。如果不这样做,费用将持续增加。如果它是你唯一的应用程序(你需要有默认应用程序),则不能仅仅删除App Engine应用程序,而是将流量重定向到空白应用程序。
在谷歌云Shell中,使用“vi”命令启动Linux文本编辑器(代码清单1-39)。

image.png

这将打开一个小型命令行编辑器,然后按下“i”键插入或编辑文件(代码清单1-40和代码清单1-41)。

image.png

你需要将app.yaml文件的url句柄指向blank.app。因为blank.app是不存在的,所以应用不会提供任何服务,而且计费将被停止(代码清单1-42)。

image.png

按下Esc键退出插入模式,输入“wq”进行写入并退出。然后重新部署Web应用程序(代码清单1-43)。

image.png

部署操作在App Engine上生效后,URL应该显示错误而不再是“Hello World”了(图1-16)。

image.png

1.3.2 结论和附加信息

GCP提供了许多特征,并与其他Google产品(如https://cloud.google.com/apis/ 上的云API)和TensorFlow紧密集成。如果你需要使用更强大的Python库,则可以从标准App Engine切换到Flexible引擎。
有关其他信息,请参阅谷歌云文档上标题为“Quickstart for Python App Engine Standard Environment”的文章:https://cloud.google.com/appengine/docs/standard/python/quickstart
顺便说一句,如果你的谷歌云App Engine出现任何问题,可以使用以下命令查看日志(代码清单1-44)。

image.png

1.4 在Amazon AWS上使用无服务器计算

AWS Elastic Beanstalk是一个用于部署Web应用程序的简单而强大的平台。它具有缩放、负载均衡、监控等所有功能,并且只对所使用的资源收费(图1-17)。

image.png

让我们看看如何在Amazon AWS Elastic Beanstalk上运行基本Flask应用程序。我们将尽可能简化步骤,因为后续章节中将深入探讨此程序。
提示: 请访问www.apress.com/9781484238721 ,单击Download source code按钮,下载第1章所需文件,然后打开serverless-hosting-on-amazon-aws文件夹。

1.4.1 操作步骤

第1步:获取Amazon AWS账户
Amazon AWS提供AWS Free Tier (免费套餐)账户,允许你免费试用某些服务。有关创建账户的更多信息,请访问https://aws. amazon.com/free/。
第2步:下载源文件
将本章的文件下载到本地计算机上,然后切换到名为serverless-hosting-on-amazon-aws的文件夹。文件夹结构应如代码清单1-45所示。

image.png

第3步:为Elastic Beanstalk创建一个访问账户
登录AWS Web控制台并转至Identity and Access Management(IAM)控制台。一种快速方法是在登录页面的AWS服务搜索框中输入“IAM”。在导航部分选择“Users”,然后单击“Add user”按钮(图1-18)。

image.png

选择一个用户名,在这里我们输入“ebuser”,并选中“Access type: Programmatic access”(图1-19)。

image.png

单击“Next: Permissions”按钮,这将带你进入“Set permissions”页面。单击“Add user to group”菜单按钮,然后单击“Create group”。在当前例子中,创建组“ebadmins”,并为其分配策略“WSElasticBeanstalkFullAccess”,然后单击“Create group”按钮以完成操作(图1-20)。

image.png

单击“Next: review”按钮,然后在下一页上单击“Create user”按钮(图1-21)。

image.png

一旦看到“Success”消息,就意味着你已成功创建ebuser账户。单击“Download .csv”按钮将.csv文件下载到本地计算机。此文件很重要,因为它包含你的密钥和密码。将它存储在本地计算机上的某个位置并记住它,因为当你上传Web应用程序代码以及通过Secure Shell(SSH)登录到你的EB中时你将需要这些信息(我们在本节中不需要SSH,但在后续部分会用到)。
第4步:安装Elastic Beanstalk(EB)
首先创建一个虚拟环境来隔离安装,这不是必需的,但它可以帮助你通过将此环境与计算机的其余部分分离来保持整洁(如果尚未安装它,请参阅前面的“虚拟环境”部分)。参见代码清单1-46。

image.png

安装awsebcli库以在AWS上交互和管理我们的EB服务(代码清单1-47和代码清单1-48)。

image.png

image.png

第5步:EB命令行界面
接下来初始化Elastic Beanstalk界面(代码清单1-49)。

image.png

这将询问你一系列问题,大多数情况下都可以选择默认值。在“Enter Application Name”下,输入“AWSBeanstalkIntroduction”(图1-22)。

image.png

如果这是你第一次在计算机上运行AWS,它将要求你提供凭据。打开创建用户时在计算机上下载的credentials.csv,然后输入所需的两个字段(图1-23)。

image.png

使用Python默认值(需要3.x版本),忽略警告。对SSH说“yes”(图1-24)。

image.png

你可以创建新密钥对,或继续使用默认的现有密钥对。如果创建一个新密钥对,它会将其保存在一个文件夹中并告诉你位置(图1-25)。

image.png

接下来,需要创建你的EB(该名称必须唯一)。此命令将自动压缩文件夹中的数据并将其上传到AWS云(代码清单1-50和代码清单1-51)。这可能需要几分钟,所以请耐心等待。

image.png

image.png

第6步:等待运行
这需要几分钟,如果一切顺利,你应该得到一条成功消息。然后,只需使用“eb open”命令即可实时查看Web应用程序(代码清单1-52)。

image.png

第一次运行应用程序可能需要一些时间,甚至可能会超时。如果超时则再次运行“eb open”命令即可(图1-26)。

image.png

如果结果不是所期望的,请查看日志以获取全部错误消息(代码清单1-53)。

image.png

第7步:别忘了关掉它!
最后,我们需要终止Beanstalk实例,以免产生额外费用。这是一个重要提醒,大多数云服务都不是免费的。它会要求你输入环境名称,在这里的例子中,它是“AWSBeanstalkIntroduction”(代码清单1-54)。

image.png

这需要几分钟时间来关闭网站,你最好在AWS仪表板上仔细检查所有服务确实已被关闭。这很简单,只需通过https://aws.amazon.com/登录你的AWS账户,并确保你的EC2和Elastic Beanstalk账户中没有任何未计划的服务(图1-27)。如果你在每次“terminate”(终止)后看到一个似乎不断恢复的实例,请在EC2“Load Balancers”下检查并终止这些实例,然后再次终止实例。

image.png

1.4.2 结论和附加信息

毫无疑问,AWS是云计算领域的领导者,它可能不是最简单或最便宜的,但很可能有你需要的全部功能。
有关其他信息,请参阅Amazon AWS Docs上标题为“Deploying a Flask Application to AWS Elastic Beanstalk”的帖子:https://docs.aws.amazon.com/elasticbeanstalk/latest/dg/create-deploy-python-flask.html

1.5 在PythonAnywhere上托管应用程序

PythonAnywhere是在互联网上快速构建Python交互式创意和模型的好方法。它高度集成,并被设计为能用于任何Python!它不是传统意义上的无服务器计算,而是一个专用的Python框架,而且不需要信用卡注册,即可快速构建概念验证(图1-28)。

image.png

事实胜于雄辩。这个项目不需要任何代码,因为PythonAnywhere在启动实例时已经默认为“Hello World”示例。

1.5.1 操作步骤

第1步:获取一个PythonAnywhere账户
注册PythonAnywhere.com上的免费账户并登录(需确认你的电子邮件地址)。
第2步:设置Flask Web框架
我们在PythonAnywhere上创建一个Flask Web服务器。这非常容易,在“Web”选项卡下,单击“Add a new web app”按钮。一直使用默认值,直到进入“Select a Python Web framework”,单击“Flask”项,然后单击最新的Python框架(图1-29)。

image.png

你将进入配置页面,单击“Reload your account.pythonanywhere.com”按钮,将加载你的新URL(图1-30)。

image.png

你应该看到一个简单但真实的网页,其中写着“Hello from Flask!”。这真是开箱即用(图1-31)。

image.png

1.5.2 结论和附加信息

PythonAnywhere可能不是100%无服务器计算的云提供商,但它能提供免费的基本服务托管。它易于使用,可以直接从其在线仪表板运行。
有关帮助文档和分步指南,请参阅https://help.pythonanywhere.com/pages/

1.6 本章小结

如果你坚持到了现在,那真是太棒了!我们使用Flask介绍了一个非常简单而独立的Web应用程序,并将其部署在4个不同的公有云上。请注意,将Web应用程序上传到每个云提供商的方法存在一些差异,因为它们会不时地对平台服务进行更新和调整,所以密切关注各个提供商的参考文档是至关重要的。
现在是时候撸起袖子,开始编写一些更有趣、更复杂的Web应用程序了!

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
python+soket实现UDP协议的客户/服务端中文聊天程序
没什么特别的东西,网上烂大街的C/S框架。(基于windows 7 + python 3.4)   为了实现中文聊天,我加入了一点修改: msg.encode('utf-8') # msg 为输入(且将要发送出)的信息 data.decode('utf-8') # data 为接收的信息 这样做的原因是 sendto 函数只能发送ASCII字符,不支持发送中文(在 python3 中,中文默认是unicode编码)。
1131 0
通过搭建wordpress博客来学习云服务器的详细使用方法
云服务器越来越普及,很多企业及个人都纷纷上云,从传统的虚拟主机或者托管服务器上把网站和应用迁移到腾讯云、阿里云、百度云等这些云服务器上。 云服务器相比传统服务器的优势有很多,比如安全性、性价比、稳定性、可用性、便捷性等等各方面,大家可以百度自己了解,我就不在这里多说了。
1785 0
python+soket实现 TCP 协议的客户/服务端中文(自动回复)聊天程序
【吐槽】 网上的代码害死人,看着都写的言之凿凿,可运行就是有问题。 有些爱好代码、喜欢收藏代码的朋友,看到别人的代码就粘贴复制过来。可是起码你也试试运行看啊大哥   【正文】 昨日修改运行了UDP协议的C/S聊天程序,可是TCP协议的怎么都不行。
1147 0
ECS云服务器学习笔记(五)
搭建个人Leannote云笔记本
395 0
1172
文章
2
问答
来源圈子
更多
+ 订阅
文章排行榜
最热
最新
相关电子书
更多
文娱运维技术
立即下载
《SaaS模式云原生数据仓库应用场景实践》
立即下载
《看见新力量:二》电子书
立即下载