开发者学堂课程【Scala 核心编程 - 进阶:241-小黄鸡服务器端完成监听】学习笔记,与课程紧密连接,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/610/detail/9120
241-小黄鸡服务器端完成监听
内容介绍
一、建包前
二、建包
三、服务器监听
一、建包前
1.先写服务器端的主程序进行监听
找到 Akka0705--src--main--com.atguigu.akka 的位置,在其中新建文件包,命名为 yellowChicken
2.创建协议原因
双方互相通过邮箱发消息时,在本地发送的是字符串,但在网络中,字符串不能直接发,所以需要在双方交流的中间创建协议。
一般来讲,网络通讯最简的方式是用样例类来充当协议,因为样例类本身实现了序列化。
3.创建协议内容
需要创建两个协议
一个是客户端发送给服务器端的协议(协议就是样例类的对象)
一个是服务器端发送给客户端的协议(此处的协议也可以叫做信息)。不直接发送字符串的原因是字符串的描述能力较弱,只能发送“hello”或是”abc”。
当发送的信息包含更复杂的信息如年龄、性别等,此时使用字符串发送,解析十分困难。所以发送时,使用本身实现序列化的样例类对象的形式进行发送,更简单。
4、更多说明
当拥有客户端、服务器端和中间的协议三大块的文件时,即可建包。
二、建包
1.服务端建包
先建立一个名为 server 的 New Package ,专门用于写 server 代码
2.客户端建包
再建立一个名为 yellowchicken.client 的 New Package,用于客户端
3.协议建包
最后建立一个名为 common 的 New Package,用于协议(命名为 common 是因为它的通用性,它在使用时,客户端会用到一份,服务器端也会用到一份)
三、服务器监听
1.写入代码
三个文件包都建成后,在 scala 下建立 YellowChickenServer 写入代码
package com.atguigu.akka.yellowchicken.server
class YellowChickenServer extends Actor{
override def receive:Receive={
}
//Receive 为程序框架图中的 receive 方法
//主程序-入口
Object YellowChickenServer extends App{
//创建 ActorSystem
ActorSystem(“??”)
//“??”是写入的名字,将来若客户端或服务器端持有或得到这个名字,至关重要。
若此名字不匹配,则无法找到。在 actor 中, actor 是一种资源
// 类似于 url (统一资源定位,是定义在网络上的唯一资源,地位等价于网络上的图片)
//将“??”写入名字,变成以下代码
val serverActorSystem=ActorSystem(“Server”)
//创建 YellowChickenServer 的 actor 返回 actorRef
serverActorSystem.actorOf(Props[YellowChickenServer],
”
YellowChickenServer
”
)val
//因为 YellowChickenServer 是被动者不需要持有引用,被动者可以由 sender 来获取,主动发起行为的主动者才需要持有对方引用。
所以创建 YellowChickenServer( actor 的名字) 的 actor 示例,同时返回它的一个代理,取名为YellowChickenServer(是 serverActorSystem 的名字)Privateval yellowChickenServerRef:ActorRef=serverActorSystem:ActorRef=serverActorSystem.actorOf
(Props[YellowChickenServer],
”
YellowChickenServer
”
)
//因为无法指定 IP 和端口,是传统的方式,单机版本都在本地交互,但现在已经变成了网络版本,所以这串代码需要改进,因此引入了以下模板
2.引入模板
val host = "127.0.0.1" //服务端 IP 地址
val port = 9999
//创建config对象,指定协议类型,监听的ip和端口
val config = ConfigFac tory. parseString(
s
”””
akka
.
actor.provider="akka.remote . RemoteActorRefProvider"
akka . remote . netty. tcp. hostname=$host
akka. remote . netty . tcp. port=$port
""" .stripMargin)
//服务器本身是有 IP 地址的,此处需要把主机和端口放到一个配置中,用 ConfigFactory 去实现
// Actorsystem 有很多的方法,除了直接给一个名字之外,还有一种配置方式(在此配置方式中,如果是网络形式,可直接放入
),
详见以下
defapply (name:String,config):ActorSystem=apply(name,Option(config),None,None)
//所以将 config 引入(此步骤切记不可少), config 类似于叫做类型安全的含义,typesafe.config 则是保证按照需要的网络形式运行
val serverActorSystem=ActorSystem(“Server”,config),如果没有这段代码,则代表本地,有这段代码,则代表一种网络的监听
3.开始启动
yellowChickenServerRef ! “start”
//先给自己发送一个消息,进行启动。当接收到“start”时,做一个控制,发送“start 小黄鸡客服开始工作了...”此时已经完成了监听任务
Override def recrive:Receive={
Case
“
start
”
=>println(
“
start 小黄鸡客服开始工作了...”)
}
//开始运行,检查这句话是否被输出,屏幕输出“小黄鸡客服开始工作了...”后,检查监听端口9999是否被监听(输入 netstat -anb:more ),在列表中发现999,则证明端口已然启动。即服务器端口监听任务完成。
4.知识拓展
开始工作后,按流程运行,应该将客户端相连,也可以一次写完(出现一次写完的情况极少,例如将代码全都走过)。但一般来讲,作为一个正常的开发流程,代码是一步一步写的。